From 4a26cf0ddbb5396868fd326dac5aa8d93b66ef23 Mon Sep 17 00:00:00 2001 From: Lexi Quinn Date: Fri, 18 Jul 2025 23:14:51 +1000 Subject: [PATCH] oh fuck im gonna have to learn to clean up previous commits --- Assets/Textures/assault_icon.png | Bin 0 -> 304 bytes Assets/Textures/assault_icon.png.import | 34 +++ Assets/Textures/damage_icon.png | Bin 0 -> 218 bytes Assets/Textures/damage_icon.png.import | 34 +++ Assets/Textures/flight_icon.png | Bin 0 -> 194 bytes Assets/Textures/flight_icon.png.import | 34 +++ Assets/Textures/rocket_launcher_icon.png | Bin 0 -> 153 bytes .../Textures/rocket_launcher_icon.png.import | 34 +++ Assets/Textures/utility_icon.png | Bin 0 -> 349 bytes Assets/Textures/utility_icon.png.import | 34 +++ Cards/assault.tres | 9 +- Cards/rocket_launcher.tres | 5 +- Classes/Engineer/class.tres | 8 +- Gun Thing.glb | Bin 0 -> 68252 bytes Gun Thing.glb.import | 44 ++++ PCs/PathEditTool/path_edit_tool.gd | 36 ++-- PCs/PathEditTool/path_edit_tool.tscn | 1 + PCs/hero.gd | 203 +++++++++++++----- PCs/hero.tscn | 92 ++++---- PCs/hud.gd | 4 +- PCs/player_movement.gd | 3 + PCs/weapon_movement.gd | 42 ++++ PCs/weapon_movement.gd.uid | 1 + Scenes/CardPrinter/card_printer.gd | 4 +- Scenes/CardPrinter/card_printer.tscn | 4 +- Scripts/Resources/card.gd | 1 + Scripts/Weapons/hitscan_weapon.gd | 2 +- Scripts/Weapons/weapon.gd | 2 +- Scripts/card_hand.gd | 12 +- Scripts/card_item.gd | 10 +- Scripts/data.gd | 10 +- Scripts/game.gd | 4 +- Scripts/inventory.gd | 4 +- Shaders/tiler.gdshader | 2 +- UI/CardSelectionBox/card_selection_box.gd | 71 ++++++ UI/CardSelectionBox/card_selection_box.gd.uid | 1 + UI/CardSelectionBox/card_selection_box.tscn | 78 +++++++ UI/CardSelectionBox/selected_style_box.tres | 8 + UI/CardSelectionBox/unselected_style_box.tres | 6 + Weapons/Assault/rifle.tscn | 41 ++++ Weapons/Assault/rifle_tex.png | Bin 0 -> 218 bytes Weapons/Assault/rifle_tex.png.import | 35 +++ Weapons/Assault/weapon_material.tres | 13 ++ Worlds/GreenPlanet/Levels/Bridge/mat1.tres | 2 +- Worlds/GreenPlanet/Levels/Bridge/mat2.tres | 6 +- card_model/3d_card.gd | 13 ++ card_model/3d_card.gd.uid | 1 + card_model/3d_card.tscn | 150 +++++++++++++ card_model/card_model.glb | Bin 0 -> 6780 bytes card_model/card_model.glb.import | 48 +++++ left_hand/card_hand_model.glb | Bin 0 -> 79672 bytes left_hand/card_hand_model.glb.import | 44 ++++ left_hand/left_hand_mat.tres | 14 ++ project.godot | 25 +++ 54 files changed, 1066 insertions(+), 163 deletions(-) create mode 100644 Assets/Textures/assault_icon.png create mode 100644 Assets/Textures/assault_icon.png.import create mode 100644 Assets/Textures/damage_icon.png create mode 100644 Assets/Textures/damage_icon.png.import create mode 100644 Assets/Textures/flight_icon.png create mode 100644 Assets/Textures/flight_icon.png.import create mode 100644 Assets/Textures/rocket_launcher_icon.png create mode 100644 Assets/Textures/rocket_launcher_icon.png.import create mode 100644 Assets/Textures/utility_icon.png create mode 100644 Assets/Textures/utility_icon.png.import create mode 100644 Gun Thing.glb create mode 100644 Gun Thing.glb.import create mode 100644 PCs/weapon_movement.gd create mode 100644 PCs/weapon_movement.gd.uid create mode 100644 UI/CardSelectionBox/card_selection_box.gd create mode 100644 UI/CardSelectionBox/card_selection_box.gd.uid create mode 100644 UI/CardSelectionBox/card_selection_box.tscn create mode 100644 UI/CardSelectionBox/selected_style_box.tres create mode 100644 UI/CardSelectionBox/unselected_style_box.tres create mode 100644 Weapons/Assault/rifle.tscn create mode 100644 Weapons/Assault/rifle_tex.png create mode 100644 Weapons/Assault/rifle_tex.png.import create mode 100644 Weapons/Assault/weapon_material.tres create mode 100644 card_model/3d_card.gd create mode 100644 card_model/3d_card.gd.uid create mode 100644 card_model/3d_card.tscn create mode 100644 card_model/card_model.glb create mode 100644 card_model/card_model.glb.import create mode 100644 left_hand/card_hand_model.glb create mode 100644 left_hand/card_hand_model.glb.import create mode 100644 left_hand/left_hand_mat.tres diff --git a/Assets/Textures/assault_icon.png b/Assets/Textures/assault_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..55c6e15e1e8945f48ca20bde791921d2b58ef235 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEk44ofy`glX=O&!0^h` z#WAE}&f8gze9Z;|%$HaF|6f#{*W%^ur1oH@GP}XFy-lHBf`Wn*L*%wJ1f8n>^m*UC zpO!x#o?ghfg<;n9V_R>|b?NkPV7tJSu`TVu-5)>K3eRWYUBG(bP9j^$-}6V*9hfs1 zO~U6eI+sg)?$&$AO@to_FJRolASgJAe?m8Bnc4T5a~K#H7(8A5T-G@yGywo|NqH9l literal 0 HcmV?d00001 diff --git a/Assets/Textures/assault_icon.png.import b/Assets/Textures/assault_icon.png.import new file mode 100644 index 0000000..c0d4762 --- /dev/null +++ b/Assets/Textures/assault_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bpcyxdpog3w85" +path="res://.godot/imported/assault_icon.png-104850883b7010dc9beab69e5d7c5d6d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/assault_icon.png" +dest_files=["res://.godot/imported/assault_icon.png-104850883b7010dc9beab69e5d7c5d6d.ctex"] + +[params] + +compress/mode=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/damage_icon.png b/Assets/Textures/damage_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c8143df42968171114717b430eb736c368c183ff GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>V3^|R z;usRq`Zhe8?|=fw;neT@jeZ+N@-&s|Y-p|fbs#8ysUV-(FKMASHxwRpiEc|ic1 z1*}~SC2aHVwY|4e`eN%achU~O9Zaqd>bOImKWg~Xx8iVg=bd#sv=-0(`!~F_hB1{< W!uvh1kP-s}1B0ilpUXO@geCwi+*daM literal 0 HcmV?d00001 diff --git a/Assets/Textures/damage_icon.png.import b/Assets/Textures/damage_icon.png.import new file mode 100644 index 0000000..594b1fb --- /dev/null +++ b/Assets/Textures/damage_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b165eh481oodf" +path="res://.godot/imported/damage_icon.png-841fec7a42094ebc8d165014acbb76de.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/damage_icon.png" +dest_files=["res://.godot/imported/damage_icon.png-841fec7a42094ebc8d165014acbb76de.ctex"] + +[params] + +compress/mode=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/flight_icon.png b/Assets/Textures/flight_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..81d83e065d0b1710c9efe56373ddb720ff649170 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>V5sqQ zaSVxQeLL+TSAzmii)q#W@OAdQVjByC-w3>8Ry>qb_hjp}mLEm7kEfURv+8SIyj!~E zwcH(d&+AL2EgCJiHLv1)VSVdRL*p!sxeM0vNKEWp_-2800Hc-z>kpX?#d{Ztf7tV> yIZxsA*Nguae37~9@J)Zl*{T)w3#0{{?#LGk=&i^N=wx7EVDNPHb6Mw<&;$U|4ow#T literal 0 HcmV?d00001 diff --git a/Assets/Textures/flight_icon.png.import b/Assets/Textures/flight_icon.png.import new file mode 100644 index 0000000..48ee8b0 --- /dev/null +++ b/Assets/Textures/flight_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1op181s87mu" +path="res://.godot/imported/flight_icon.png-edcd48009886bb4762ba96810d291cf4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/flight_icon.png" +dest_files=["res://.godot/imported/flight_icon.png-edcd48009886bb4762ba96810d291cf4.ctex"] + +[params] + +compress/mode=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/rocket_launcher_icon.png b/Assets/Textures/rocket_launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..07bd12303ceea7fda23382977896733b2204267a GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z!2=| z;uvDl`*xxsAAER|9*)*KNz6Z%NQQl~v&@>uWB+KhH0qi-CcG!PC{xWt~$( F69BkKFx~(F literal 0 HcmV?d00001 diff --git a/Assets/Textures/rocket_launcher_icon.png.import b/Assets/Textures/rocket_launcher_icon.png.import new file mode 100644 index 0000000..764a5b8 --- /dev/null +++ b/Assets/Textures/rocket_launcher_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bfhliqv803dku" +path="res://.godot/imported/rocket_launcher_icon.png-e1b3eb9488c4f56100d84e4b7b0bda92.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/rocket_launcher_icon.png" +dest_files=["res://.godot/imported/rocket_launcher_icon.png-e1b3eb9488c4f56100d84e4b7b0bda92.ctex"] + +[params] + +compress/mode=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/utility_icon.png b/Assets/Textures/utility_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2599d10f687ba674d49b8262faac172d17d16064 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEk44ofy`glX=O&z$otN z;uumf=k2VEe1{b{TuVRxudl3rdq!wu)A7FQxapf_OD{-TnR=%BL$&FV8J*ju>bt^I zKBy}&XE2(aRdkELTzmH1wLh=^_y4#w-HthhLAT-AIcu|B%N7Un?@$6MTKi-E*S+)k z-&(#jc3``}l#vy=e&dD8y9a{!z2`F;HHbM}KK1YCUyV!Y4Ll22FZ`);cRSB^(dX-i zFOpz8Kq{0$=1j9bxL>W7?F2&+zU2-VR&!7KXA`l fTNQ{EXW26y#Je3YGZZs0Ffe$!`njxgN@xNAmt~CO literal 0 HcmV?d00001 diff --git a/Assets/Textures/utility_icon.png.import b/Assets/Textures/utility_icon.png.import new file mode 100644 index 0000000..b90421b --- /dev/null +++ b/Assets/Textures/utility_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://yf3gpagilt8n" +path="res://.godot/imported/utility_icon.png-5890d4351db22cf6722b91511b458919.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Textures/utility_icon.png" +dest_files=["res://.godot/imported/utility_icon.png-5890d4351db22cf6722b91511b458919.ctex"] + +[params] + +compress/mode=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/Cards/assault.tres b/Cards/assault.tres index 0a10aae..5715c1d 100644 --- a/Cards/assault.tres +++ b/Cards/assault.tres @@ -1,10 +1,11 @@ -[gd_resource type="Resource" script_class="Card" load_steps=6 format=3 uid="uid://deer0awg4d18o"] +[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://deer0awg4d18o"] +[ext_resource type="Texture2D" uid="uid://bpcyxdpog3w85" path="res://Assets/Textures/assault_icon.png" id="1_us0mt"] [ext_resource type="Script" uid="uid://d40isem6w5d8" path="res://Scripts/Resources/card.gd" id="1_yqa4b"] -[ext_resource type="PackedScene" uid="uid://2eehfcrsednw" path="res://Weapons/Assault/weapon_assault.tscn" id="3_28y3b"] [ext_resource type="Resource" uid="uid://bdmsiw45xxhiv" path="res://Towers/Assault/tower_stats.tres" id="3_ks0jw"] [ext_resource type="PackedScene" uid="uid://chbmp1ap8jc7" path="res://Towers/Assault/tower_assault.tscn" id="4_5nu32"] [ext_resource type="Resource" uid="uid://smctw4ogm4rx" path="res://Weapons/Assault/weapon_stats.tres" id="4_est7t"] +[ext_resource type="PackedScene" uid="uid://bn3t6sjupdxgi" path="res://Weapons/Assault/rifle.tscn" id="4_m52ff"] [resource] script = ExtResource("1_yqa4b") @@ -12,7 +13,9 @@ duration = 5 rarity = 0 faction = 1 turret_scene = ExtResource("4_5nu32") -weapon_scene = ExtResource("3_28y3b") +weapon_scene = ExtResource("4_m52ff") weapon_stats = ExtResource("4_est7t") tower_stats = ExtResource("3_ks0jw") +tags = Array[int]([0]) display_name = "Assault" +icon = ExtResource("1_us0mt") diff --git a/Cards/rocket_launcher.tres b/Cards/rocket_launcher.tres index 968be0f..7e93594 100644 --- a/Cards/rocket_launcher.tres +++ b/Cards/rocket_launcher.tres @@ -1,6 +1,7 @@ -[gd_resource type="Resource" script_class="Card" load_steps=6 format=3 uid="uid://b37r54q84vqoi"] +[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://b37r54q84vqoi"] [ext_resource type="Script" uid="uid://d40isem6w5d8" path="res://Scripts/Resources/card.gd" id="1_ly0o5"] +[ext_resource type="Texture2D" uid="uid://bfhliqv803dku" path="res://Assets/Textures/rocket_launcher_icon.png" id="1_qabk3"] [ext_resource type="Resource" uid="uid://c65rq455ma8f6" path="res://Towers/RocketLauncher/tower_stats.tres" id="3_06my6"] [ext_resource type="PackedScene" uid="uid://clunpgm4plkar" path="res://Towers/RocketLauncher/rocket_tower.tscn" id="3_73c50"] [ext_resource type="PackedScene" uid="uid://bdp7icdejayvr" path="res://Weapons/RocketLauncher/weapon_rocket_launcher.tscn" id="3_qo5gv"] @@ -15,4 +16,6 @@ turret_scene = ExtResource("3_73c50") weapon_scene = ExtResource("3_qo5gv") weapon_stats = ExtResource("4_cmvfg") tower_stats = ExtResource("3_06my6") +tags = Array[int]([0, 2]) display_name = "Rocket Launcher" +icon = ExtResource("1_qabk3") diff --git a/Classes/Engineer/class.tres b/Classes/Engineer/class.tres index d40fe45..2f347ed 100644 --- a/Classes/Engineer/class.tres +++ b/Classes/Engineer/class.tres @@ -1,11 +1,9 @@ -[gd_resource type="Resource" script_class="HeroClass" load_steps=11 format=3 uid="uid://b5pc3frhx467q"] +[gd_resource type="Resource" script_class="HeroClass" load_steps=9 format=3 uid="uid://b5pc3frhx467q"] [ext_resource type="PackedScene" uid="uid://dq8v5e11rvyi6" path="res://Classes/Engineer/plan.tscn" id="1_2m5d7"] [ext_resource type="Script" uid="uid://d40isem6w5d8" path="res://Scripts/Resources/card.gd" id="1_t4fvj"] [ext_resource type="Resource" uid="uid://deer0awg4d18o" path="res://Cards/assault.tres" id="2_62g46"] -[ext_resource type="Resource" uid="uid://ckm88acryitl4" path="res://Cards/sniper.tres" id="3_eml7q"] -[ext_resource type="Resource" uid="uid://cvto66tp7rrst" path="res://Cards/gatling.tres" id="4_ovvb2"] -[ext_resource type="Resource" uid="uid://cucdevshmdohf" path="res://Cards/overclock_card.tres" id="5_vqkxt"] +[ext_resource type="Resource" uid="uid://b37r54q84vqoi" path="res://Cards/rocket_launcher.tres" id="4_o2u8f"] [ext_resource type="Texture2D" uid="uid://ctkixdue3o7ec" path="res://Classes/Engineer/red_hand.png" id="6_a8dvt"] [ext_resource type="Script" uid="uid://dcwtg2gev3uia" path="res://Scripts/Resources/hero_class.gd" id="7_ftkad"] [ext_resource type="PackedScene" uid="uid://ciagj1hfn4gou" path="res://Classes/Engineer/podium.tscn" id="7_nyup7"] @@ -16,7 +14,7 @@ script = ExtResource("7_ftkad") hero_name = "Engineer" texture = ExtResource("8_0o0bw") hand_texture = ExtResource("6_a8dvt") -deck = Array[ExtResource("1_t4fvj")]([ExtResource("2_62g46"), ExtResource("2_62g46"), ExtResource("2_62g46"), ExtResource("2_62g46"), ExtResource("2_62g46"), ExtResource("4_ovvb2"), ExtResource("4_ovvb2"), ExtResource("4_ovvb2"), ExtResource("5_vqkxt"), ExtResource("5_vqkxt"), ExtResource("3_eml7q")]) +deck = Array[ExtResource("1_t4fvj")]([ExtResource("2_62g46"), ExtResource("2_62g46"), ExtResource("2_62g46"), ExtResource("2_62g46"), ExtResource("2_62g46"), ExtResource("4_o2u8f"), ExtResource("4_o2u8f"), ExtResource("4_o2u8f")]) faction = 1 podium = ExtResource("7_nyup7") card_item = ExtResource("1_2m5d7") diff --git a/Gun Thing.glb b/Gun Thing.glb new file mode 100644 index 0000000000000000000000000000000000000000..b039fcd120610977e6edb3b537f6db37f467ed99 GIT binary patch literal 68252 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 literal 0 HcmV?d00001 diff --git a/Gun Thing.glb.import b/Gun Thing.glb.import new file mode 100644 index 0000000..0034bc0 --- /dev/null +++ b/Gun Thing.glb.import @@ -0,0 +1,44 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ccltaimvldxfu" +path="res://.godot/imported/Gun Thing.glb-346cc6d756ff806bd7662c149c6ed8f0.scn" + +[deps] + +source_file="res://Gun Thing.glb" +dest_files=["res://.godot/imported/Gun Thing.glb-346cc6d756ff806bd7662c149c6ed8f0.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={ +"materials": { +"Material": { +"use_external/enabled": true, +"use_external/path": "uid://bjdi4f801k0xt" +} +} +} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/PCs/PathEditTool/path_edit_tool.gd b/PCs/PathEditTool/path_edit_tool.gd index 82e8828..39950ed 100644 --- a/PCs/PathEditTool/path_edit_tool.gd +++ b/PCs/PathEditTool/path_edit_tool.gd @@ -98,7 +98,7 @@ func process_looking_at_level() -> void: if tower_preview: delete_tower_preview() point = level.flow_field.get_closest_buildable_point(ray_point) - if level.walls.has(point) or !point.buildable or hero.energy < Data.wall_cost: + if level.walls.has(point) or !point.buildable or hero.energy < Data.wall_cost or !hero.building_mode: wall_preview.set_visible(false) valid_point = false clear_previous_point() @@ -132,14 +132,14 @@ func process_looking_at_tower() -> void: ray_collider.set_color(Color.RED) ray_collider.set_float(0.0) if hero.hand.size > 0 and !ray_collider.has_card: - if ray_collider != last_tower_base or hero.hand.item_at(hero.hand_selected_index) != tower_preview_card: + if ray_collider != last_tower_base or hero.selected_card != tower_preview_card: spawn_tower_preview() func spawn_tower_preview() -> void: delete_tower_preview() last_tower_base = ray_collider - var card: Card = hero.hand.item_at(hero.hand_selected_index) + var card: Card = hero.selected_card tower_preview_card = card tower_preview = card.turret_scene.instantiate() as Tower tower_preview.stats = card.tower_stats @@ -178,21 +178,25 @@ func refund_wall(wall: TowerBase) -> void: func put_card_in_tower_base(tower_base: TowerBase) -> void: - var energy_cost: int = int(hero.hand.item_at(hero.hand_selected_index).rarity) + 1 + if hero.hand.size <= 0: + return + var card: Card = hero.selected_card + var energy_cost: int = int(card.rarity) + 1 + energy_cost *= 2 if hero.energy < energy_cost: return - if hero.hand.size > 0: - if tower_base.has_card: - tower_base.remove_card() - var card: Card = hero.hand.remove_at(hero.hand_selected_index) - hero.card_sprites[hero.hand_selected_index].queue_free() - hero.card_sprites.remove_at(hero.hand_selected_index) - #if !hero.hand.contents.has(card): - hero.decrement_selected() - tower_base.add_card(card, multiplayer.get_unique_id()) - hero.discard_pile.add(card) - hero.place_card_audio.play() - hero.energy -= energy_cost + if tower_base.has_card: + tower_base.remove_card() + hero.hand.remove_at(hero.hand.contents.find(card)) + hero.check_removal() + #hero.card_sprites[hero.hand_selected_index].queue_free() + #hero.card_sprites.remove_at(hero.hand_selected_index) + #if !hero.hand.contents.has(card): + #hero.decrement_selected() + tower_base.add_card(card, multiplayer.get_unique_id()) + hero.discard_pile.add(card) + hero.place_card_audio.play() + hero.energy -= energy_cost func set_progress_percent(value: float) -> void: diff --git a/PCs/PathEditTool/path_edit_tool.tscn b/PCs/PathEditTool/path_edit_tool.tscn index 044c77f..18ffe40 100644 --- a/PCs/PathEditTool/path_edit_tool.tscn +++ b/PCs/PathEditTool/path_edit_tool.tscn @@ -15,6 +15,7 @@ target_position = Vector3(0, 0, -20) collision_mask = 25 [node name="WallPreview" parent="." instance=ExtResource("2_pjtpe")] +visible = false [node name="ProgressBar" type="TextureProgressBar" parent="."] anchors_preset = 8 diff --git a/PCs/hero.gd b/PCs/hero.gd index a77a122..8fe8b37 100644 --- a/PCs/hero.gd +++ b/PCs/hero.gd @@ -9,11 +9,11 @@ signal ready_state_changed(state: bool) @export var left_hand_sprite: Sprite3D @export var left_hand: Node3D @export var right_hand: Node3D -@export var right_hand_animator: AnimationPlayer +#@export var right_hand_animator: AnimationPlayer @export var edit_tool: PathEditTool @export var gauntlet_sprite: Sprite3D @export var sprite: EightDirectionSprite3D -@export var hand_sprite: Sprite2D +#@export var hand_sprite: Sprite2D @export var interaction_raycast: RayCast3D @export var draw_pile: Inventory @export var hand: Inventory @@ -25,6 +25,8 @@ signal ready_state_changed(state: bool) @export var sprint_zoom_speed: float = 0.2 @export var player_name_tag: Label @export var weapon_swap_timer: Timer +@export var card3d_scene: PackedScene +@export var card_select_scene: PackedScene @export_subgroup("Audio") @export var ears: AudioListener3D @@ -37,6 +39,9 @@ signal ready_state_changed(state: bool) @export var swap_off_audio: AudioStreamPlayer @export var swap_on_audio: AudioStreamPlayer +var building_mode: bool = true +var selection_boxes: Array[CardSelectionBox] = [] +var unique_cards: Array[Card] = [] var hand_card_scene: PackedScene = preload("res://Scenes/UI/card_hand.tscn") var card_sprites: Array[CardInHand] var game_manager: GameManager @@ -66,6 +71,11 @@ var energy: int = 0 : hud.set_energy_amount(value) get: return energy +var selected_card: Card : + set(_value): + pass + get(): + return unique_cards[hand_selected_index] func set_zoom_factor(value: float) -> void: @@ -74,13 +84,13 @@ func set_zoom_factor(value: float) -> void: func _ready() -> void: if is_multiplayer_authority(): - right_hand_animator.play("weapon_sway") - right_hand_animator.speed_scale = 0 + #right_hand_animator.play("weapon_sway") + #right_hand_animator.speed_scale = 0 ears.make_current() camera.make_current() sprite.queue_free() hand.max_size = 5 - hand_sprite.texture = hero_class.hand_texture + #hand_sprite.texture = hero_class.hand_texture player_name_tag.queue_free() for card: Card in hero_class.deck: draw_pile.add(card) @@ -98,12 +108,12 @@ func _ready() -> void: 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 + #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: @@ -135,20 +145,61 @@ func _process(delta: float) -> void: button.press(self) if interaction_raycast.get_collider() is ItemCard: add_card(interaction_raycast.get_collider().pick_up()) - if Input.is_action_just_pressed("Equip Primary Weapon"): - equip_weapon(0) - if Input.is_action_just_pressed("Equip Secondary Weapon"): - equip_weapon(1) - if Input.is_action_just_pressed("Select Next Card") and hand.size > 1: - increment_selected() - swap_card_audio.play() - if Input.is_action_just_pressed("Select Previous Card") and hand.size > 1: - decrement_selected() - swap_card_audio.play() - 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 building_mode: + 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 Input.is_action_just_pressed("Swap Weapons"): + edit_tool.interact_key_held = false + building_mode = false + $FirstPersonViewport/Head2/LeftHand.visible = true + $HUD/selection_boxes.visible = true + $HUD/PlaceIcon.visible = true + $HUD/SwapIcon.visible = true + else: + if Input.is_action_just_pressed("Primary Fire"): + equip_weapon(0) + if Input.is_action_just_pressed("Secondary Fire"): + equip_weapon(1) + if Input.is_action_just_pressed("Select Next Card") and hand.size > 1: + increment_selected() + swap_card_audio.play() + if Input.is_action_just_pressed("Select Previous Card") and hand.size > 1: + decrement_selected() + swap_card_audio.play() + if Input.is_action_just_pressed("Select 1st Card"): + if unique_cards.size() >= 1: + hand_selected_index = 0 + swap_card_audio.play() + update_selected_box() + if Input.is_action_just_pressed("Select 2nd Card"): + if unique_cards.size() >= 2: + hand_selected_index = 1 + swap_card_audio.play() + update_selected_box() + if Input.is_action_just_pressed("Select 3rd Card"): + if unique_cards.size() >= 3: + hand_selected_index = 2 + swap_card_audio.play() + update_selected_box() + if Input.is_action_just_pressed("Select 4th Card"): + if unique_cards.size() >= 4: + hand_selected_index = 3 + swap_card_audio.play() + update_selected_box() + if Input.is_action_just_pressed("Select 5th Card"): + if unique_cards.size() >= 5: + hand_selected_index = 4 + swap_card_audio.play() + update_selected_box() + if Input.is_action_just_pressed("Swap Weapons"): + building_mode = true + $FirstPersonViewport/Head2/LeftHand.visible = false + $HUD/selection_boxes.visible = false + $HUD/PlaceIcon.visible = false + $HUD/SwapIcon.visible = false + if weapons[equipped_weapon] != null: weapons[equipped_weapon].release_trigger() weapons[equipped_weapon].release_second_trigger() @@ -193,17 +244,19 @@ func _process(delta: float) -> void: func increment_selected() -> void: hand_selected_index += 1 - if hand_selected_index >= hand.size: + if hand_selected_index >= unique_cards.size(): hand_selected_index = 0 + update_selected_box() func decrement_selected() -> void: - if hand.size == 0: + if unique_cards.size() == 0: hand_selected_index = 0 return hand_selected_index -= 1 if hand_selected_index < 0: - hand_selected_index = hand.size - 1 + hand_selected_index = unique_cards.size() - 1 + update_selected_box() func _unhandled_input(event: InputEvent) -> void: @@ -267,6 +320,10 @@ func enter_editing_mode(value: int) -> void: hud.set_wave_count(value + 1) hud.set_energy_visible(false) hud.grow_wave_start_label() + $HUD/selection_boxes.visible = true + $HUD/EnergyLabel.visible = true + $HUD/weapon_duration.visible = true + $HUD/weapon_duration2.visible = true editing_mode = true edit_tool.enabled = true left_hand.visible = true @@ -277,6 +334,10 @@ func enter_editing_mode(value: int) -> void: func exit_editing_mode(value: int) -> void: gauntlet_sprite.visible = false + $HUD/selection_boxes.visible = false + $HUD/EnergyLabel.visible = false + $HUD/weapon_duration.visible = false + $HUD/weapon_duration2.visible = false weapons_active = false hud.set_wave_count(value) var offhand_weapon: Weapon = weapons[0] if equipped_weapon == 1 else weapons[1] @@ -302,28 +363,27 @@ func check_left_hand_valid() -> void: return if hand.size == 0: left_hand_sprite.visible = false - #gauntlet.texture.region = Rect2(64, 0, 64, 64) else: left_hand_sprite.visible = true - #gauntlet.texture.region = Rect2(0, 0, 64, 64) - var selected_card: Card = hand.item_at(hand_selected_index) - for index: int in card_sprites.size(): - if hand_selected_index == index: - var tween: Tween = create_tween() - tween.set_ease(Tween.EASE_OUT) - tween.set_trans(Tween.TRANS_CUBIC) - tween.tween_property(card_sprites[index], "position", Vector2(200.0 * index, -20.0), 0.5) - else: - var tween: Tween = create_tween() - tween.set_ease(Tween.EASE_OUT) - tween.set_trans(Tween.TRANS_CUBIC) - tween.tween_property(card_sprites[index], "position", Vector2(200.0 * index, 80.0), 0.5) - #if index < inventory.contents[selected_card]: - #card_sprites[index].visible = true - #card_sprites[index].set_card(selected_card) - ##card_sprites[index].view_weapon() - #else: - #card_sprites[index].visible = false + update_selected_box() + + +func check_removal() -> void: + var index: int = -1 + for card: Card in unique_cards: + if !hand.contents.has(card): + index = unique_cards.find(card) + if index >= 0: + unique_cards.remove_at(index) + selection_boxes[index].queue_free() + selection_boxes.remove_at(index) + for i: int in selection_boxes.size(): + var card: Card = unique_cards[i] + selection_boxes[i].set_card(card) + selection_boxes[i].set_key(i) + if hand_selected_index == index: + decrement_selected() + update_selected_box() func iterate_duration() -> void: @@ -346,22 +406,46 @@ func draw_to_hand_size() -> void: if draw_pile.size > 0: var card: Card = draw_pile.remove_at(0) hand.add(card) - var display: CardInHand = hand_card_scene.instantiate() + var display: Card3D = card3d_scene.instantiate() display.set_card(card) - $FirstPersonViewport/Head2/LeftHand/SubViewport.add_child(display) - card_sprites.append(display) - var tween: Tween = create_tween() - tween.set_ease(Tween.EASE_OUT) - tween.set_trans(Tween.TRANS_CUBIC) - tween.tween_property(display, "position", Vector2(200.0 * hand.size, 80.0), 0.5) + display.position = Vector3(0.01 * hand.size, 0.0, -0.001 * hand.size) + display.rotation_degrees = Vector3(0.0, 0.0, -10.0 * hand.size) + $FirstPersonViewport/Head2/LeftHand/Cards.add_child(display) + #var tween: Tween = create_tween() + #tween.set_ease(Tween.EASE_OUT) + #tween.set_trans(Tween.TRANS_CUBIC) + #tween.tween_property(display, "position", Vector2(200.0 * hand.size, 80.0), 0.5) else: for x: int in discard_pile.size: draw_pile.add(discard_pile.remove_at(0)) draw_pile.shuffle() + unique_cards = [] + selection_boxes = [] + for card: Card in hand.contents: + if !unique_cards.has(card): + unique_cards.append(card) + for i: int in $HUD/selection_boxes.get_child_count(): + $HUD/selection_boxes.get_child(i).queue_free() + for i: int in unique_cards.size(): + var card: Card = unique_cards[i] + var box: CardSelectionBox = card_select_scene.instantiate() + box.set_card(card) + box.set_key(i) + selection_boxes.append(box) + $HUD/selection_boxes.add_child(box) + hand_selected_index = 0 + update_selected_box() + + +func update_selected_box() -> void: + for box: CardSelectionBox in selection_boxes: + box.deselect() + selection_boxes[hand_selected_index].select() func equip_weapon(slot: int = 0) -> void: var energy_cost: int = int(hand.item_at(hand_selected_index).rarity) + 1 + energy_cost *= 2 if energy < energy_cost: return if weapons[slot] != null: @@ -369,13 +453,13 @@ func equip_weapon(slot: int = 0) -> void: if hand.size > 0: energy -= energy_cost place_card_audio.play() - cards[slot] = hand.remove_at(hand_selected_index) - card_sprites[hand_selected_index].queue_free() - card_sprites.remove_at(hand_selected_index) + cards[slot] = hand.remove_at(hand.contents.find(selected_card)) + #card_sprites[hand_selected_index].queue_free() + #card_sprites.remove_at(hand_selected_index) discard_pile.add(cards[slot]) #TODO: Alternate thing to do with the hand i guess #if !inventory.contents.has(cards[slot]): - decrement_selected() + #decrement_selected() weapons[slot] = cards[slot].weapon_scene.instantiate() weapons[slot].name = str(weapons_spawn_count) weapons[slot].duration = cards[slot].duration @@ -396,6 +480,7 @@ func equip_weapon(slot: int = 0) -> void: weapons[slot].set_hero(self) weapons[slot].visible = false right_hand.add_child(weapons[slot]) + check_removal() check_left_hand_valid() if slot == 0: weapons[slot].energy_spent.connect(hud.new_energy_bar.use_energy) diff --git a/PCs/hero.tscn b/PCs/hero.tscn index 3eeb430..5609b7d 100644 --- a/PCs/hero.tscn +++ b/PCs/hero.tscn @@ -5,14 +5,17 @@ [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/PauseMenu/pause_menu.tscn" id="3_avnsx"] +[ext_resource type="PackedScene" uid="uid://n8ab1cy7ordc" path="res://card_model/3d_card.tscn" id="4_2mqvj"] [ext_resource type="Script" uid="uid://cij76at0nbs1v" path="res://PCs/view_movement.gd" id="4_mhexa"] [ext_resource type="PackedScene" uid="uid://dixtx38u4jhd7" path="res://Scenes/UI/card_hand.tscn" id="4_mwtvp"] +[ext_resource type="PackedScene" uid="uid://gdd1xupf4oxx" path="res://UI/CardSelectionBox/card_selection_box.tscn" id="5_h82f6"] [ext_resource type="PackedScene" uid="uid://dqt1ggtkpkuhs" path="res://PCs/PathEditTool/path_edit_tool.tscn" id="5_jlxb3"] [ext_resource type="Script" uid="uid://do24iuot0j7d7" path="res://Scripts/inventory.gd" id="6_cf5ap"] [ext_resource type="Texture2D" uid="uid://cjqxkraykhxxk" path="res://Classes/Engineer/red.png" id="6_yyp8i"] +[ext_resource type="Script" uid="uid://3wvxl8jo4uis" path="res://PCs/weapon_movement.gd" id="7_14ugt"] [ext_resource type="Script" uid="uid://b6kjrl7ae1mi0" path="res://PCs/hud.gd" id="8_yl6ka"] -[ext_resource type="Texture2D" uid="uid://ctkixdue3o7ec" path="res://Classes/Engineer/red_hand.png" id="9_gxh2h"] [ext_resource type="Script" uid="uid://hy51bq7x0fy8" path="res://Scripts/on_top_camera.gd" id="11_4sdwe"] +[ext_resource type="PackedScene" uid="uid://ckl5tw5rmewhp" path="res://left_hand/card_hand_model.glb" id="11_h82f6"] [ext_resource type="Script" uid="uid://ckkioruqgbs8p" 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"] @@ -49,25 +52,6 @@ radius = 0.3 height = 1.8 -[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("FirstPersonViewport/Head2/LeftHand/SubViewport") @@ -129,7 +113,7 @@ stream_0/stream = ExtResource("36_lsvj8") streams_count = 1 stream_0/stream = ExtResource("37_kv1mg") -[node name="Hero" type="CharacterBody3D" node_paths=PackedStringArray("camera", "gun_camera", "left_hand_sprite", "left_hand", "right_hand", "right_hand_animator", "edit_tool", "gauntlet_sprite", "sprite", "hand_sprite", "interaction_raycast", "draw_pile", "hand", "discard_pile", "gauntlet_cards", "hud", "movement", "player_name_tag", "weapon_swap_timer", "ears", "place_card_audio", "swap_card_audio", "ready_audio", "unready_audio", "fullpower_audio", "zeropower_audio", "swap_off_audio", "swap_on_audio")] +[node name="Hero" type="CharacterBody3D" node_paths=PackedStringArray("camera", "gun_camera", "left_hand_sprite", "left_hand", "right_hand", "edit_tool", "gauntlet_sprite", "sprite", "interaction_raycast", "draw_pile", "hand", "discard_pile", "gauntlet_cards", "hud", "movement", "player_name_tag", "weapon_swap_timer", "ears", "place_card_audio", "swap_card_audio", "ready_audio", "unready_audio", "fullpower_audio", "zeropower_audio", "swap_off_audio", "swap_on_audio")] collision_layer = 2 collision_mask = 37 script = ExtResource("1_pihpe") @@ -139,11 +123,9 @@ gun_camera = NodePath("FirstPersonViewport/Head2") left_hand_sprite = NodePath("FirstPersonViewport/Head2/LeftHand/Sprite3D") left_hand = NodePath("FirstPersonViewport/Head2/LeftHand") right_hand = NodePath("FirstPersonViewport/Head2/RightHand") -right_hand_animator = NodePath("FirstPersonViewport/Head2/RightHand/AnimationPlayer") edit_tool = NodePath("ViewMovement/Head/EditTool") gauntlet_sprite = NodePath("FirstPersonViewport/Head2/RightHand/Gauntlet") sprite = NodePath("EightDirectionSprite") -hand_sprite = NodePath("FirstPersonViewport/Head2/LeftHand/SubViewport/Sprite2D") interaction_raycast = NodePath("ViewMovement/Head/RayCast3D") draw_pile = NodePath("DrawPile") hand = NodePath("Hand") @@ -154,6 +136,8 @@ hud = NodePath("HUD") movement = NodePath("PlayerMovement") player_name_tag = NodePath("NametagViewport/Label") weapon_swap_timer = NodePath("WeaponSwapTimer") +card3d_scene = ExtResource("4_2mqvj") +card_select_scene = ExtResource("5_h82f6") ears = NodePath("AudioListener3D") place_card_audio = NodePath("PlaceCardAudio") swap_card_audio = NodePath("SwapCardAudio") @@ -177,6 +161,8 @@ script = ExtResource("4_mhexa") player = NodePath("..") camera = NodePath("Head") focus_raycast = NodePath("Head/RayCast3D") +enable_strafe_tilt = true +tilt_amount_x = 0.7 [node name="Head" type="Camera3D" parent="ViewMovement"] keep_aspect = 0 @@ -202,37 +188,27 @@ render_target_update_mode = 4 [node name="Head2" type="Camera3D" parent="FirstPersonViewport" node_paths=PackedStringArray("clone_camera")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.62, 0) cull_mask = 2 -environment = SubResource("Environment_ekmug") -projection = 1 script = ExtResource("11_4sdwe") clone_camera = NodePath("../../ViewMovement/Head") -[node name="RightHand" type="Node3D" parent="FirstPersonViewport/Head2"] -transform = Transform3D(0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0.66, -0.255, -0.221557) - -[node name="AnimationPlayer" type="AnimationPlayer" parent="FirstPersonViewport/Head2/RightHand"] -libraries = { -&"": SubResource("AnimationLibrary_2wknc") -} +[node name="RightHand" type="Node3D" parent="FirstPersonViewport/Head2" node_paths=PackedStringArray("player")] +transform = Transform3D(0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0.41, -0.17, -0.495) +script = ExtResource("7_14ugt") +player = NodePath("../../..") +enable_strafe_tilt = true +tilt_amount_x = 12.0 +tilt_amount_y = 3.0 +weapon_rotation_amount = 0.001 [node name="Gauntlet" type="Sprite3D" parent="FirstPersonViewport/Head2/RightHand"] +visible = false layers = 2 texture_filter = 0 texture = ExtResource("3_5myy0") [node name="LeftHand" type="Node3D" parent="FirstPersonViewport/Head2"] -transform = Transform3D(0.235, 0, 0, 0, 0.235, 0, 0, 0, 0.235, -0.665, -0.275, -0.221557) - -[node name="SubViewport" type="SubViewport" parent="FirstPersonViewport/Head2/LeftHand"] -transparent_bg = true -size = Vector2i(1400, 800) -render_target_update_mode = 4 - -[node name="Sprite2D" type="Sprite2D" parent="FirstPersonViewport/Head2/LeftHand/SubViewport"] -texture_filter = 1 -position = Vector2(512, 256) -scale = Vector2(8, 8) -texture = ExtResource("9_gxh2h") +transform = Transform3D(0.235, 0, 0, 0, 0.235, 0, 0, 0, 0.235, -0.645, -0.26, -1.04) +visible = false [node name="SubViewport2" type="SubViewport" parent="FirstPersonViewport/Head2/LeftHand"] transparent_bg = true @@ -268,6 +244,15 @@ sorting_offset = 1.0 texture_filter = 0 texture = SubResource("ViewportTexture_xme80") +[node name="card_hand_model" parent="FirstPersonViewport/Head2/LeftHand" instance=ExtResource("11_h82f6")] +transform = Transform3D(-4.16989, -0.848374, -3.61733e-07, -0.824933, 4.05468, -0.993384, 0.198049, -0.973442, -4.13774, 1.56596, 0.519149, 3.37051) + +[node name="Body_004" parent="FirstPersonViewport/Head2/LeftHand/card_hand_model/Armature/Skeleton3D" index="0"] +layers = 2 + +[node name="Cards" type="Node3D" parent="FirstPersonViewport/Head2/LeftHand"] +transform = Transform3D(4.25532, 0, 0, 0, 4.25532, 0, 0, 0, 4.25532, 2.01277, 0.787234, 3.39179) + [node name="MiniMapViewport" type="SubViewport" parent="."] size = Vector2i(256, 256) render_target_update_mode = 4 @@ -325,7 +310,7 @@ script = ExtResource("6_cf5ap") [node name="DiscardPile" type="Node" parent="."] script = ExtResource("6_cf5ap") -[node name="PlayerMovement" type="Node" parent="." node_paths=PackedStringArray("player", "head")] +[node name="PlayerMovement" type="Node" parent="." node_paths=PackedStringArray("player", "head", "weapon_holder")] script = ExtResource("20_cfhw8") player = NodePath("..") head = NodePath("../ViewMovement") @@ -333,6 +318,7 @@ toggle_sprint = true max_look_down_angle = 80.0 max_look_up_angle = 80.0 enable_jumping = true +weapon_holder = NodePath("../FirstPersonViewport/Head2/RightHand") [node name="HUD" type="CanvasLayer" parent="." node_paths=PackedStringArray("player", "wave_count", "lives_count", "currency_count", "minimap_outline", "minimap", "minimap_cam", "minimap_viewport", "fps_label", "hover_text", "enemy_sprites", "enemy_counts", "wave_start_label", "place_icon", "swap_icon", "place_text", "swap_text", "new_energy_bar", "energy_label", "primary_duration", "secondary_duration")] script = ExtResource("8_yl6ka") @@ -370,6 +356,7 @@ mouse_filter = 2 texture = SubResource("ViewportTexture_mk87g") [node name="PlaceIcon" type="TextureRect" parent="HUD"] +visible = false anchors_preset = 3 anchor_left = 1.0 anchor_top = 1.0 @@ -391,12 +378,13 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 bbcode_enabled = true -text = "#Equip Primary Weapon#" +text = "#Primary Fire#" scroll_active = false horizontal_alignment = 1 vertical_alignment = 1 [node name="SwapIcon" type="TextureRect" parent="HUD"] +visible = false anchors_preset = 3 anchor_left = 1.0 anchor_top = 1.0 @@ -418,7 +406,7 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 bbcode_enabled = true -text = "#Equip Secondary Weapon#" +text = "#Secondary Fire#" scroll_active = false horizontal_alignment = 1 vertical_alignment = 1 @@ -781,6 +769,14 @@ text = "secondary weapon rounds left = 0" horizontal_alignment = 1 vertical_alignment = 1 +[node name="selection_boxes" type="HBoxContainer" parent="HUD"] +visible = false +offset_left = 73.0 +offset_top = 457.0 +offset_right = 753.0 +offset_bottom = 585.0 +alignment = 1 + [node name="WeaponSwapTimer" type="Timer" parent="."] wait_time = 0.4 one_shot = true @@ -821,3 +817,5 @@ stream = ExtResource("41_hussy") bus = &"SFX" [connection signal="timeout" from="WeaponSwapTimer" to="." method="_on_timer_timeout"] + +[editable path="FirstPersonViewport/Head2/LeftHand/card_hand_model"] diff --git a/PCs/hud.gd b/PCs/hud.gd index 94b4f73..b0ab3a4 100644 --- a/PCs/hud.gd +++ b/PCs/hud.gd @@ -72,8 +72,8 @@ func set_energy_visible(value: bool) -> void: func _process(_delta: float) -> void: fps_label.text = "FPS: " + str(Engine.get_frames_per_second()) wave_start_label.text = parse_action_tag("[center]Press #Ready# to start wave") - place_text.text = parse_action_tag("[center]#Equip Primary Weapon#") - swap_text.text = parse_action_tag("[center]#Equip Secondary Weapon#") + place_text.text = parse_action_tag("[center]#Primary Fire#") + swap_text.text = parse_action_tag("[center]#Secondary Fire#") func grow_wave_start_label() -> void: diff --git a/PCs/player_movement.gd b/PCs/player_movement.gd index ed5c5fd..80e1e25 100644 --- a/PCs/player_movement.gd +++ b/PCs/player_movement.gd @@ -64,6 +64,7 @@ var prev_crouch_height: float = 0.0 var new_crouch_height: float = 0.0 var default_camera_height: float = 0.0 var change_crouch: bool = false +@export var weapon_holder: WeaponMovement var head_angle: float = 0.0 var look_sens: float : @@ -225,6 +226,8 @@ func _unhandled_input(event: InputEvent) -> void: head_angle -= event.relative.y * (look_sens / zoom_factor) * (-1 if invert_y else 1) head_angle = clamp(head_angle, deg_to_rad(-max_look_down_angle), deg_to_rad(max_look_up_angle)) head.rotation.x = head_angle + if weapon_holder: + weapon_holder.mouse_input = event.relative elif event is InputEventJoypadMotion: if event.axis == JOY_AXIS_RIGHT_X: look_vector.x = event.axis_value diff --git a/PCs/weapon_movement.gd b/PCs/weapon_movement.gd new file mode 100644 index 0000000..91d4ba0 --- /dev/null +++ b/PCs/weapon_movement.gd @@ -0,0 +1,42 @@ +class_name WeaponMovement +extends Node3D + +@export var player: CharacterBody3D + +@export_category("Strafe Tilting") +@export var enable_strafe_tilt: bool = false +@export var tilt_max_effect_speed: float = 4.317 +@export var tilt_amount_x: float = 0.75 +@export var tilt_amount_y: float = 0.0 + +@export var weapon_rotation_amount: float = 1 +@export var enable_mouse_sway: bool = true +var mouse_input: Vector2 +var invert_weapon_sway: bool = true + + +func _process(delta: float) -> void: + var tilt: Vector3 = Vector3.ZERO + var sway: Vector3 = Vector3.ZERO + if enable_strafe_tilt: + tilt = get_strafe_tilt(player.velocity) + if enable_mouse_sway: + sway = weapon_sway(delta) + rotation = lerp(rotation, tilt + sway, 10 * delta) + + +func get_strafe_tilt(player_velocity: Vector3) -> Vector3: + var side_dot: float = player_velocity.normalized().dot(-global_transform.basis.z) + var front_dot: float = player_velocity.normalized().dot(-global_transform.basis.x) + var tilt_speed_factor: float = player_velocity.length() / tilt_max_effect_speed + var tilt_vector: Vector3 = Vector3.ZERO + tilt_vector.z = deg_to_rad(tilt_amount_x * front_dot * tilt_speed_factor) + tilt_vector.x = deg_to_rad(tilt_amount_y * -side_dot * tilt_speed_factor) + return tilt_vector + + +func weapon_sway(delta: float) -> Vector3: + var vector: Vector3 = Vector3.ZERO + vector.x = mouse_input.y * weapon_rotation_amount * (-1 if invert_weapon_sway else 1) + vector.y = mouse_input.x * weapon_rotation_amount * (-1 if invert_weapon_sway else 1) + return vector diff --git a/PCs/weapon_movement.gd.uid b/PCs/weapon_movement.gd.uid new file mode 100644 index 0000000..4f25c67 --- /dev/null +++ b/PCs/weapon_movement.gd.uid @@ -0,0 +1 @@ +uid://3wvxl8jo4uis diff --git a/Scenes/CardPrinter/card_printer.gd b/Scenes/CardPrinter/card_printer.gd index be11890..719e729 100644 --- a/Scenes/CardPrinter/card_printer.gd +++ b/Scenes/CardPrinter/card_printer.gd @@ -79,8 +79,8 @@ func card_picked_up(card_item: CardItem) -> void: func _on_static_body_3d_button_interacted(_value: int, reply: Hero) -> void: reply_player = reply - if reply.energy >= 3: - reply.energy -= 3 + if reply.energy >= 8: + reply.energy -= 8 else: return button_collider.disabled = true diff --git a/Scenes/CardPrinter/card_printer.tscn b/Scenes/CardPrinter/card_printer.tscn index d2a913c..a641fed 100644 --- a/Scenes/CardPrinter/card_printer.tscn +++ b/Scenes/CardPrinter/card_printer.tscn @@ -29,8 +29,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.847404, 0.610684) collision_layer = 16 collision_mask = 0 script = ExtResource("4_eavi1") -press_cost = 3 -hover_text = "[center]#Interact# draft a card for 3 Energy" +press_cost = 8 +hover_text = "[center]#Interact# draft a card for 8 Energy" [node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D"] transform = Transform3D(1, 0, 0, 0, 0.866025, -0.5, 0, 0.5, 0.866025, -6.55949e-05, 0.349496, -0.579584) diff --git a/Scripts/Resources/card.gd b/Scripts/Resources/card.gd index 6270b31..bf86741 100644 --- a/Scripts/Resources/card.gd +++ b/Scripts/Resources/card.gd @@ -14,3 +14,4 @@ enum Faction { @export var weapon_scene: PackedScene @export var weapon_stats: CardText @export var tower_stats: CardText +@export var tags: Array[Data.CardTags] diff --git a/Scripts/Weapons/hitscan_weapon.gd b/Scripts/Weapons/hitscan_weapon.gd index c473ba2..0026145 100644 --- a/Scripts/Weapons/hitscan_weapon.gd +++ b/Scripts/Weapons/hitscan_weapon.gd @@ -11,7 +11,7 @@ func _ready() -> void: super._ready() attack_range = stats.get_attribute("Range") raycast.target_position = Vector3(0, 0, -attack_range) - range_debug_indicator.radius = attack_range + #range_debug_indicator.radius = attack_range raycast.global_position = hero.camera.global_position diff --git a/Scripts/Weapons/weapon.gd b/Scripts/Weapons/weapon.gd index 6af34b9..aa7cc1f 100644 --- a/Scripts/Weapons/weapon.gd +++ b/Scripts/Weapons/weapon.gd @@ -87,7 +87,7 @@ func release_second_trigger() -> void: func shoot() -> void: - animator.play("shoot") + #animator.play("shoot") audio_player.play() recharging = false recharge_speed = 0.0 diff --git a/Scripts/card_hand.gd b/Scripts/card_hand.gd index e2a2892..a2a1ace 100644 --- a/Scripts/card_hand.gd +++ b/Scripts/card_hand.gd @@ -16,15 +16,15 @@ func set_card(value: Card) -> void: target_label.text = str(Data.TargetType.keys()[stats.tower_stats.target_type]) rarity_sprite.region_rect = Rect2(64 * stats.rarity, 0, 64, 64) if stats.rarity == Data.Rarity.COMMON: - energy_cost.text = "1" - if stats.rarity == Data.Rarity.UNCOMMON: energy_cost.text = "2" - if stats.rarity == Data.Rarity.RARE: - energy_cost.text = "3" - if stats.rarity == Data.Rarity.EPIC: + if stats.rarity == Data.Rarity.UNCOMMON: energy_cost.text = "4" + if stats.rarity == Data.Rarity.RARE: + energy_cost.text = "6" + if stats.rarity == Data.Rarity.EPIC: + energy_cost.text = "8" if stats.rarity == Data.Rarity.LEGENDARY: - energy_cost.text = "5" + energy_cost.text = "10" duration.text = str(value.duration) diff --git a/Scripts/card_item.gd b/Scripts/card_item.gd index 1122ada..05a3b08 100644 --- a/Scripts/card_item.gd +++ b/Scripts/card_item.gd @@ -6,20 +6,14 @@ signal pressed(card_item: CardItem) @export var outline_mesh: MeshInstance3D @export var card_ui: CardInHand var card: Card = null -var rarity_colors: Array[Color] = [ - Color8(255, 255, 255), - Color8(50, 204, 36), - Color8(36, 59, 204), - Color8(181, 36, 204), - Color8(225, 112, 30) -] + func set_card(new_card: Card) -> void: card = new_card card_ui.set_card(card) card_ui.view_tower() - outline_mesh.get_surface_override_material(0).albedo_color = rarity_colors[card.rarity] + outline_mesh.get_surface_override_material(0).albedo_color = Data.rarity_colors[card.rarity] #print(rarity_colors[card.rarity]) diff --git a/Scripts/data.gd b/Scripts/data.gd index 3221f0f..d263b37 100644 --- a/Scripts/data.gd +++ b/Scripts/data.gd @@ -17,6 +17,7 @@ enum EnergyType {UNDEFINED = 0, DISCRETE = 1, CONTINUOUS = 2} enum TargetType {UNDEFINED = 0, LAND = 1, AIR = 2, BOTH = 3} enum EnemyType {UNDEFINED = 0, LAND = 1, AIR = 2} enum Rarity {COMMON = 0, UNCOMMON = 1, RARE = 2, EPIC = 3, LEGENDARY = 4} +enum CardTags {DAMAGE = 0, UTILITY = 1, TARGETS_FLYING = 2} static var starting_cash: int = 10 static var wall_cost: int = 1 @@ -26,8 +27,15 @@ static var rarity_weights: Dictionary = { "UNCOMMON" = 30, "RARE" = 10, "EPIC" = 4, - "LEGENDARY" = 1 + "LEGENDARY" = 1, } +static var rarity_colors: Array[Color] = [ + Color8(255, 255, 255), + Color8(50, 204, 36), + Color8(36, 59, 204), + Color8(181, 36, 204), + Color8(225, 112, 30), +] ## Recursively searches a folder for any Card resources and loads them diff --git a/Scripts/game.gd b/Scripts/game.gd index e970260..eb8ac80 100644 --- a/Scripts/game.gd +++ b/Scripts/game.gd @@ -248,7 +248,7 @@ func end_wave() -> void: for peer_id: int in connected_players_nodes: var player: Hero = connected_players_nodes[peer_id] as Hero player.currency += ceili(pot / connected_players_nodes.size()) - player.energy = 8 + player.energy = 12 player.iterate_duration() player.draw_to_hand_size() player.unready_self() @@ -318,7 +318,7 @@ func start() -> void: spawn_players() for peer_id: int in connected_players_nodes: connected_players_nodes[peer_id].currency = ceili(float(Data.starting_cash) / float(connected_players_nodes.size())) - connected_players_nodes[peer_id].energy = 8 + connected_players_nodes[peer_id].energy = 12 connected_players_nodes[peer_id].draw_pile.shuffle() connected_players_nodes[peer_id].draw_to_hand_size() diff --git a/Scripts/inventory.gd b/Scripts/inventory.gd index 3ea507a..9d3e026 100644 --- a/Scripts/inventory.gd +++ b/Scripts/inventory.gd @@ -24,8 +24,8 @@ func add(item: Item) -> bool: func item_at(index: int) -> Item: - #if size == 0: - #return null + if size == 0: + return null var item: Item = contents[index] return item diff --git a/Shaders/tiler.gdshader b/Shaders/tiler.gdshader index 3e7f620..26087cf 100644 --- a/Shaders/tiler.gdshader +++ b/Shaders/tiler.gdshader @@ -19,7 +19,7 @@ void fragment() { offset_uv.x += offset; - vec2 scaled_uv = vec2(fract(offset_uv.x * repeat_x), + vec2 scaled_uv = vec2(fract(offset_uv.x * repeat_x), fract(offset_uv.y * repeat_y)); vec2 texelSize = vec2(1.0) / vec2(textureSize(texture_to_scroll, 0)); diff --git a/UI/CardSelectionBox/card_selection_box.gd b/UI/CardSelectionBox/card_selection_box.gd new file mode 100644 index 0000000..c855b91 --- /dev/null +++ b/UI/CardSelectionBox/card_selection_box.gd @@ -0,0 +1,71 @@ +class_name CardSelectionBox +extends Control + +@export var icon: TextureRect +@export var tags: VBoxContainer +@export var cost_label: Label +@export var lifetime_label: Label +@export var unselected_style_box: StyleBoxFlat +@export var selected_style_box: StyleBoxFlat + + +func set_card(card: Card) -> void: + icon.texture = card.icon + cost_label.text = str(card.rarity + 1) + lifetime_label.text = str(card.duration) + for i: int in tags.get_child_count(): + tags.get_child(i).queue_free() + for tag: Data.CardTags in card.tags: + var tag_icon: TextureRect = icon.duplicate() + if tag == Data.CardTags.DAMAGE: + tag_icon.texture = load("res://Assets/Textures/damage_icon.png") + if tag == Data.CardTags.UTILITY: + tag_icon.texture = load("res://Assets/Textures/utility_icon.png") + if tag == Data.CardTags.TARGETS_FLYING: + tag_icon.modulate = Color.FIREBRICK + tag_icon.texture = load("res://Assets/Textures/flight_icon.png") + tags.add_child(tag_icon) + + +func set_key(slot: int) -> void: + match(slot): + 0: + $Label.text = parse_action_tag("#Select 1st Card#") + 1: + $Label.text = parse_action_tag("#Select 2nd Card#") + 2: + $Label.text = parse_action_tag("#Select 3rd Card#") + 3: + $Label.text = parse_action_tag("#Select 4th Card#") + 44: + $Label.text = parse_action_tag("#Select 5th Card#") + + +func parse_action_tag(text: String) -> String: + var string_array: PackedStringArray = text.split("#") + var output: Array[String] = [] + if string_array.size() > 1: + for i: int in InputMap.action_get_events(string_array[1]).size(): + var event: InputEvent = InputMap.action_get_events(string_array[1])[i] + if InputMap.action_get_events(string_array[1]).size() > 1: + var last: bool = true if i == InputMap.action_get_events(string_array[1]).size() - 1 else false + var first: bool = true if i == 0 else false + if last: + output.append(" or ") + elif !first: + output.append(", ") + if event is InputEventKey: + output.append("[img=top,50]%s[/img]" % KeyIconMap.keys[str(event.physical_keycode)]) + if event is InputEventMouseButton: + output.append("[img=top,50]%s[/img]" % KeyIconMap.mouse_buttons[str(event.button_index)]) + string_array[1] = "".join(output) + text = "".join(string_array) + return text + + +func select() -> void: + $PanelContainer.add_theme_stylebox_override("panel", selected_style_box) + + +func deselect() -> void: + $PanelContainer.add_theme_stylebox_override("panel", unselected_style_box) diff --git a/UI/CardSelectionBox/card_selection_box.gd.uid b/UI/CardSelectionBox/card_selection_box.gd.uid new file mode 100644 index 0000000..5ad1e0c --- /dev/null +++ b/UI/CardSelectionBox/card_selection_box.gd.uid @@ -0,0 +1 @@ +uid://87h0a76hdx4b diff --git a/UI/CardSelectionBox/card_selection_box.tscn b/UI/CardSelectionBox/card_selection_box.tscn new file mode 100644 index 0000000..3017f64 --- /dev/null +++ b/UI/CardSelectionBox/card_selection_box.tscn @@ -0,0 +1,78 @@ +[gd_scene load_steps=6 format=3 uid="uid://gdd1xupf4oxx"] + +[ext_resource type="Texture2D" uid="uid://b165eh481oodf" path="res://Assets/Textures/damage_icon.png" id="1_k8442"] +[ext_resource type="Script" uid="uid://87h0a76hdx4b" path="res://UI/CardSelectionBox/card_selection_box.gd" id="1_m0g3h"] +[ext_resource type="StyleBox" uid="uid://c4ye5r2xdsocm" path="res://UI/CardSelectionBox/unselected_style_box.tres" id="2_0817q"] +[ext_resource type="StyleBox" uid="uid://csbgndc6vfayf" path="res://UI/CardSelectionBox/selected_style_box.tres" id="2_ek0dh"] +[ext_resource type="Texture2D" uid="uid://bpcyxdpog3w85" path="res://Assets/Textures/assault_icon.png" id="2_m0g3h"] + +[node name="Control" type="Control" node_paths=PackedStringArray("icon", "tags", "cost_label", "lifetime_label")] +custom_minimum_size = Vector2(170, 0) +layout_mode = 3 +anchors_preset = 0 +script = ExtResource("1_m0g3h") +icon = NodePath("PanelContainer/HBoxContainer/Icon") +tags = NodePath("PanelContainer/HBoxContainer/MarginContainer/Tags") +cost_label = NodePath("PanelContainer/HBoxContainer/Stats/Cost") +lifetime_label = NodePath("PanelContainer/HBoxContainer/Stats/Lifetime") +unselected_style_box = ExtResource("2_0817q") +selected_style_box = ExtResource("2_ek0dh") + +[node name="PanelContainer" type="PanelContainer" parent="."] +layout_mode = 2 +offset_right = 152.0 +offset_bottom = 124.0 +theme_override_styles/panel = ExtResource("2_ek0dh") + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_bottom = 10 + +[node name="Tags" type="VBoxContainer" parent="PanelContainer/HBoxContainer/MarginContainer"] +layout_mode = 2 + +[node name="Icon2" type="TextureRect" parent="PanelContainer/HBoxContainer/MarginContainer/Tags"] +layout_mode = 2 +size_flags_horizontal = 3 +texture = ExtResource("1_k8442") +stretch_mode = 5 + +[node name="Icon" type="TextureRect" parent="PanelContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +texture = ExtResource("2_m0g3h") +stretch_mode = 5 + +[node name="Stats" type="VBoxContainer" parent="PanelContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Cost" type="Label" parent="PanelContainer/HBoxContainer/Stats"] +layout_mode = 2 +size_flags_vertical = 7 +text = "3" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Lifetime" type="Label" parent="PanelContainer/HBoxContainer/Stats"] +layout_mode = 2 +size_flags_vertical = 7 +text = "6" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Label" type="RichTextLabel" parent="."] +layout_mode = 1 +offset_left = -25.0 +offset_top = 100.0 +offset_right = 25.0 +offset_bottom = 150.0 +bbcode_enabled = true +text = "[img=top,50]/home/lexi/godot/multiplayer_tower_defense/UI/Keybinding/XeluController&KeyPrompts/Keyboard & Mouse/Light/1_Key_Light.png[/img]" +fit_content = true +vertical_alignment = 2 diff --git a/UI/CardSelectionBox/selected_style_box.tres b/UI/CardSelectionBox/selected_style_box.tres new file mode 100644 index 0000000..190b603 --- /dev/null +++ b/UI/CardSelectionBox/selected_style_box.tres @@ -0,0 +1,8 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://csbgndc6vfayf"] + +[resource] +content_margin_left = 8.0 +content_margin_top = 0.0 +content_margin_right = 8.0 +content_margin_bottom = 0.0 +bg_color = Color(0.430763, 0.633388, 0.725502, 1) diff --git a/UI/CardSelectionBox/unselected_style_box.tres b/UI/CardSelectionBox/unselected_style_box.tres new file mode 100644 index 0000000..ff3bb5b --- /dev/null +++ b/UI/CardSelectionBox/unselected_style_box.tres @@ -0,0 +1,6 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://c4ye5r2xdsocm"] + +[resource] +content_margin_left = 8.0 +content_margin_right = 8.0 +bg_color = Color(0.292, 0.292, 0.292, 0.89) diff --git a/Weapons/Assault/rifle.tscn b/Weapons/Assault/rifle.tscn new file mode 100644 index 0000000..6747b6d --- /dev/null +++ b/Weapons/Assault/rifle.tscn @@ -0,0 +1,41 @@ +[gd_scene load_steps=6 format=3 uid="uid://bn3t6sjupdxgi"] + +[ext_resource type="Script" uid="uid://bp3o5klntwmhd" path="res://Scripts/Weapons/hitscan_weapon.gd" id="1_yvp43"] +[ext_resource type="Resource" uid="uid://smctw4ogm4rx" path="res://Weapons/Assault/weapon_stats.tres" id="2_2k4c7"] +[ext_resource type="AudioStream" uid="uid://dknygn5eyuhxt" path="res://Audio/shot1.wav" id="2_5wfsb"] +[ext_resource type="PackedScene" uid="uid://ccltaimvldxfu" path="res://Gun Thing.glb" id="3_2k4c7"] + +[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_1hdrg"] +random_pitch = 1.1 +streams_count = 1 +stream_0/stream = ExtResource("2_5wfsb") + +[node name="Rifle" type="Node3D" node_paths=PackedStringArray("raycast", "audio_player", "recharge_timer")] +script = ExtResource("1_yvp43") +raycast = NodePath("RayCast3D") +stats = ExtResource("2_2k4c7") +audio_player = NodePath("AudioStreamPlayer3D") +recharge_timer = NodePath("Timer") +metadata/_custom_type_script = "uid://bp3o5klntwmhd" + +[node name="RayCast3D" type="RayCast3D" parent="."] +target_position = Vector3(0, 0, -1) +collision_mask = 4 + +[node name="Timer" type="Timer" parent="."] +wait_time = 4.0 +one_shot = true + +[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="."] +stream = SubResource("AudioStreamRandomizer_1hdrg") +bus = &"SFX" + +[node name="Gun Thing" parent="." instance=ExtResource("3_2k4c7")] +transform = Transform3D(-0.175, 0, -2.64243e-08, 0, 0.175, 0, 2.64243e-08, 0, -0.175, 0, 0.156021, 0) + +[node name="Cube" parent="Gun Thing" index="0"] +layers = 2 + +[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"] + +[editable path="Gun Thing"] diff --git a/Weapons/Assault/rifle_tex.png b/Weapons/Assault/rifle_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..b235e5641ae15a3e33f54721f9430946d1c80013 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE@VRjJynr0xX6H_IC?&ahffA-*EOz{`oVp58t=k|2IF6f%S;EgM!?F zpa!N#+zJBx2mA#XSs*M?2ZqKUOdLm;3s?ml6!tMNePoDXWD)4lZ*Z_-2xlNcnGIh! XbH@Ki5&sw%7#KWV{an^LB{Ts5u#Y^j literal 0 HcmV?d00001 diff --git a/Weapons/Assault/rifle_tex.png.import b/Weapons/Assault/rifle_tex.png.import new file mode 100644 index 0000000..8ce0fd3 --- /dev/null +++ b/Weapons/Assault/rifle_tex.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://u8p3xcl3gvie" +path.s3tc="res://.godot/imported/rifle_tex.png-066373a8f602fd3a3436ea7b29f3f62c.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Weapons/Assault/rifle_tex.png" +dest_files=["res://.godot/imported/rifle_tex.png-066373a8f602fd3a3436ea7b29f3f62c.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/Weapons/Assault/weapon_material.tres b/Weapons/Assault/weapon_material.tres new file mode 100644 index 0000000..c3006bb --- /dev/null +++ b/Weapons/Assault/weapon_material.tres @@ -0,0 +1,13 @@ +[gd_resource type="ShaderMaterial" load_steps=3 format=3 uid="uid://bjdi4f801k0xt"] + +[ext_resource type="Shader" uid="uid://c5bffujq0l70k" path="res://Shaders/jitter.gdshader" id="1_r6w0r"] +[ext_resource type="Texture2D" uid="uid://u8p3xcl3gvie" path="res://Weapons/Assault/rifle_tex.png" id="2_kbuty"] + +[resource] +render_priority = 0 +shader = ExtResource("1_r6w0r") +shader_parameter/affine_mapping = true +shader_parameter/albedo = ExtResource("2_kbuty") +shader_parameter/alpha_scissor = 0.5 +shader_parameter/jitter = 0.25 +shader_parameter/resolution = Vector2i(320, 240) diff --git a/Worlds/GreenPlanet/Levels/Bridge/mat1.tres b/Worlds/GreenPlanet/Levels/Bridge/mat1.tres index 806cc30..92cb779 100644 --- a/Worlds/GreenPlanet/Levels/Bridge/mat1.tres +++ b/Worlds/GreenPlanet/Levels/Bridge/mat1.tres @@ -18,7 +18,7 @@ rim_tint = 1.0 clearcoat = 0.0 clearcoat_roughness = 1.0 detail_blend_mode = 3 -uv1_scale = Vector3(200, 200, 200) +uv1_scale = Vector3(4, 4, 4) texture_filter = 0 grow_amount = -5.818 distance_fade_min_distance = 0.1 diff --git a/Worlds/GreenPlanet/Levels/Bridge/mat2.tres b/Worlds/GreenPlanet/Levels/Bridge/mat2.tres index 3ab1e13..c2b5f42 100644 --- a/Worlds/GreenPlanet/Levels/Bridge/mat2.tres +++ b/Worlds/GreenPlanet/Levels/Bridge/mat2.tres @@ -3,6 +3,8 @@ [sub_resource type="FastNoiseLite" id="FastNoiseLite_mrvo6"] [sub_resource type="NoiseTexture2D" id="NoiseTexture2D_ah5r4"] +width = 256 +height = 256 seamless = true as_normal_map = true noise = SubResource("FastNoiseLite_mrvo6") @@ -10,7 +12,5 @@ noise = SubResource("FastNoiseLite_mrvo6") [resource] albedo_color = Color(0.207653, 0.448041, 0.223187, 1) normal_enabled = true -normal_scale = 3.91 normal_texture = SubResource("NoiseTexture2D_ah5r4") -uv1_scale = Vector3(97.955, 97.955, 97.955) -texture_filter = 0 +texture_filter = 2 diff --git a/card_model/3d_card.gd b/card_model/3d_card.gd new file mode 100644 index 0000000..d42e383 --- /dev/null +++ b/card_model/3d_card.gd @@ -0,0 +1,13 @@ +class_name Card3D +extends Node3D + +@export var card_in_hand: CardInHand +@export var mesh: MeshInstance3D + + +func set_card(card: Card) -> void: + card_in_hand.set_card(card) + card_in_hand.view_tower() + var material: ShaderMaterial = mesh.get_surface_override_material(1) as ShaderMaterial + var gradient_tex: GradientTexture1D = material.get_shader_parameter("albedo") as GradientTexture1D + gradient_tex.gradient.colors[0] = Data.rarity_colors[card.rarity] diff --git a/card_model/3d_card.gd.uid b/card_model/3d_card.gd.uid new file mode 100644 index 0000000..03196c9 --- /dev/null +++ b/card_model/3d_card.gd.uid @@ -0,0 +1 @@ +uid://cr6hn1pbu35o1 diff --git a/card_model/3d_card.tscn b/card_model/3d_card.tscn new file mode 100644 index 0000000..3f2b8c4 --- /dev/null +++ b/card_model/3d_card.tscn @@ -0,0 +1,150 @@ +[gd_scene load_steps=14 format=4 uid="uid://n8ab1cy7ordc"] + +[ext_resource type="Script" uid="uid://cr6hn1pbu35o1" path="res://card_model/3d_card.gd" id="1_o6jcx"] +[ext_resource type="Shader" uid="uid://c5bffujq0l70k" path="res://Shaders/jitter.gdshader" id="2_o6jcx"] +[ext_resource type="PackedScene" uid="uid://dixtx38u4jhd7" path="res://Scenes/UI/card_hand.tscn" id="3_bnh6n"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0gfbg"] +resource_name = "Face" +cull_mode = 2 +albedo_color = Color(0.906332, 0.906332, 0.906332, 1) +roughness = 0.5 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_bdeaa"] +render_priority = 0 +shader = ExtResource("2_o6jcx") +shader_parameter/affine_mapping = true +shader_parameter/alpha_scissor = 0.5 +shader_parameter/jitter = 0.25 +shader_parameter/resolution = Vector2i(320, 240) + +[sub_resource type="ArrayMesh" id="ArrayMesh_0gfbg"] +_surfaces = [{ +"aabb": AABB(-0.0430221, -0.057516, -0.0023732, 0.0860442, 0.115032, 0.00474638), +"format": 34896613377, +"index_count": 12, +"index_data": PackedByteArray("AAABAAIAAAADAAEABAAFAAYABAAHAAUA"), +"name": "Face", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 8, +"vertex_data": PackedByteArray("AAD/////AAD//wAA//8AAAAAAAD//wAA////////AAD/////AAAAAAAAAAAAAAAA//8AAAAAAAAAAP//AAAAAA==") +}, { +"aabb": AABB(-0.0481252, -0.063314, -0.0023732, 0.0962504, 0.126628, 0.00474638), +"format": 34359742465, +"index_count": 216, +"index_data": PackedByteArray("AAABAAIAAwAAAAIAAAAEAAEABQAEAAAAAwAFAAAABQAGAAQAAwAHAAUABwAGAAUACAAEAAYACAABAAQABwAJAAYACAAGAAkACgAHAAMACgAJAAcACwABAAgACQAMAAgACgANAAkACQANAAwACgADAA4ACgAPAA0ADAANAA8ADgAQAAoACgAQAA8ADAAPABEAEAARAA8ADAARABIAEAATABEADgATABAAEwASABEADgAUABMAEwAUABIAFQAUAA4AFgAMABIAFwASABQAFQAXABQAFwAYABIAFgASABgAGQAYABcAFgAYABkAGQAXABoAFQAaABcAFgAZABsAGwAZABoAFgAbABwAGwAaAB0AFQAdABoAHAAbAB0AFQAeAB0AHAAdAB4AFQAfAB4AHAAeAB8ACwAWABwAFQAgAB8AHAAfACEACwAcACEAIgAhAB8ACwAhACIAIgAfACMAIAAjAB8ACwAiACQAJAAiACMACwAkACUACwAlAAEAJAAjACYAIAAmACMAJQAkACYAJwABACUAJQAmACcAIAAnACYAJwACAAEAIAACACcAIAADAAIA"), +"name": "Border", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 40, +"vertex_data": PackedByteArray("amJCvRrmdT2bhxu76x5FvaR2aD2Ehxs76x5FvaR2aD2bhxu79DcwvdiVaz2bhxu7amJCvRrmdT2Ehxs7mug6vd67fz2bhxu7mug6vd67fz2Ehxs7SrIwvbmqgT2bhxu79DcwvdiVaz2Ehxs7SrIwvbmqgT2Ehxs7SrIwPbmqgT2bhxu79Dcwvd6Va72Ehxs79DcwPdiVaz2Ehxs7SrIwPbmqgT2Ehxs79DcwPdiVaz2bhxu7mug6Pd67fz2Ehxs7mug6Pd67fz2bhxu7amJCPRrmdT2Ehxs76x5FPaR2aD2Ehxs7amJCPRrmdT2bhxu76x5FPaR2aD2bhxu79DcwPd6Va72bhxu79DcwPd6Va72Ehxs76x5FPap2aL2bhxu76x5FPap2aL2Ehxs7amJCPR7mdb2Ehxs7amJCPR7mdb2bhxu7mug6PeS7f72Ehxs7SrIwPcKqgb2Ehxs7mug6PeS7f72bhxu7SrIwPcKqgb2bhxu7SrIwvcKqgb2bhxu79Dcwvd6Va72bhxu7SrIwvcKqgb2Ehxs7mug6veS7f72Ehxs7mug6veS7f72bhxu7amJCvR7mdb2Ehxs76x5Fvap2aL2Ehxs7amJCvR7mdb2bhxu76x5Fvap2aL2bhxu7") +}] +blend_shape_mode = 0 + +[sub_resource type="ArrayMesh" id="ArrayMesh_gxum5"] +resource_name = "card_model_Cube_001" +_surfaces = [{ +"aabb": AABB(-0.0430221, -0.057516, -0.0023732, 0.0860442, 0.115032, 0.00474638), +"format": 34896613377, +"index_count": 12, +"index_data": PackedByteArray("AAABAAIAAAADAAEABAAFAAYABAAHAAUA"), +"name": "Face", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 8, +"vertex_data": PackedByteArray("AAD/////AAD//wAA//8AAAAAAAD//wAA////////AAD/////AAAAAAAAAAAAAAAA//8AAAAAAAAAAP//AAAAAA==") +}, { +"aabb": AABB(-0.0481252, -0.063314, -0.0023732, 0.0962504, 0.126628, 0.00474638), +"format": 34359742465, +"index_count": 216, +"index_data": PackedByteArray("AAABAAIAAwAAAAIAAAAEAAEABQAEAAAAAwAFAAAABQAGAAQAAwAHAAUABwAGAAUACAAEAAYACAABAAQABwAJAAYACAAGAAkACgAHAAMACgAJAAcACwABAAgACQAMAAgACgANAAkACQANAAwACgADAA4ACgAPAA0ADAANAA8ADgAQAAoACgAQAA8ADAAPABEAEAARAA8ADAARABIAEAATABEADgATABAAEwASABEADgAUABMAEwAUABIAFQAUAA4AFgAMABIAFwASABQAFQAXABQAFwAYABIAFgASABgAGQAYABcAFgAYABkAGQAXABoAFQAaABcAFgAZABsAGwAZABoAFgAbABwAGwAaAB0AFQAdABoAHAAbAB0AFQAeAB0AHAAdAB4AFQAfAB4AHAAeAB8ACwAWABwAFQAgAB8AHAAfACEACwAcACEAIgAhAB8ACwAhACIAIgAfACMAIAAjAB8ACwAiACQAJAAiACMACwAkACUACwAlAAEAJAAjACYAIAAmACMAJQAkACYAJwABACUAJQAmACcAIAAnACYAJwACAAEAIAACACcAIAADAAIA"), +"name": "Border", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 40, +"vertex_data": PackedByteArray("amJCvRrmdT2bhxu76x5FvaR2aD2Ehxs76x5FvaR2aD2bhxu79DcwvdiVaz2bhxu7amJCvRrmdT2Ehxs7mug6vd67fz2bhxu7mug6vd67fz2Ehxs7SrIwvbmqgT2bhxu79DcwvdiVaz2Ehxs7SrIwvbmqgT2Ehxs7SrIwPbmqgT2bhxu79Dcwvd6Va72Ehxs79DcwPdiVaz2Ehxs7SrIwPbmqgT2Ehxs79DcwPdiVaz2bhxu7mug6Pd67fz2Ehxs7mug6Pd67fz2bhxu7amJCPRrmdT2Ehxs76x5FPaR2aD2Ehxs7amJCPRrmdT2bhxu76x5FPaR2aD2bhxu79DcwPd6Va72bhxu79DcwPd6Va72Ehxs76x5FPap2aL2bhxu76x5FPap2aL2Ehxs7amJCPR7mdb2Ehxs7amJCPR7mdb2bhxu7mug6PeS7f72Ehxs7SrIwPcKqgb2Ehxs7mug6PeS7f72bhxu7SrIwPcKqgb2bhxu7SrIwvcKqgb2bhxu79Dcwvd6Va72bhxu7SrIwvcKqgb2Ehxs7mug6veS7f72Ehxs7mug6veS7f72bhxu7amJCvR7mdb2Ehxs76x5Fvap2aL2Ehxs7amJCvR7mdb2bhxu76x5Fvap2aL2bhxu7") +}] +blend_shape_mode = 0 +shadow_mesh = SubResource("ArrayMesh_0gfbg") + +[sub_resource type="ArrayMesh" id="ArrayMesh_4sds6"] +resource_name = "card_model_Cube_001" +_surfaces = [{ +"aabb": AABB(-0.0430221, -0.057516, -0.0023732, 0.0860442, 0.115032, 0.00474638), +"attribute_data": PackedByteArray("AAAAAP////8AAP////8AAAAAAAD/////AAD/////AAA="), +"format": 34896613399, +"index_count": 12, +"index_data": PackedByteArray("AAABAAIAAAADAAEABAAFAAYABAAHAAUA"), +"material": SubResource("StandardMaterial3D_0gfbg"), +"name": "Face", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 8, +"vertex_data": PackedByteArray("AAD/////AID//wAA//8AgAAAAAD//wCA////////AID/////AAD//wAAAAAAAP////8AAAAA//8AAP//AAD///9/////f////3////9/////f////3////9/////f///") +}, { +"aabb": AABB(-0.0481252, -0.063314, -0.0023732, 0.0962504, 0.126628, 0.00474638), +"attribute_data": PackedByteArray("mVcePwAAgD80rxw/AACAPzSvHD8AAIA/mVcePwAAgD+ZocY+AACAPzSvHD8AAIA/NK8cPwAAgD+ZocY+AACAP5mhBj4AAIA+MUMNPgAAgD6ZoQY+AACAPjFDDT4AAIA+AAAAPgAAgD6ZoQY+AACAPgAAAD4AAIA+maEGPgAAgD4AACA/AACAP5lXHj8AAIA/mVcePwAAgD8AACA/AACAPzSvXD8AAIA+AABgPwAAgD4AAGA/AACAPjSvXD8AAIA+maHGPgAAgD8AAMA+AACAP5mhxj4AAIA/AADAPgAAgD9cyIw+Tm8cPzFDDT4AAIA+maEGPgAAgD5zxow+bWwcPwAAwD4AAIA/tOOUPmBhJz+ZocY+AACAPzFDDT4AAIA+NK8cPwAAgD+hiDU/YWEnP7TjlD5gYSc/1Zw5P2xsHD+ZVx4/AACAP9+bOT9Nbxw/AABgPwAAgD5cyIw+Tm8cP5mhBj4AAIA+c8aMPm1sHD8AAMA+AACAP5mhxj4AAIA/NK8cPwAAgD+hiDU/YWEnP9WcOT9sbBw/mVcePwAAgD/fmzk/TW8cPwAAYD8AAIA+wf08P14YET80r1w/AACAPjSvXD8AAIA+wf08P14YET+ZVx4/AACAPzSvHD8AAIA/mVcePwAAgD80rxw/AACAP1zIjD5Obxw/MUMNPgAAgD4xQw0+AACAPpmhBj4AAIA+XMiMPk5vHD+ZoQY+AACAPnPGjD5tbBw/AADAPgAAgD9zxow+bWwcPwAAwD4AAIA/tOOUPmBhJz+ZocY+AACAPzSvHD8AAIA/oYg1P2FhJz/VnDk/bGwcP5lXHj8AAIA/35s5P01vHD8AAGA/AACAPsH9PD9eGBE/NK9cPwAAgD40r1w/AACAPsH9PD9eGBE/AABgPwAAgD7fmzk/TW8cP5lXHj8AAIA/1Zw5P2xsHD80rxw/AACAP7TjlD5gYSc/oYg1P2FhJz+ZocY+AACAPzFDDT4AAIA+maEGPgAAgD4xQw0+AACAPpmhBj4AAIA+maEGPgAAgD4AAAA+AACAPpmhBj4AAIA+AAAAPgAAgD4AACA/AACAP5lXHj8AAIA/AAAgPwAAgD+ZVx4/AACAPzSvXD8AAIA+AABgPwAAgD40r1w/AACAPgAAYD8AAIA+AADAPgAAgD+ZocY+AACAPwAAwD4AAIA/maHGPgAAgD+ZocY+AACAPzSvHD8AAIA/maHGPgAAgD80rxw/AACAPzFDDT4AAIA+MUMNPgAAgD4xQw0+AACAPjFDDT4AAIA+NK9cPwAAgD40r1w/AACAPjSvXD8AAIA+NK9cPwAAgD4="), +"format": 34359742487, +"index_count": 216, +"index_data": PackedByteArray("AAABAAIAAAADAAEABAAFAAYABAAHAAUACAAJAAoACAALAAkADAANAA4ADAAPAA0AEAARABIAEAATABEAFAAVABYAFAAXABUAGAAZABoAGAAbABkAHAAdAB4AHwAeACAAIQAgACIAIQAjAB0AIQAiACQAIQAkACUAIQAmACMAJwAkACgAKQAoACoAKwAsACMALQAuACwAJgAvAC4AJgAwAC8AJgAxADAAMgAzADAANAA1ADMANgA3ADUAOAA3ADYAOAA2ACUAOQAqADgAOgA7ADwAOgA9ADsAPgA/AEAAPgBAAEEAPgBCAD8AQgBDAD8ARABFAEMARgBBAEcASABJAEUASABKAEkASABLAEoATABNAEoATgBPAE0AUABRAE8AUgBRAFAAUgBQAFMAUwBUAFIAVQBWAFQAVwBYAFYAWQBYAFoAWQBbAFgAWQBHAFsAXABdAF4AXABfAF0AYABhAGIAYABjAGEAZABlAGYAZABnAGUAaABpAGoAaABrAGkAbABtAG4AbABvAG0AcABxAHIAcABzAHEAdAB1AHYAdAB3AHUAeAB5AHoAeAB7AHkA"), +"material": SubResource("ShaderMaterial_bdeaa"), +"name": "Border", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 124, +"vertex_data": PackedByteArray("amJCvRrmdT2bhxu76x5FvaR2aD2Ehxs76x5FvaR2aD2bhxu7amJCvRrmdT2Ehxs76x5FPap2aL2bhxu76x5FPaR2aD2Ehxs76x5FPaR2aD2bhxu76x5FPap2aL2Ehxs7mug6veS7f72Ehxs7SrIwvcKqgb2bhxu7mug6veS7f72bhxu7SrIwvcKqgb2Ehxs7amJCvR7mdb2Ehxs7mug6veS7f72bhxu7amJCvR7mdb2bhxu7mug6veS7f72Ehxs7mug6vd67fz2bhxu7amJCvRrmdT2Ehxs7amJCvRrmdT2bhxu7mug6vd67fz2Ehxs7SrIwvbmqgT2bhxu7mug6vd67fz2Ehxs7mug6vd67fz2bhxu7SrIwvbmqgT2Ehxs76x5Fvap2aL2Ehxs7amJCvR7mdb2bhxu76x5Fvap2aL2bhxu7amJCvR7mdb2Ehxs79Dcwvd6Va72Ehxs7SrIwvcKqgb2Ehxs7mug6veS7f72Ehxs79Dcwvd6Va72Ehxs7amJCvR7mdb2Ehxs79Dcwvd6Va72Ehxs76x5Fvap2aL2Ehxs7SrIwPcKqgb2Ehxs76x5FvaR2aD2Ehxs79DcwvdiVaz2Ehxs79DcwPd6Va72Ehxs79DcwvdiVaz2Ehxs7amJCvRrmdT2Ehxs79DcwvdiVaz2Ehxs7mug6vd67fz2Ehxs79DcwPd6Va72Ehxs7mug6PeS7f72Ehxs79DcwPd6Va72Ehxs7amJCPR7mdb2Ehxs76x5FPap2aL2Ehxs76x5FPaR2aD2Ehxs79DcwPdiVaz2Ehxs79DcwPdiVaz2Ehxs7amJCPRrmdT2Ehxs79DcwPdiVaz2Ehxs7mug6Pd67fz2Ehxs79DcwPdiVaz2Ehxs7SrIwPbmqgT2Ehxs7SrIwvbmqgT2Ehxs79DcwvdiVaz2Ehxs7amJCPRrmdT2bhxu76x5FPaR2aD2Ehxs7amJCPRrmdT2Ehxs76x5FPaR2aD2bhxu79DcwPd6Va72bhxu7SrIwvcKqgb2bhxu7SrIwPcKqgb2bhxu7mug6PeS7f72bhxu79Dcwvd6Va72bhxu7mug6veS7f72bhxu79Dcwvd6Va72bhxu7amJCvR7mdb2bhxu79DcwPd6Va72bhxu7amJCPR7mdb2bhxu79Dcwvd6Va72bhxu76x5Fvap2aL2bhxu76x5FvaR2aD2bhxu79DcwvdiVaz2bhxu79DcwvdiVaz2bhxu7amJCvRrmdT2bhxu79DcwvdiVaz2bhxu7mug6vd67fz2bhxu79DcwvdiVaz2bhxu7SrIwvbmqgT2bhxu7SrIwPbmqgT2bhxu79DcwPdiVaz2bhxu7mug6Pd67fz2bhxu79DcwPdiVaz2bhxu7amJCPRrmdT2bhxu79DcwPdiVaz2bhxu76x5FPaR2aD2bhxu79DcwPd6Va72bhxu79DcwPdiVaz2bhxu76x5FPap2aL2bhxu7SrIwPcKqgb2Ehxs7mug6PeS7f72bhxu7SrIwPcKqgb2bhxu7mug6PeS7f72Ehxs7mug6PeS7f72Ehxs7amJCPR7mdb2bhxu7mug6PeS7f72bhxu7amJCPR7mdb2Ehxs7mug6Pd67fz2bhxu7amJCPRrmdT2Ehxs7mug6Pd67fz2Ehxs7amJCPRrmdT2bhxu7SrIwPbmqgT2bhxu7mug6Pd67fz2Ehxs7SrIwPbmqgT2Ehxs7mug6Pd67fz2bhxu7amJCPR7mdb2Ehxs76x5FPap2aL2bhxu7amJCPR7mdb2bhxu76x5FPap2aL2Ehxs76x5Fvap2aL2bhxu76x5FvaR2aD2Ehxs76x5Fvap2aL2Ehxs76x5FvaR2aD2bhxu7SrIwPcKqgb2Ehxs7SrIwvcKqgb2bhxu7SrIwvcKqgb2Ehxs7SrIwPcKqgb2bhxu7SrIwPbmqgT2bhxu7SrIwvbmqgT2Ehxs7SrIwvbmqgT2bhxu7SrIwPbmqgT2Ehxs7qRWolf///7+pFaiV////v6kVqJX///+/qRWolf///7////9/////v////3////+/////f////7////9/////v6JeXSH///+/ol5dIf///7+iXl0h////v6JeXSH///+/Rje5SP///79GN7lI////v0Y3uUj///+/Rje5SP///79GN0W3////v0Y3Rbf///+/RjdFt////79GN0W3////v6Jeod7///+/ol6h3v///7+iXqHe////v6Jeod7///+/qRVWav///7+pFVZq////v6kVVmr///+/qRVWav///7//f/9/ot6uUP9//3////8//3//f5K9yR7/f/9/kr3JHv9//39XatQK/3//f////z//f/9/H3bwBP9//3////8//3//f/9/AAD/f/9/1QEVP/9//3////8//3//f6eV1Ar/f/9/p5XUCv9//39sQske/3//f2xCyR7/f/9/XCFQr/9//39sQjXh/3//f2xCNeH/f/9/p5Uq9f9//3/fiQ77/3//f/9/////f/9//3////9//39Xair1/3//f1dqKvX/f/9/kr014f9//3+SvTXh/3//f6LeUa//f/9/ot5Rr/9//3////8//3//f1whrVBV6qiV////v1XqqJX///+/Veqolf///79V6qiV////v/////9cIa5Q/////6LeUK//////XCGuUP////9sQske/////6LeUK//////kr014f////+SvTXh/////1dqKvX/////bELJHv////+nldQK/////014Jvz/////H3YO+///////f/////////9/////////p5Uq9f////+nlSr1/////2xCNeH/////bEI14f////9cIVGv/////1whUa//////ot6tUP////+i3q1Q/////5K9yR7/////kr3JHv////9XatQK/////1dq1Ar//////38AAP////+xh9gD//////9/AAD/////34nwBFyhXSH///+/XKFdIf///79coV0h////v1yhXSH///+/uMi5SP///7+4yLlI////v7jIuUj///+/uMi5SP///7+4yEW3////v7jIRbf///+/uMhFt////7+4yEW3////v1yhod7///+/XKGh3v///79coaHe////v1yhod7///+/VepWav///79V6lZq////v1XqVmr///+/VepWav///78AAP9/////vwAA/3////+/AAD/f////78AAP9/////v/9/AAD///+//38AAP///7//fwAA////v/9/AAD///+//3///////7//f///////v/9///////+//3///////78=") +}] +blend_shape_mode = 0 +shadow_mesh = SubResource("ArrayMesh_gxum5") + +[sub_resource type="ViewportTexture" id="ViewportTexture_bm66m"] +viewport_path = NodePath("SubViewport") + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_ld374"] +resource_local_to_scene = true +render_priority = 0 +shader = ExtResource("2_o6jcx") +shader_parameter/affine_mapping = false +shader_parameter/albedo = SubResource("ViewportTexture_bm66m") +shader_parameter/alpha_scissor = 0.5 +shader_parameter/jitter = 0.25 +shader_parameter/resolution = Vector2i(320, 240) + +[sub_resource type="Gradient" id="Gradient_bvqyy"] +resource_local_to_scene = true +offsets = PackedFloat32Array(0) +colors = PackedColorArray(0.844882, 0.457393, 0.0915536, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_8q1at"] +gradient = SubResource("Gradient_bvqyy") + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_cuxkc"] +resource_local_to_scene = true +render_priority = 0 +shader = ExtResource("2_o6jcx") +shader_parameter/affine_mapping = true +shader_parameter/albedo = SubResource("GradientTexture1D_8q1at") +shader_parameter/alpha_scissor = 0.5 +shader_parameter/jitter = 0.25 +shader_parameter/resolution = Vector2i(320, 240) + +[node name="3DCard" type="Node3D" node_paths=PackedStringArray("card_in_hand", "mesh")] +script = ExtResource("1_o6jcx") +card_in_hand = NodePath("SubViewport/Node2D") +mesh = NodePath("card_model/Cube") + +[node name="card_model" type="Node3D" parent="."] + +[node name="Cube" type="MeshInstance3D" parent="card_model"] +layers = 2 +mesh = SubResource("ArrayMesh_4sds6") +skeleton = NodePath("") +surface_material_override/0 = SubResource("ShaderMaterial_ld374") +surface_material_override/1 = SubResource("ShaderMaterial_cuxkc") + +[node name="SubViewport" type="SubViewport" parent="."] +size = Vector2i(304, 448) + +[node name="Node2D" parent="SubViewport" instance=ExtResource("3_bnh6n")] +position = Vector2(-80, -32) diff --git a/card_model/card_model.glb b/card_model/card_model.glb new file mode 100644 index 0000000000000000000000000000000000000000..d51f40e55f88bc41ae9d915765c8f1e266537f4d GIT binary patch literal 6780 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 literal 0 HcmV?d00001 diff --git a/left_hand/card_hand_model.glb.import b/left_hand/card_hand_model.glb.import new file mode 100644 index 0000000..472d452 --- /dev/null +++ b/left_hand/card_hand_model.glb.import @@ -0,0 +1,44 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ckl5tw5rmewhp" +path="res://.godot/imported/card_hand_model.glb-9d079553923f873c0bdaf334fc6f8b8b.scn" + +[deps] + +source_file="res://left_hand/card_hand_model.glb" +dest_files=["res://.godot/imported/card_hand_model.glb-9d079553923f873c0bdaf334fc6f8b8b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={ +"materials": { +"Default": { +"use_external/enabled": true, +"use_external/path": "uid://cmrs1ubeqtl71" +} +} +} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/left_hand/left_hand_mat.tres b/left_hand/left_hand_mat.tres new file mode 100644 index 0000000..78293a4 --- /dev/null +++ b/left_hand/left_hand_mat.tres @@ -0,0 +1,14 @@ +[gd_resource type="ShaderMaterial" load_steps=3 format=3 uid="uid://cmrs1ubeqtl71"] + +[ext_resource type="Shader" uid="uid://c5bffujq0l70k" path="res://Shaders/jitter.gdshader" id="1_bpyoj"] + +[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_6krsv"] + +[resource] +render_priority = 0 +shader = ExtResource("1_bpyoj") +shader_parameter/affine_mapping = true +shader_parameter/albedo = SubResource("PlaceholderTexture2D_6krsv") +shader_parameter/alpha_scissor = 0.5 +shader_parameter/jitter = 0.25 +shader_parameter/resolution = Vector2i(320, 240) diff --git a/project.godot b/project.godot index 9b2f392..6ae6c5c 100644 --- a/project.godot +++ b/project.godot @@ -154,6 +154,31 @@ Pause={ "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 1st Card"={ +"deadzone": 0.2, +"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":49,"key_label":0,"unicode":49,"location":0,"echo":false,"script":null) +] +} +"Select 2nd Card"={ +"deadzone": 0.2, +"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":50,"key_label":0,"unicode":50,"location":0,"echo":false,"script":null) +] +} +"Select 3rd Card"={ +"deadzone": 0.2, +"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":51,"key_label":0,"unicode":51,"location":0,"echo":false,"script":null) +] +} +"Select 4th Card"={ +"deadzone": 0.2, +"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":52,"key_label":0,"unicode":52,"location":0,"echo":false,"script":null) +] +} +"Select 5th Card"={ +"deadzone": 0.2, +"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":53,"key_label":0,"unicode":53,"location":0,"echo":false,"script":null) +] +} [layer_names]