diff --git a/audio/sounds/Hitech Shot A.wav b/audio/sounds/Hitech Shot A.wav new file mode 100644 index 0000000..114b76b Binary files /dev/null and b/audio/sounds/Hitech Shot A.wav differ diff --git a/audio/sounds/Hitech Shot A.wav.import b/audio/sounds/Hitech Shot A.wav.import new file mode 100644 index 0000000..ab6a2d1 --- /dev/null +++ b/audio/sounds/Hitech Shot A.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c1j8hjmw45x86" +path="res://.godot/imported/Hitech Shot A.wav-e57d3655671c296fafa3d2154f969e02.sample" + +[deps] + +source_file="res://audio/sounds/Hitech Shot A.wav" +dest_files=["res://.godot/imported/Hitech Shot A.wav-e57d3655671c296fafa3d2154f969e02.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/Hitech Shot B.wav b/audio/sounds/Hitech Shot B.wav new file mode 100644 index 0000000..c31303f Binary files /dev/null and b/audio/sounds/Hitech Shot B.wav differ diff --git a/audio/sounds/Hitech Shot B.wav.import b/audio/sounds/Hitech Shot B.wav.import new file mode 100644 index 0000000..7d08016 --- /dev/null +++ b/audio/sounds/Hitech Shot B.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dgftxjb34d2ph" +path="res://.godot/imported/Hitech Shot B.wav-d2114b8125e08c8fcbcc010c4ac10ab3.sample" + +[deps] + +source_file="res://audio/sounds/Hitech Shot B.wav" +dest_files=["res://.godot/imported/Hitech Shot B.wav-d2114b8125e08c8fcbcc010c4ac10ab3.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/Hitech Shot C.wav b/audio/sounds/Hitech Shot C.wav new file mode 100644 index 0000000..671490b Binary files /dev/null and b/audio/sounds/Hitech Shot C.wav differ diff --git a/audio/sounds/Hitech Shot C.wav.import b/audio/sounds/Hitech Shot C.wav.import new file mode 100644 index 0000000..de76428 --- /dev/null +++ b/audio/sounds/Hitech Shot C.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bguwdvatsf87l" +path="res://.godot/imported/Hitech Shot C.wav-0dbb83a7c28ad0e7360a4144f64e7c77.sample" + +[deps] + +source_file="res://audio/sounds/Hitech Shot C.wav" +dest_files=["res://.godot/imported/Hitech Shot C.wav-0dbb83a7c28ad0e7360a4144f64e7c77.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/Whoosh Blade 001.wav b/audio/sounds/Whoosh Blade 001.wav new file mode 100644 index 0000000..1777462 Binary files /dev/null and b/audio/sounds/Whoosh Blade 001.wav differ diff --git a/audio/sounds/Whoosh Blade 001.wav.import b/audio/sounds/Whoosh Blade 001.wav.import new file mode 100644 index 0000000..58ebe05 --- /dev/null +++ b/audio/sounds/Whoosh Blade 001.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b8ko5lwikj8ts" +path="res://.godot/imported/Whoosh Blade 001.wav-0a40ba1c0704a04c7e9d95a3a2952f1d.sample" + +[deps] + +source_file="res://audio/sounds/Whoosh Blade 001.wav" +dest_files=["res://.godot/imported/Whoosh Blade 001.wav-0a40ba1c0704a04c7e9d95a3a2952f1d.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/Whoosh Blade 002.wav b/audio/sounds/Whoosh Blade 002.wav new file mode 100644 index 0000000..f41e135 Binary files /dev/null and b/audio/sounds/Whoosh Blade 002.wav differ diff --git a/audio/sounds/Whoosh Blade 002.wav.import b/audio/sounds/Whoosh Blade 002.wav.import new file mode 100644 index 0000000..5d0022d --- /dev/null +++ b/audio/sounds/Whoosh Blade 002.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dufoyvysi4pa1" +path="res://.godot/imported/Whoosh Blade 002.wav-a527be18cb71119f7311612c1984f1be.sample" + +[deps] + +source_file="res://audio/sounds/Whoosh Blade 002.wav" +dest_files=["res://.godot/imported/Whoosh Blade 002.wav-a527be18cb71119f7311612c1984f1be.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/Whoosh Blade 003.wav b/audio/sounds/Whoosh Blade 003.wav new file mode 100644 index 0000000..583707c Binary files /dev/null and b/audio/sounds/Whoosh Blade 003.wav differ diff --git a/audio/sounds/Whoosh Blade 003.wav.import b/audio/sounds/Whoosh Blade 003.wav.import new file mode 100644 index 0000000..9011179 --- /dev/null +++ b/audio/sounds/Whoosh Blade 003.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://boe6fidhl6ut5" +path="res://.godot/imported/Whoosh Blade 003.wav-9fba3d17936d04349bedcc3417827502.sample" + +[deps] + +source_file="res://audio/sounds/Whoosh Blade 003.wav" +dest_files=["res://.godot/imported/Whoosh Blade 003.wav-9fba3d17936d04349bedcc3417827502.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/Whoosh Blade 004.wav b/audio/sounds/Whoosh Blade 004.wav new file mode 100644 index 0000000..89404f9 Binary files /dev/null and b/audio/sounds/Whoosh Blade 004.wav differ diff --git a/audio/sounds/Whoosh Blade 004.wav.import b/audio/sounds/Whoosh Blade 004.wav.import new file mode 100644 index 0000000..83e40ac --- /dev/null +++ b/audio/sounds/Whoosh Blade 004.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b3x0xqu8yrib4" +path="res://.godot/imported/Whoosh Blade 004.wav-004e5fcdda319910a4671ddb53800018.sample" + +[deps] + +source_file="res://audio/sounds/Whoosh Blade 004.wav" +dest_files=["res://.godot/imported/Whoosh Blade 004.wav-004e5fcdda319910a4671ddb53800018.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/Whoosh Blade 005.wav b/audio/sounds/Whoosh Blade 005.wav new file mode 100644 index 0000000..e223a0e Binary files /dev/null and b/audio/sounds/Whoosh Blade 005.wav differ diff --git a/audio/sounds/Whoosh Blade 005.wav.import b/audio/sounds/Whoosh Blade 005.wav.import new file mode 100644 index 0000000..b078fb6 --- /dev/null +++ b/audio/sounds/Whoosh Blade 005.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://1m2yfje18spo" +path="res://.godot/imported/Whoosh Blade 005.wav-b77bf215aae8773e43e9ca269c09de7b.sample" + +[deps] + +source_file="res://audio/sounds/Whoosh Blade 005.wav" +dest_files=["res://.godot/imported/Whoosh Blade 005.wav-b77bf215aae8773e43e9ca269c09de7b.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/explosion_large_05.wav b/audio/sounds/explosion_large_05.wav new file mode 100644 index 0000000..851428f Binary files /dev/null and b/audio/sounds/explosion_large_05.wav differ diff --git a/audio/sounds/explosion_large_05.wav.import b/audio/sounds/explosion_large_05.wav.import new file mode 100644 index 0000000..3b30af6 --- /dev/null +++ b/audio/sounds/explosion_large_05.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bmxuqtejtyf75" +path="res://.godot/imported/explosion_large_05.wav-8aaba4f8d2d8fe148ac4f73a2bde0bad.sample" + +[deps] + +source_file="res://audio/sounds/explosion_large_05.wav" +dest_files=["res://.godot/imported/explosion_large_05.wav-8aaba4f8d2d8fe148ac4f73a2bde0bad.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/explosion_large_06.wav b/audio/sounds/explosion_large_06.wav new file mode 100644 index 0000000..dcd2db3 Binary files /dev/null and b/audio/sounds/explosion_large_06.wav differ diff --git a/audio/sounds/explosion_large_06.wav.import b/audio/sounds/explosion_large_06.wav.import new file mode 100644 index 0000000..f0b4bb7 --- /dev/null +++ b/audio/sounds/explosion_large_06.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://ccf2g14lglt2p" +path="res://.godot/imported/explosion_large_06.wav-26fb65d41be2f260bf310a1c8e14d972.sample" + +[deps] + +source_file="res://audio/sounds/explosion_large_06.wav" +dest_files=["res://.godot/imported/explosion_large_06.wav-26fb65d41be2f260bf310a1c8e14d972.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/explosion_large_07.wav b/audio/sounds/explosion_large_07.wav new file mode 100644 index 0000000..1e08cfd Binary files /dev/null and b/audio/sounds/explosion_large_07.wav differ diff --git a/audio/sounds/explosion_large_07.wav.import b/audio/sounds/explosion_large_07.wav.import new file mode 100644 index 0000000..0ac496e --- /dev/null +++ b/audio/sounds/explosion_large_07.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b4tqrmvqit1q4" +path="res://.godot/imported/explosion_large_07.wav-d16d0e0ae6238b45bae3423f99c604eb.sample" + +[deps] + +source_file="res://audio/sounds/explosion_large_07.wav" +dest_files=["res://.godot/imported/explosion_large_07.wav-d16d0e0ae6238b45bae3423f99c604eb.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/explosion_large_09.wav b/audio/sounds/explosion_large_09.wav new file mode 100644 index 0000000..522c577 Binary files /dev/null and b/audio/sounds/explosion_large_09.wav differ diff --git a/audio/sounds/explosion_large_09.wav.import b/audio/sounds/explosion_large_09.wav.import new file mode 100644 index 0000000..e1fd3b4 --- /dev/null +++ b/audio/sounds/explosion_large_09.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://8fa481psipvv" +path="res://.godot/imported/explosion_large_09.wav-41cf5984e9b508859b7c052211d54945.sample" + +[deps] + +source_file="res://audio/sounds/explosion_large_09.wav" +dest_files=["res://.godot/imported/explosion_large_09.wav-41cf5984e9b508859b7c052211d54945.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/explosion_large_10.wav b/audio/sounds/explosion_large_10.wav new file mode 100644 index 0000000..049fc28 Binary files /dev/null and b/audio/sounds/explosion_large_10.wav differ diff --git a/audio/sounds/explosion_large_10.wav.import b/audio/sounds/explosion_large_10.wav.import new file mode 100644 index 0000000..9063b2b --- /dev/null +++ b/audio/sounds/explosion_large_10.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://fctuwgytsn2p" +path="res://.godot/imported/explosion_large_10.wav-2d2e5e0cc2d8006c477f063de069fe52.sample" + +[deps] + +source_file="res://audio/sounds/explosion_large_10.wav" +dest_files=["res://.godot/imported/explosion_large_10.wav-2d2e5e0cc2d8006c477f063de069fe52.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/gas_leak_med_burst_01.wav b/audio/sounds/gas_leak_med_burst_01.wav new file mode 100644 index 0000000..6ef60ee Binary files /dev/null and b/audio/sounds/gas_leak_med_burst_01.wav differ diff --git a/audio/sounds/gas_leak_med_burst_01.wav.import b/audio/sounds/gas_leak_med_burst_01.wav.import new file mode 100644 index 0000000..790a6dc --- /dev/null +++ b/audio/sounds/gas_leak_med_burst_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bk4s3yn7473pc" +path="res://.godot/imported/gas_leak_med_burst_01.wav-a15feaa0b6feab543b5e2c23040b2a7b.sample" + +[deps] + +source_file="res://audio/sounds/gas_leak_med_burst_01.wav" +dest_files=["res://.godot/imported/gas_leak_med_burst_01.wav-a15feaa0b6feab543b5e2c23040b2a7b.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sounds/sci-fi_weapon_reload_03.wav b/audio/sounds/sci-fi_weapon_reload_03.wav new file mode 100644 index 0000000..ce9b826 Binary files /dev/null and b/audio/sounds/sci-fi_weapon_reload_03.wav differ diff --git a/audio/sounds/sci-fi_weapon_reload_03.wav.import b/audio/sounds/sci-fi_weapon_reload_03.wav.import new file mode 100644 index 0000000..fa143c4 --- /dev/null +++ b/audio/sounds/sci-fi_weapon_reload_03.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cw31ymbqgqcq2" +path="res://.godot/imported/sci-fi_weapon_reload_03.wav-c908d897c24b42dc166a58b01a4ace0d.sample" + +[deps] + +source_file="res://audio/sounds/sci-fi_weapon_reload_03.wav" +dest_files=["res://.godot/imported/sci-fi_weapon_reload_03.wav-c908d897c24b42dc166a58b01a4ace0d.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/credits.txt b/credits.txt index 977725d..5c95c7a 100644 --- a/credits.txt +++ b/credits.txt @@ -1,20 +1,37 @@ -Will S. - Ovani +****Will S. - Ovani Trap Cycle - 9mm M&P Drop Mag Empty C.wav +Melee Swings - + - Whoosh Blade 001.wav + - Whoosh Blade 003.wav + - Whoosh Blade 002.wav + - Whoosh Blade 005.wav + - Whoosh Blade 004.wav +Ranged Shots - + - Hitech Shot A.wav + - Hitech Shot B.wav + - Hitech Shot C.wav - -Gamemaster Audio +****Gamemaster Audio Trap Place - impact_deep_thud_bounce_09.wav Explosions - explosion_large_01.wav - explosion_large_02.wav - explosion_large_03.wav - explosion_large_04.wav + - explosion_large_05.wav + - explosion_large_06.wav + - explosion_large_07.wav + - explosion_large_08.wav + - explosion_large_09.wav + - explosion_large_10.wav - explosion_small_01.wav - explosion_small_02.wav - explosion_small_03.wav - explosion_small_04.wav - +Gas Square + - gas_leak_med_burst_01.wav +Reload - sci-fi_weapon_reload_03.wav Disarm Tap - metal_tiny_hit_impact_01.wav -OTBTechno +****OTBTechno Trap Alert - 134688__otbtechno__bike-bell.wav diff --git a/data/pawn.gd b/data/pawn.gd new file mode 100644 index 0000000..3042a34 --- /dev/null +++ b/data/pawn.gd @@ -0,0 +1,23 @@ +class_name PawnData extends Resource + +@export var name : String + +@export var move_speed : float + + +@export var life : int +@export var max_life : int = 100 + +@export var ammo : int +@export var max_ammo : int = 5 +@export var melee_damage : int +@export var range_damage : int +@export var range_time : float +@export var melee_time : float +@export var reload_time : float = 1.25 + +var model +var portrait +@export var nameplate : Texture2D + +@export var starting_traps : Array[TrapSet] = [null, null, null] diff --git a/data/pawn.gd.uid b/data/pawn.gd.uid new file mode 100644 index 0000000..70a85d4 --- /dev/null +++ b/data/pawn.gd.uid @@ -0,0 +1 @@ +uid://c53ohdio1ksp1 diff --git a/data/pawns/abdoll_relin.tres b/data/pawns/abdoll_relin.tres new file mode 100644 index 0000000..c405ad6 --- /dev/null +++ b/data/pawns/abdoll_relin.tres @@ -0,0 +1,38 @@ +[gd_resource type="Resource" script_class="PawnData" load_steps=6 format=3 uid="uid://yosnkcj4ci4v"] + +[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn.gd" id="1_qrt0o"] +[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/trapset.gd" id="2_4g7al"] + +[sub_resource type="Resource" id="Resource_qrt0o"] +script = ExtResource("2_4g7al") +type = 1 +qty = 3 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[sub_resource type="Resource" id="Resource_4g7al"] +script = ExtResource("2_4g7al") +type = 5 +qty = 6 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[sub_resource type="Resource" id="Resource_8dqhi"] +script = ExtResource("2_4g7al") +type = 2 +qty = 2 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[resource] +script = ExtResource("1_qrt0o") +name = "Abdoll Relin" +move_speed = 3.0 +life = 75 +max_life = 75 +ammo = 2 +max_ammo = 2 +melee_damage = 12 +range_damage = 12 +range_time = 1.0 +melee_time = 1.25 +reload_time = 1.75 +starting_traps = Array[ExtResource("2_4g7al")]([SubResource("Resource_qrt0o"), SubResource("Resource_4g7al"), SubResource("Resource_8dqhi")]) +metadata/_custom_type_script = "uid://c53ohdio1ksp1" diff --git a/data/pawns/john_bishous.tres b/data/pawns/john_bishous.tres new file mode 100644 index 0000000..9498803 --- /dev/null +++ b/data/pawns/john_bishous.tres @@ -0,0 +1,37 @@ +[gd_resource type="Resource" script_class="PawnData" load_steps=6 format=3 uid="uid://df4gqi1us2dwu"] + +[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn.gd" id="1_ocmvf"] +[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/trapset.gd" id="2_sb8f5"] + +[sub_resource type="Resource" id="Resource_ocmvf"] +script = ExtResource("2_sb8f5") +type = 4 +qty = 2 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[sub_resource type="Resource" id="Resource_sb8f5"] +script = ExtResource("2_sb8f5") +qty = 6 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[sub_resource type="Resource" id="Resource_tu5w7"] +script = ExtResource("2_sb8f5") +type = 2 +qty = 2 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[resource] +script = ExtResource("1_ocmvf") +name = "John Bishous" +move_speed = 2.5 +life = 125 +max_life = 125 +ammo = 3 +max_ammo = 3 +melee_damage = 10 +range_damage = 20 +range_time = 0.75 +melee_time = 1.0 +reload_time = 1.75 +starting_traps = Array[ExtResource("2_sb8f5")]([SubResource("Resource_ocmvf"), SubResource("Resource_sb8f5"), SubResource("Resource_tu5w7")]) +metadata/_custom_type_script = "uid://c53ohdio1ksp1" diff --git a/data/pawns/lou_riche.tres b/data/pawns/lou_riche.tres new file mode 100644 index 0000000..40336e8 --- /dev/null +++ b/data/pawns/lou_riche.tres @@ -0,0 +1,36 @@ +[gd_resource type="Resource" script_class="PawnData" load_steps=6 format=3 uid="uid://dnty6gi4s2vdl"] + +[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn.gd" id="1_h6eg2"] +[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/trapset.gd" id="2_onotk"] + +[sub_resource type="Resource" id="Resource_h6eg2"] +script = ExtResource("2_onotk") +type = 1 +qty = 5 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[sub_resource type="Resource" id="Resource_onotk"] +script = ExtResource("2_onotk") +type = 2 +qty = 1 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[sub_resource type="Resource" id="Resource_7kyxn"] +script = ExtResource("2_onotk") +type = 3 +qty = 3 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[resource] +script = ExtResource("1_h6eg2") +name = "Lou Riche" +move_speed = 3.0 +life = 100 +ammo = 6 +max_ammo = 6 +melee_damage = 12 +range_damage = 4 +range_time = 0.4 +melee_time = 1.25 +starting_traps = Array[ExtResource("2_onotk")]([SubResource("Resource_h6eg2"), SubResource("Resource_onotk"), SubResource("Resource_7kyxn")]) +metadata/_custom_type_script = "uid://c53ohdio1ksp1" diff --git a/data/pawns/tenrou_ugetsu.tres b/data/pawns/tenrou_ugetsu.tres new file mode 100644 index 0000000..4491108 --- /dev/null +++ b/data/pawns/tenrou_ugetsu.tres @@ -0,0 +1,37 @@ +[gd_resource type="Resource" script_class="PawnData" load_steps=6 format=3 uid="uid://bpb2nok3rqm1g"] + +[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn.gd" id="1_g4lbt"] +[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/trapset.gd" id="2_fm4bf"] + +[sub_resource type="Resource" id="Resource_g4lbt"] +script = ExtResource("2_fm4bf") +type = 1 +qty = 2 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[sub_resource type="Resource" id="Resource_fm4bf"] +script = ExtResource("2_fm4bf") +type = 5 +qty = 3 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[sub_resource type="Resource" id="Resource_0fl5x"] +script = ExtResource("2_fm4bf") +type = 3 +qty = 2 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[resource] +script = ExtResource("1_g4lbt") +name = "Tenrou Ugetsu" +move_speed = 3.5 +life = 100 +ammo = 7 +max_ammo = 7 +melee_damage = 15 +range_damage = 3 +range_time = 0.3 +melee_time = 1.25 +reload_time = 0.6 +starting_traps = Array[ExtResource("2_fm4bf")]([SubResource("Resource_g4lbt"), SubResource("Resource_fm4bf"), SubResource("Resource_0fl5x")]) +metadata/_custom_type_script = "uid://c53ohdio1ksp1" diff --git a/data/pawns/tico.tres b/data/pawns/tico.tres new file mode 100644 index 0000000..f6d2eda --- /dev/null +++ b/data/pawns/tico.tres @@ -0,0 +1,38 @@ +[gd_resource type="Resource" script_class="PawnData" load_steps=6 format=3 uid="uid://casciqabe0wgo"] + +[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn.gd" id="1_y3bgy"] +[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/trapset.gd" id="2_o3qj5"] + +[sub_resource type="Resource" id="Resource_y3bgy"] +script = ExtResource("2_o3qj5") +type = 4 +qty = 3 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[sub_resource type="Resource" id="Resource_o3qj5"] +script = ExtResource("2_o3qj5") +type = 5 +qty = 4 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[sub_resource type="Resource" id="Resource_cxp03"] +script = ExtResource("2_o3qj5") +type = 3 +qty = 4 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[resource] +script = ExtResource("1_y3bgy") +name = "Tico" +move_speed = 3.0 +life = 75 +max_life = 75 +ammo = 4 +max_ammo = 4 +melee_damage = 15 +range_damage = 10 +range_time = 1.0 +melee_time = 1.25 +reload_time = 2.0 +starting_traps = Array[ExtResource("2_o3qj5")]([SubResource("Resource_y3bgy"), SubResource("Resource_o3qj5"), SubResource("Resource_cxp03")]) +metadata/_custom_type_script = "uid://c53ohdio1ksp1" diff --git a/data/pawns/van_reily.tres b/data/pawns/van_reily.tres new file mode 100644 index 0000000..faaabb3 --- /dev/null +++ b/data/pawns/van_reily.tres @@ -0,0 +1,34 @@ +[gd_resource type="Resource" script_class="PawnData" load_steps=6 format=3 uid="uid://6s8tqfssrt5i"] + +[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn.gd" id="1_ydc1g"] +[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/trapset.gd" id="2_crpmc"] + +[sub_resource type="Resource" id="Resource_nf0ju"] +script = ExtResource("2_crpmc") +type = 4 +qty = 1 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[sub_resource type="Resource" id="Resource_2pr8m"] +script = ExtResource("2_crpmc") +qty = 4 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[sub_resource type="Resource" id="Resource_1yw33"] +script = ExtResource("2_crpmc") +type = 1 +qty = 4 +metadata/_custom_type_script = "uid://b0b1107c0d807" + +[resource] +script = ExtResource("1_ydc1g") +name = "Van Raily" +move_speed = 3.0 +life = 100 +ammo = 5 +melee_damage = 10 +range_damage = 5 +range_time = 0.5 +melee_time = 1.0 +starting_traps = Array[ExtResource("2_crpmc")]([SubResource("Resource_nf0ju"), SubResource("Resource_2pr8m"), SubResource("Resource_1yw33")]) +metadata/_custom_type_script = "uid://c53ohdio1ksp1" diff --git a/data/trapset.gd b/data/trapset.gd new file mode 100644 index 0000000..253404f --- /dev/null +++ b/data/trapset.gd @@ -0,0 +1,4 @@ +class_name TrapSet extends Resource + +@export var type : Trap.Type +@export var qty : int diff --git a/data/trapset.gd.uid b/data/trapset.gd.uid new file mode 100644 index 0000000..c5dd0a2 --- /dev/null +++ b/data/trapset.gd.uid @@ -0,0 +1 @@ +uid://b0b1107c0d807 diff --git a/models/dodecahedron.fbx b/models/dodecahedron.fbx new file mode 100644 index 0000000..53eda5e Binary files /dev/null and b/models/dodecahedron.fbx differ diff --git a/models/dodecahedron.fbx.import b/models/dodecahedron.fbx.import new file mode 100644 index 0000000..6e64c82 --- /dev/null +++ b/models/dodecahedron.fbx.import @@ -0,0 +1,44 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://lf55hlwuexr8" +path="res://.godot/imported/dodecahedron.fbx-d877e542786ccf60a7c618d38ca40818.scn" + +[deps] + +source_file="res://models/dodecahedron.fbx" +dest_files=["res://.godot/imported/dodecahedron.fbx-d877e542786ccf60a7c618d38ca40818.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +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=true +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +fbx/importer=0 +fbx/allow_geometry_helper_nodes=false +fbx/embedded_image_handling=1 +fbx/naming_version=2 diff --git a/project.godot b/project.godot index ae0e618..55b3dba 100644 --- a/project.godot +++ b/project.godot @@ -34,6 +34,7 @@ project/assembly_name="Trap Gunner" level_spawner="" scenes="" +combat="Combat valid targets." [input] @@ -101,3 +102,7 @@ detonate={ "events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null) ] } + +[physics] + +3d/default_gravity=30.0 diff --git a/scenes/character_select.tscn b/scenes/character_select.tscn index ca71c8d..989e03e 100644 --- a/scenes/character_select.tscn +++ b/scenes/character_select.tscn @@ -1,5 +1,6 @@ -[gd_scene load_steps=10 format=3 uid="uid://ck4x56txf676a"] +[gd_scene load_steps=11 format=3 uid="uid://ck4x56txf676a"] +[ext_resource type="Script" uid="uid://grs3nyom325o" path="res://scripts/character_select.gd" id="1_bow2h"] [ext_resource type="Texture2D" uid="uid://dri0a20l6kpbj" path="res://visuals/images/icon.svg" id="2_uxcyu"] [ext_resource type="AudioStream" uid="uid://vcatohtmt8bk" path="res://audio/music/16 - Character Select.mp3" id="3_bow2h"] @@ -76,6 +77,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +script = ExtResource("1_bow2h") [node name="Panel" type="Panel" parent="."] layout_mode = 1 diff --git a/scenes/test_level.tscn b/scenes/test_level.tscn index 882fa55..d4ab6c6 100644 --- a/scenes/test_level.tscn +++ b/scenes/test_level.tscn @@ -1,11 +1,19 @@ -[gd_scene load_steps=6 format=3 uid="uid://by6suwmds7xq2"] +[gd_scene load_steps=9 format=3 uid="uid://by6suwmds7xq2"] [ext_resource type="Script" uid="uid://d3t381vws7vns" path="res://scripts/test_level.gd" id="1_qcd3b"] [ext_resource type="PackedScene" uid="uid://bgocskbofewsr" path="res://templates/HUD.tscn" id="1_x4b8f"] [ext_resource type="Script" uid="uid://cymi1n4gavixy" path="res://scripts/level_camera.gd" id="3_qcd3b"] +[ext_resource type="Script" uid="uid://clqnjqolkujea" path="res://scripts/combat_target.gd" id="6_qcd3b"] [ext_resource type="MeshLibrary" uid="uid://bhpyvhf36jl0f" path="res://testing.tres" id="7_88ety"] [ext_resource type="MeshLibrary" uid="uid://cvhm40o2uw5mr" path="res://testing markers.tres" id="7_ahbqi"] +[sub_resource type="FastNoiseLite" id="FastNoiseLite_qcd3b"] +frequency = 0.02 +fractal_octaves = 6 + +[sub_resource type="BoxShape3D" id="BoxShape3D_tmr53"] +size = Vector3(1, 2, 1) + [node name="Node3D" type="Node3D"] script = ExtResource("1_qcd3b") difficulty = 5 @@ -20,6 +28,7 @@ transform = Transform3D(1, 0, 0, 0, 0.49999997, 0.86602545, 0, -0.86602545, 0.49 projection = 1 size = 5.0 script = ExtResource("3_qcd3b") +noise = SubResource("FastNoiseLite_qcd3b") [node name="OmniLight3D" type="OmniLight3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 18.508709, 0) @@ -37,7 +46,8 @@ data = { } metadata/_editor_floor_ = Vector3(0, 0, 0) -[node name="Ramps and Walls" type="GridMap" parent="."] +[node name="Ramps" type="GridMap" parent="."] +unique_name_in_owner = true mesh_library = ExtResource("7_88ety") cell_size = Vector3(1, 1, 1) cell_center_y = false @@ -56,3 +66,15 @@ cell_center_y = false collision_layer = 0 collision_mask = 0 metadata/_editor_floor_ = Vector3(0, -1, 0) + +[node name="Combat Target" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.926114, 0, -4.1967854) +script = ExtResource("6_qcd3b") + +[node name="CSGBox3D" type="CSGBox3D" parent="Combat Target"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +size = Vector3(1, 2, 1) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Combat Target" groups=["combat"]] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_tmr53") diff --git a/scripts/character_select.gd b/scripts/character_select.gd new file mode 100644 index 0000000..251bf7f --- /dev/null +++ b/scripts/character_select.gd @@ -0,0 +1,10 @@ +extends Control + +var pawns = [ + preload("res://data/pawns/van_reily.tres"), + preload("res://data/pawns/lou_riche.tres"), + preload("res://data/pawns/tico.tres"), + preload("res://data/pawns/john_bishous.tres"), + preload("res://data/pawns/abdoll_relin.tres"), + preload("res://data/pawns/tenrou_ugetsu.tres") +] diff --git a/scripts/character_select.gd.uid b/scripts/character_select.gd.uid new file mode 100644 index 0000000..8969fee --- /dev/null +++ b/scripts/character_select.gd.uid @@ -0,0 +1 @@ +uid://grs3nyom325o diff --git a/scripts/combat_target.gd b/scripts/combat_target.gd new file mode 100644 index 0000000..3af8ab0 --- /dev/null +++ b/scripts/combat_target.gd @@ -0,0 +1 @@ +class_name CombatTarget extends StaticBody3D diff --git a/scripts/combat_target.gd.uid b/scripts/combat_target.gd.uid new file mode 100644 index 0000000..a75ac7a --- /dev/null +++ b/scripts/combat_target.gd.uid @@ -0,0 +1 @@ +uid://clqnjqolkujea diff --git a/scripts/control_display.gd b/scripts/control_display.gd new file mode 100644 index 0000000..7d1c2c8 --- /dev/null +++ b/scripts/control_display.gd @@ -0,0 +1,18 @@ +class_name ControlDisplay extends Control + +@onready var range_attack_button : TextureButton = $RangedAttack +@onready var melee_attack_button : TextureButton = $MeleeAttack +@onready var trap_button : TextureButton = $Trap +@onready var detect_button : TextureButton = $Detect +@onready var switch_button : TextureButton = $Switch + +func _on_melee_range_changed(melee : bool) -> void: + range_attack_button.visible = !melee + melee_attack_button.visible = melee + +func _process(delta: float) -> void: + trap_button.set_pressed_no_signal(Input.is_action_pressed("lay trap")) + detect_button.set_pressed_no_signal(Input.is_action_pressed("detect")) + switch_button.set_pressed_no_signal(Input.is_action_pressed("detonate")) + melee_attack_button.set_pressed_no_signal(Input.is_action_pressed("attack")) + range_attack_button.set_pressed_no_signal(Input.is_action_pressed("attack")) diff --git a/scripts/control_display.gd.uid b/scripts/control_display.gd.uid new file mode 100644 index 0000000..73ddd5c --- /dev/null +++ b/scripts/control_display.gd.uid @@ -0,0 +1 @@ +uid://ci7vc41m5alq5 diff --git a/scripts/disarm_trap_modal.gd b/scripts/disarm_trap_modal.gd index 819ca5f..7d8617f 100644 --- a/scripts/disarm_trap_modal.gd +++ b/scripts/disarm_trap_modal.gd @@ -65,7 +65,7 @@ func start_disarming() -> void: disarm_button_container.add_child(icon) confirmation_dialog.visible = false disarm_window.visible = true - timer.start(3 + (2 * len(disarm_buttons) * randf_range(.75, 1.25) )) + timer.start(2 + (len(disarm_buttons) * randf_range(.75, 1.25) )) func try_advance(btn : int) -> void: @@ -91,7 +91,9 @@ func button_pressed(event : InputEventAction) -> void: match(event.action): "detonate": start_disarming() - "attack": + "attack": + var trap = Game.level.get_square_trap(square) + trap.disarming = false Game.player.close_modal() _: return diff --git a/scripts/gas_emitter.gd b/scripts/gas_emitter.gd new file mode 100644 index 0000000..fbef75a --- /dev/null +++ b/scripts/gas_emitter.gd @@ -0,0 +1,46 @@ +extends Node3D + +var gas_square_template = preload("res://templates/gas_square.tscn") +var cycles : int = 3 +var square : Vector3i = Vector3i(2,0,0) +var squares : Dictionary[Vector3i, bool] = {} +var last_spread : Array[Vector3i] +var trap_owner : int +var damage : int = 4 + +func _ready() -> void: + emit_gas.call_deferred(square) + last_spread = [square] + squares[square] = true + +func _on_timeout() -> void: + cycles -= 1 + if cycles <= 0: + queue_free() + return + spread() + +func spread() -> void: + var new_squares : Dictionary[Vector3i, bool] = {} + for square in last_spread: + for i in range(-1, 2): + for j in range(-1, 2): + for k in range(-1, 2): + var ts = square + Vector3i(i, j, k) + new_squares[square + Vector3i(i, j, k)] = true + last_spread = [] + for square in new_squares.keys(): + if squares.has(square): + continue + var floor_square = square + Vector3i(0,-1,0) + if(Game.level.floor_layer.get_cell_item(floor_square) == GridMap.INVALID_CELL_ITEM + and Game.level.ramp_layer.get_cell_item(floor_square) == GridMap.INVALID_CELL_ITEM): + continue + last_spread.append(square) + squares[square] = true + emit_gas(square) + +func emit_gas(square) -> void: + var gas = gas_square_template.instantiate() + gas.setup(trap_owner, damage) + Game.level.add_vfx(gas, square) diff --git a/scripts/gas_emitter.gd.uid b/scripts/gas_emitter.gd.uid new file mode 100644 index 0000000..188959a --- /dev/null +++ b/scripts/gas_emitter.gd.uid @@ -0,0 +1 @@ +uid://b06ywr7w0wigy diff --git a/scripts/gas_square.gd b/scripts/gas_square.gd new file mode 100644 index 0000000..9de71f8 --- /dev/null +++ b/scripts/gas_square.gd @@ -0,0 +1,27 @@ +extends Area3D + +@onready var particles : GPUParticles3D = %ParticleFX +var trap_owner : int +var damage : int +var time_remaining : float + + +func _ready() -> void: + particles.emitting = true + +func _physics_process(delta: float) -> void: + for body in get_overlapping_bodies(): + body.poison(damage, 2.0) + time_remaining -= delta + if time_remaining <= 0: + queue_free() + +func setup(owner, damage) -> void: + self.trap_owner = trap_owner + self.damage = damage + time_remaining = 2.0 + +func _on_body_entered(body: Node3D) -> void: + if body.can_hurt(): + body.hurt(damage) + body.poison(damage, 2.0) diff --git a/scripts/gas_square.gd.uid b/scripts/gas_square.gd.uid new file mode 100644 index 0000000..7580393 --- /dev/null +++ b/scripts/gas_square.gd.uid @@ -0,0 +1 @@ +uid://6xmp5cbmjrbw diff --git a/scripts/healthbar.gd b/scripts/healthbar.gd index 7bd37c2..a579577 100644 --- a/scripts/healthbar.gd +++ b/scripts/healthbar.gd @@ -1,6 +1,7 @@ class_name HealthBar extends TextureProgressBar - +@export var healthy_gradient : GradientTexture1D +@export var poisoned_gradient : GradientTexture1D # Called when the node enters the scene tree for the first time. func _ready() -> void: pass # Replace with function body. @@ -13,3 +14,6 @@ func _process(delta: float) -> void: func _on_health_changed(current : int, max : int) -> void: max_value = max value = current + +func _on_poison_status_changed(poisoned : bool) -> void: + texture_progress = poisoned_gradient if poisoned else healthy_gradient diff --git a/scripts/hud.gd b/scripts/hud.gd index 9b8c395..17bc4c0 100644 --- a/scripts/hud.gd +++ b/scripts/hud.gd @@ -2,12 +2,26 @@ class_name HUD extends Control @onready var trap_display : TrapDisplay = %TrapDisplay @onready var p1_healthbar : HealthBar = %P1HealthBar +@onready var control_display : ControlDisplay = %ControlDisplay +@onready var ammo_label : Label = %AmmoLabel func _ready() -> void: Game.hud = self func register_player(player : Player) -> void: player.health_changed.connect(p1_healthbar._on_health_changed) + player.poison_status_changed.connect(p1_healthbar._on_poison_status_changed) trap_display._on_trap_list_changed(player.data.traps, player.data.active_trap) player.trap_cycled.connect(trap_display._on_trap_cycled) player.trap_quantity_changed.connect(trap_display._on_trap_quantity_changed) player.trap_list_changed.connect(trap_display._on_trap_list_changed) + player.combat_target_changed.connect(control_display._on_melee_range_changed) + player.ammo_changed.connect(_on_ammo_changed) + set_ammo(player.ammo) + +func set_ammo(ammo : int) -> void: + ammo_label.text = str(ammo) + ammo_label.modulate = Color.DIM_GRAY if ammo == 0 else Color.WHITE + +func _on_ammo_changed(current : int, max : int) -> void: + set_ammo(current) + diff --git a/scripts/level_camera.gd b/scripts/level_camera.gd index 6975942..9d4be37 100644 --- a/scripts/level_camera.gd +++ b/scripts/level_camera.gd @@ -1,19 +1,48 @@ -extends Camera3D +class_name PlayerCamera extends Camera3D var target -var offset : Vector3 +var player_offset : Vector3 + +@export var decay = 0.9 # How quickly the shaking stops [0, 1]. +@export var max_offset = Vector2(2, 1.5) # Maximum hor/ver shake in pixels. + +@export var noise : FastNoiseLite +var noise_y = 0 + +var trauma = 0.0 # Current shake strength. +var trauma_power = 2 # Trauma exponent. Use [2, 3]. func _enter_tree() -> void: call_deferred("register_player") - +func _ready() -> void: + randomize() + noise.seed = randi() + func register_player() -> void: target = Game.player + target.camera = self if target: - offset = global_position - target.global_position - + player_offset = global_position - target.global_position +func add_trauma(amount): + trauma = min(trauma + amount, 1.0) + func _process(delta: float) -> void: if target: - global_position = target.global_position + offset + global_position = target.global_position + player_offset + if trauma: + trauma = max(trauma - decay * delta, 0) + shake() + else: + h_offset = 0 + v_offset = 0 + +func shake(): + noise_y += .1 + var amount = pow(trauma, trauma_power) + var n_val = noise.get_noise_2d(noise.seed*2, noise_y) + h_offset = max_offset.x * amount * randf_range(-1, 1) + v_offset = max_offset.y * amount * randf_range(-1, 1) + print("%f %f" % [h_offset, v_offset]) diff --git a/scripts/pawn_body.gd b/scripts/pawn_body.gd new file mode 100644 index 0000000..e66a758 --- /dev/null +++ b/scripts/pawn_body.gd @@ -0,0 +1,10 @@ +class_name PawnBody extends Node3D + +@export var projectile_template : PackedScene + +@onready var anim_player : AnimationPlayer = %AnimationPlayer +@onready var ranged_point : Node3D = %RangedPoint +@onready var material : StandardMaterial3D = $Mesh.material + +func play_animation(anim_name : String) -> void: + anim_player.play(anim_name) diff --git a/scripts/pawn_body.gd.uid b/scripts/pawn_body.gd.uid new file mode 100644 index 0000000..0923383 --- /dev/null +++ b/scripts/pawn_body.gd.uid @@ -0,0 +1 @@ +uid://wye3mat5y5yg diff --git a/scripts/player.gd b/scripts/player.gd index efe5b80..6189bdb 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -1,46 +1,131 @@ class_name Player extends CharacterBody3D +enum State { + NORMAL, + KNOCKDOWN, + KNOCKUP, + FLUNG, + BOUND, + DEAD +} + const trap_template = preload("res://templates/trap.tscn") const remove_trap_modal = preload("res://templates/remove_trap_modal.tscn") const disarm_trap_modal = preload("res://templates/disarm_trap_modal.tscn") @export var speed : float = 10 -@onready var body = $Body +@onready var body : PawnBody = $PawnBody @onready var data : PlayerData = $Data @onready var trap_sound : AudioStreamPlayer3D = $TrapSound +@onready var detonate_sound : AudioStreamPlayer3D = $DetonateSound +@onready var detect_sound : AudioStreamPlayer3D = $DetectSound +@onready var reload_sound : AudioStreamPlayer3D = $PawnBody/ReloadSound +@onready var detect_icon : Sprite3D = $DetectIcon var id : int = 1 +var state : State var button_actions : Dictionary[int, String] var current_square : Vector3i +var facing : Vector3 var detecting : bool = false var detect_squares : Dictionary[Vector3i, bool] = {} +var detect_tween : Tween = null +var fling_direction : Vector3 +var fling_speed : float + +var poison_strength : int = 0 +var poison_time_remaining : float = 0 +var poison_pulse_timer : float + +var melee_range : float = 3.0 +var ranged_range : float = 6 +var attack_timer : float = 0 +var melee_recovery_time : float = .75 +var ranged_recovery_time : float = .2 +var ranged_reload_time : float = 1 +var projectile_speed : float = 10.0 +var projectile_damage : int = 4 +var ammo = 5 +var max_ammo = 5 +var combat_target +var meleeing : bool = false var input_locked : bool = false var action_tween : Tween = null + +var camera : PlayerCamera = null + var modal = null -signal trap_cycled(trap_index) -signal trap_quantity_changed(trap_index, quantity) +signal trap_cycled(trap_index : int) +signal trap_quantity_changed(trap_index : int, quantity : int) signal trap_list_changed(traps) signal health_changed(current : int, max : int) - +signal poison_status_changed(poisoned : bool) +signal combat_target_changed(melee : bool) +signal ammo_changed(current : int, max : int) + func _physics_process(delta: float) -> void: + if attack_timer > 0: + attack_timer -= delta + check_attack_target() + if is_poisoned(): + poison_time_remaining -= delta + poison_pulse_timer += delta + if poison_pulse_timer >= 1.0: + poison_pulse_timer -= 1.0 + hurt(poison_strength) + if poison_time_remaining <= 0: + var pshader : ShaderMaterial = body.material.next_pass + pshader.set_shader_parameter("strength", 0) + poison_status_changed.emit(false) + var dir = Input.get_vector("west", "east", "north", "south") dir = Vector3(dir.x, 0, dir.y) if input_locked or modal != null: dir = Vector3.ZERO - if dir.length_squared() > 0: + if state == State.FLUNG: + dir = fling_direction + body.look_at(body.global_position - dir) + var down = 0 + if !is_on_floor(): + down = velocity.y + get_gravity().y * delta + velocity = fling_speed * dir + #Raycast for a wall + var space_state = get_world_3d().direct_space_state + # use global coordinates, not local to node + var start = global_position + Vector3(0,0.25,0) + var end = start + velocity.normalized() * 0.25 + velocity * 2 * delta + var query = PhysicsRayQueryParameters3D.create(start, end, 1|2, [self]) + var result = space_state.intersect_ray(query) + if result: + var opp : Player = result.collider as Player + if opp: + opp.knockdown(fling_direction) + opp.hurt(10) + knockdown(-fling_direction) + hurt(10) + else: + velocity += Vector3(0, down, 0) + + move_and_slide() + elif dir.length_squared() > 0: + facing = dir.normalized() + var down = 0 + if !is_on_floor(): + down = velocity.y + get_gravity().y * delta body.look_at(body.global_position - dir) velocity = speed * dir + if is_poisoned(): + velocity *= 0.5 if detecting: - velocity /= 3 - if !is_on_floor(): - velocity += get_gravity() + velocity *= .33 + velocity += Vector3(0, down, 0) move_and_slide() elif !is_on_floor(): - velocity = get_gravity() + velocity += get_gravity() * delta move_and_slide() if detecting: @@ -60,18 +145,101 @@ func _physics_process(delta: float) -> void: evt.action = button evt.pressed = true modal.button_pressed(evt) - else: + elif state == State.NORMAL: if Input.is_action_just_pressed("left cycle trap"): cycle_active_trap(-1) if Input.is_action_just_pressed("right cycle trap"): cycle_active_trap(1) - if Input.is_action_just_pressed("detect"): + if Input.is_action_just_pressed("detonate"): + detonate() + elif Input.is_action_just_pressed("detect"): start_detecting() elif Input.is_action_just_released("detect"): stop_detecting() - if !detecting and Input.is_action_just_pressed("lay trap"): + elif !detecting and Input.is_action_just_pressed("lay trap"): try_lay_trap() + elif Input.is_action_pressed("attack"): + attack() +func attack() -> void: + if attack_timer > 0: + return + if meleeing: + body.play_animation("melee") + attack_timer = melee_recovery_time + else: + if ammo <= 0: + reload_sound.play() + ammo = max_ammo + attack_timer = ranged_reload_time + ammo_changed.emit(ammo, max_ammo) + return + + ammo-=1 + ammo_changed.emit(ammo, max_ammo) + attack_timer = ranged_recovery_time + body.play_animation("shoot") + if combat_target != null: + var v = body.global_position.direction_to(combat_target.global_position) + v.y = 0 + body.look_at(body.global_position - v) + +func fire_ranged() -> void: + var shot = body.projectile_template.instantiate() + var tdir : Vector3 = Vector3.ZERO + shot.speed = projectile_speed + tdir = body.ranged_point.global_position.direction_to(combat_target.global_position) if combat_target else facing + shot.direction = tdir + shot.damage = projectile_damage + shot.position = body.ranged_point.global_position + Game.level.add_projectile(shot) + +func check_attack_target() -> void: + var ranged_closest = null + var ranged_d_sq = 99999999 + var melee_closest = null + var melee_d_sq = 99999999 + var ranged_sq = ranged_range * ranged_range + var melee_sq = melee_range * melee_range + var space_state = get_world_3d().direct_space_state + + combat_target = null + # use global coordinates, not local to node + for target : Node3D in get_tree().get_nodes_in_group("combat"): + if target == self: + continue + #Check to see if they're within the correct direction + var angle = abs(facing.angle_to(target.global_position - global_position)) + if angle > PI / 4.0: + continue + #Determine if they're within shot range + var d_sq = global_position.distance_squared_to(target.global_position) + if(d_sq > ranged_sq or(ranged_closest != null and ranged_d_sq <= d_sq)): + continue + + #Raycast to see if they're a valid target + var start = global_position + Vector3(0,1,0) + var end = target.global_position + Vector3(0,1,0) + var query = PhysicsRayQueryParameters3D.create(start, end, 1|2, [self]) + var result = space_state.intersect_ray(query) + if !result or (result.collider is not Player and result.collider is not CombatTarget): + return + + if d_sq < melee_sq: + melee_closest = target + melee_d_sq = d_sq + else: + ranged_closest = target + ranged_d_sq = d_sq + if melee_closest != null: + meleeing = true + combat_target = melee_closest + else: + meleeing = false + if ranged_closest != null: + combat_target = ranged_closest + combat_target_changed.emit(melee_closest != null) + func try_lay_trap() -> void: if !is_on_floor(): return @@ -93,8 +261,9 @@ func try_lay_trap() -> void: func lay_trap(square : Vector3i, idx : int) -> void: var type : Trap.Type = data.traps[idx].type var trap = trap_template.instantiate() - trap.setup(type, Multiplayer.id) + trap.setup(type, facing, id) trap.disarmed.connect(_on_trap_disarmed) + trap.activated.connect(_on_trap_activated) data.traps[idx].quantity -= 1 trap_quantity_changed.emit(idx, data.traps[idx].quantity) Game.level.add_trap(trap, square) @@ -125,12 +294,19 @@ func update_detecting() -> void: var remove_list = [] + var trap_detected : bool = false for sq in new_squares.keys(): if detect_squares.has(sq): continue if !Game.level.detect_square(sq, true): remove_list.append(sq) - + else: + var trap = Game.level.get_square_trap(sq + Vector3i(0,1,0)) + if trap and trap.is_just_revealed(): + trap_detected = true + if trap_detected: + detect_alert() + detect_squares = new_squares for key in remove_list: detect_squares.erase(key) @@ -140,9 +316,20 @@ func update_detecting() -> void: if trap.trap_owner == Multiplayer.id: show_remove_trap_modal() else: + trap.disarming = true show_disarm_trap_modal() +func detect_alert() -> void: + detect_sound.play() + detect_icon.visible = true + if detect_tween != null: + detect_tween.stop() + detect_tween = create_tween() + detect_tween.tween_interval(.75) + detect_tween.tween_property(detect_icon, "visible", false, 0) + detect_tween.tween_property(self, "detect_tween", null, 0) + func close_modal() -> void: modal.queue_free() modal = null @@ -175,11 +362,16 @@ func start_detecting() -> void: detect_squares[sq] = true var remove_list = [] - + var trap_detected : bool = false for sq in detect_squares.keys(): if !Game.level.detect_square(sq, true): remove_list.append(sq) - + else: + var trap = Game.level.get_square_trap(sq + Vector3i(0,1,0)) + if trap and trap.is_just_revealed(): + trap_detected = true + if trap_detected: + detect_alert() for key in remove_list: detect_squares.erase(key) @@ -221,6 +413,9 @@ func cycle_active_trap(dir) -> void: if prev != data.active_trap: trap_cycled.emit(data.active_trap) +func can_hurt() -> bool: + return true + func hurt(damage : int) -> void: data.life = max(0, data.life - damage) health_changed.emit(data.life, data.max_life) @@ -232,3 +427,58 @@ func _on_trap_disarmed(type : Trap.Type) -> void: d.max -= 1 trap_quantity_changed.emit(i, d.quantity) break + +func _on_trap_activated(type : Trap.Type) -> void: + for i in range(len(data.traps)): + var d = data.traps[i] + if d.type == type: + d.quantity = min(d.max, d.quantity+ 1) + trap_quantity_changed.emit(i, d.quantity) + break + +func detonate() -> void: + var switch_list = [] + for trap : Trap in Game.level.traps.values(): + if trap.type == Trap.Type.SWITCH and trap.trap_owner == id: + switch_list.append(trap) + detonate_sound.play() + + for trap : Trap in switch_list: + trap.activate() + +func is_poisoned() -> bool: + return poison_time_remaining > 0 + +func poison(damage : int, length : float) -> void: + if is_poisoned(): + if damage > poison_strength: + poison_strength = damage + if length > poison_time_remaining: + poison_time_remaining = length + else: + poison_strength = damage + poison_time_remaining = length + poison_pulse_timer = 0 + var pshader : ShaderMaterial = body.material.next_pass + pshader.set_shader_parameter("strength", 0.5) + poison_status_changed.emit(true) + +func fling(direction : Vector3, speed : float) -> void: + state = State.FLUNG + fling_direction = direction + fling_speed = speed + +func knockdown(direction : Vector3) -> void: + state = State.KNOCKDOWN + input_locked = true + body.look_at(Vector3(0,1,0), direction) + var knockdown_tween = create_tween() + knockdown_tween.tween_interval(1.5) + knockdown_tween.tween_property(self, "state", State.NORMAL, 0) + knockdown_tween.tween_property(self, "input_locked", false, 0) + knockdown_tween.tween_callback(Callable(body.look_at).bind(facing, Vector3(0,1,0))) + +func knockup(velocity : Vector3) -> void: + state = State.KNOCKUP + input_locked = true + diff --git a/scripts/projectile.gd b/scripts/projectile.gd new file mode 100644 index 0000000..9617d13 --- /dev/null +++ b/scripts/projectile.gd @@ -0,0 +1,23 @@ +class_name Projectile extends RigidBody3D + +var direction : Vector3 +var speed : float +var damage +var time_remaining : float +func _ready() -> void: + linear_velocity = speed * direction + time_remaining = 2 + +func _physics_process(delta: float) -> void: + time_remaining -= delta + if time_remaining <= 0: + queue_free() + +func _on_body_entered(body: Node) -> void: + queue_free() + + + +func _on_hit_area_entered(body: Node3D) -> void: + if body is Player: + body.hurt(damage) diff --git a/scripts/projectile.gd.uid b/scripts/projectile.gd.uid new file mode 100644 index 0000000..9657520 --- /dev/null +++ b/scripts/projectile.gd.uid @@ -0,0 +1 @@ +uid://dqmdowebyfwbq diff --git a/scripts/remove_trap_modal.gd b/scripts/remove_trap_modal.gd index aa53c4d..b4f14bb 100644 --- a/scripts/remove_trap_modal.gd +++ b/scripts/remove_trap_modal.gd @@ -7,6 +7,6 @@ func button_pressed(event : InputEventAction) -> void: "detonate": Game.player.remove_trap_at(square) Game.player.close_modal() - "attack": + "attack": Game.player.close_modal() _: return diff --git a/scripts/test_level.gd b/scripts/test_level.gd index c0c1703..a2aa64d 100644 --- a/scripts/test_level.gd +++ b/scripts/test_level.gd @@ -4,6 +4,7 @@ const player_controller = preload("res://templates/singleplayer_pc.tscn") const trap_template = preload("res://templates/trap.tscn") @onready var floor_layer : GridMap = %Floor +@onready var ramp_layer : GridMap = %Ramps @onready var marker_layer : GridMap = %Markers @export var difficulty : int = 1 @@ -14,12 +15,14 @@ func _ready() -> void: Game.level = self var player = player_controller.instantiate() var traps : Array[PlayerData.TrapData] = [ + PlayerData.TrapData.new(Trap.Type.FORCE_PANEL, 3, 3), PlayerData.TrapData.new(Trap.Type.BOMB, 3, 3), PlayerData.TrapData.new(Trap.Type.SWITCH, 3, 3), - PlayerData.TrapData.new(Trap.Type.MINE, 3, 3) + PlayerData.TrapData.new(Trap.Type.MINE, 3, 3), + PlayerData.TrapData.new(Trap.Type.GAS, 3, 3) ] add_child(player) - generate_trap(Trap.Type.MINE, Vector3i(5,0,2)) + generate_trap(Trap.Type.FORCE_PANEL, Vector3(-1, 0, 0), Vector3i(5,0,2)) player.setup(traps) func is_square_detected(crd) -> bool: @@ -44,7 +47,12 @@ func add_trap(trap : Trap, crd : Vector3i) -> void: traps[crd] = trap trap.global_position = Vector3(crd) + Vector3(.5, 0, .5) add_child(trap) - pass + +func add_projectile(shot : Projectile) -> void: + add_child(shot) + +func remove_trap_square(crd : Vector3i) -> void: + traps.erase(crd) func get_square_trap(crd : Vector3i) -> Trap: if traps.has(crd): @@ -52,6 +60,8 @@ func get_square_trap(crd : Vector3i) -> Trap: else: return null + + func is_valid_trap_square(crd : Vector3i) -> bool: if floor_layer.get_cell_item(crd + Vector3i(0,-1,0)) == GridMap.INVALID_CELL_ITEM: return false @@ -68,9 +78,9 @@ func activate_trap(crd : Vector3i) -> void: #if trap: -func generate_trap(type : Trap.Type, square : Vector3i): +func generate_trap(type : Trap.Type, dir : Vector3, square : Vector3i): var trap = trap_template.instantiate() - trap.setup(type, -1) + trap.setup(type, dir, -1) add_trap(trap, square) func disarm_trap(crd : Vector3i) -> void: diff --git a/scripts/trap.gd b/scripts/trap.gd index 27f8623..ae0699e 100644 --- a/scripts/trap.gd +++ b/scripts/trap.gd @@ -26,40 +26,64 @@ const trap_icons : Dictionary = { Trap.Type.MINE : preload("res://visuals/images/icons/t-mine.png"), } -const explosion_template = preload("res://templates/explosion.tscn") +const bomb_explosion_template = preload("res://templates/explosion.tscn") +const mine_explosion_template = preload("res://templates/explosion.tscn") +const switch_explosion_template = preload("res://templates/explosion.tscn") +const gas_emitter_template = preload("res://templates/gas_emitter.tscn") @onready var range_area : Area3D = %RangeArea @onready var range_shape : BoxShape3D = %RangeShape.shape @onready var model : MeshInstance3D = %Model @onready var icon : Sprite3D = %Icon +@onready var force_strip : Sprite3D = %ForceStrip @onready var material : StandardMaterial3D = model.get_surface_override_material(0) @onready var reveal_timer : Timer = %RevealTimer +@onready var activation_timer : Timer = %ActivationTimer + var type : Type var square : Vector3i var trap_owner : int +var direction : Vector3 var disarming : bool var disarm_id : int +var delayed_trigger_tween : Tween = null + var damage : int = 10 +var just_revealed : bool = false + signal disarmed(type : Trap.Type) +signal activated(type : Trap.Type) - -func setup(type : Type, trap_owner : int) -> void: +func setup(type : Type, direction : Vector3, trap_owner : int) -> void: self.type = type self.trap_owner = trap_owner + if type == Type.FORCE_PANEL: + var r : float = atan2(direction.z, direction.x) + var cardinal : float = roundi(r * 2 / PI) * PI / 2 + self.direction = Vector3(cos(cardinal), 0, sin(cardinal)) func disarm() -> void: disarmed.emit(type) queue_free() func reveal() -> void: + if model.visible: + return model.visible = true reveal_timer.start(5) + just_revealed = true + +func is_just_revealed() -> bool: + return just_revealed + +func is_revealed() -> bool: + return model.visible func _on_reveal_timeout() -> void: - if Game.level.is_square_detected(square): + if Game.level.is_square_detected(square) or disarming: reveal_timer.start(5) else: model.visible = false @@ -71,15 +95,87 @@ func _ready() -> void: icon.visible = owns_trap range_shape.size = range_shapes[type] material.albedo_color = Color.YELLOW if owns_trap else Color.RED + match(type): + Type.BOMB: + damage = 15 + Type.MINE: + damage = 10 + Type.SWITCH: + damage = 5 + Type.GAS: + activation_timer.start() + Type.FORCE_PANEL: + var r : float = atan2(direction.z, -direction.x) + PI/2 + force_strip.rotate_y(r) + force_strip.visible = true + +func _process(delta: float) -> void: + just_revealed = false + +func blast(body : Player) -> void: + body.hurt(damage) func activate() -> void: - var exp = explosion_template.instantiate() - Game.level.add_vfx(exp, square) + var explode : bool = false + match(type): + Type.FORCE_PANEL: + for body in get_overlapping_bodies(): + body.fling(direction, 5.0) + Type.MINE: + var exp = mine_explosion_template.instantiate() + Game.level.add_vfx(exp, square) + explode = true + Type.SWITCH: + var exp = switch_explosion_template.instantiate() + Game.level.add_vfx(exp, square) + explode = true + Type.BOMB: + var exp = bomb_explosion_template.instantiate() + Game.level.add_vfx(exp, square) + explode = true + Type.GAS: + var emitter = gas_emitter_template.instantiate() + emitter.trap_owner = trap_owner + emitter.square = square + emitter.damage = 4 + Game.level.add_vfx(emitter, square) + + if explode: + trigger_adjacent_bombs() + blast_players() + + Game.level.remove_trap_square(square) + activated.emit(type) + queue_free() + +func trigger_adjacent_bombs() -> void: + for trap : Trap in range_area.get_overlapping_areas(): + if trap.type == Type.BOMB: + trap.delay_trigger() + +func blast_players() -> void: for body in range_area.get_overlapping_bodies(): - body.hurt(damage) - #match(type): + blast(body) + +func delay_trigger() -> void: + if delayed_trigger_tween != null: + return + delayed_trigger_tween = create_tween() + delayed_trigger_tween.tween_interval(.25) + delayed_trigger_tween.tween_callback(activate) + func _on_body_entered(body: Node3D) -> void: + if type == Type.GAS: + return + + if body.id == trap_owner: + return + if !disarming or body.id != disarm_id: if !body.detecting: activate() + + +func _on_activation_timer_timeout() -> void: + activate() diff --git a/scripts/trap_fx.gd b/scripts/trap_fx.gd index 8197dd5..71717d9 100644 --- a/scripts/trap_fx.gd +++ b/scripts/trap_fx.gd @@ -15,6 +15,10 @@ func proximal_shake(distance : float) -> void: if !Game.player: return var d = global_position.distance_squared_to(Game.player.global_position) - if d <= distance * distance: - Input.start_joy_vibration(0, 1,1,1000) + var d_sq = distance * distance + if d <= d_sq: + var str : float = (d_sq - d) / d_sq + var l_val : float = lerp(0.0, 1.0, str) + Input.start_joy_vibration(0, l_val,l_val,lerp(0.5, 1.0, str)) + Game.player.camera.add_trauma(l_val) diff --git a/templates/HUD.tscn b/templates/HUD.tscn index 484b841..6a30666 100644 --- a/templates/HUD.tscn +++ b/templates/HUD.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=31 format=3 uid="uid://bgocskbofewsr"] +[gd_scene load_steps=36 format=3 uid="uid://bgocskbofewsr"] [ext_resource type="Script" uid="uid://bm50jiya4s3ei" path="res://scripts/hud.gd" id="1_jiiqi"] [ext_resource type="Texture2D" uid="uid://dri0a20l6kpbj" path="res://visuals/images/icon.svg" id="1_k5de2"] @@ -27,7 +27,17 @@ [ext_resource type="Texture2D" uid="uid://diyks5oxgidoo" path="res://visuals/images/icons/ranged attack button.png" id="19_k0acs"] [ext_resource type="Texture2D" uid="uid://0ujjkgwiyveu" path="res://visuals/images/icons/lit ranged attack button.png" id="20_vhta5"] [ext_resource type="Texture2D" uid="uid://barbcaa2xvgkk" path="res://visuals/images/icons/switch button.png" id="21_iv5le"] +[ext_resource type="Script" uid="uid://ci7vc41m5alq5" path="res://scripts/control_display.gd" id="21_jiiqv"] [ext_resource type="Texture2D" uid="uid://bd0xwm4wuuiuo" path="res://visuals/images/icons/lit switch button.png" id="22_1ghxf"] +[ext_resource type="Texture2D" uid="uid://bg0h4l3162pn5" path="res://visuals/images/icons/melee attack button.png" id="28_jf5vi"] +[ext_resource type="Texture2D" uid="uid://c64lykkbavdmi" path="res://visuals/images/icons/lit melee attack button.png" id="29_deun7"] + +[sub_resource type="Gradient" id="Gradient_iv5le"] +offsets = PackedFloat32Array(0, 0.59079283, 1) +colors = PackedColorArray(0.33862844, 7.9006626e-05, 0.33938414, 1, 0, 0.36556464, 0, 1, 0.6879359, 1, 0, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_1ghxf"] +gradient = SubResource("Gradient_iv5le") [sub_resource type="Gradient" id="Gradient_1ghxf"] @@ -88,6 +98,8 @@ value = 100.0 nine_patch_stretch = true texture_progress = ExtResource("3_vhta5") script = ExtResource("4_iv5le") +healthy_gradient = ExtResource("3_vhta5") +poisoned_gradient = SubResource("GradientTexture1D_1ghxf") [node name="PanelContainer2" type="PanelContainer" parent="Control/PanelContainer/HBoxContainer/VBoxContainer2"] custom_minimum_size = Vector2(250, 100) @@ -227,7 +239,8 @@ offset_bottom = 104.0 texture = ExtResource("18_iv5le") expand_mode = 1 -[node name="Label" type="Label" parent="Control/PanelContainer/HBoxContainer/VBoxContainer/PanelContainer3/Control"] +[node name="AmmoLabel" type="Label" parent="Control/PanelContainer/HBoxContainer/VBoxContainer/PanelContainer3/Control"] +unique_name_in_owner = true layout_mode = 0 offset_left = 141.0 offset_top = 29.0 @@ -281,7 +294,8 @@ expand_mode = 1 custom_minimum_size = Vector2(165, 0) layout_mode = 2 -[node name="Control2" type="Control" parent="."] +[node name="ControlDisplay" type="Control" parent="."] +unique_name_in_owner = true layout_mode = 1 anchors_preset = 2 anchor_top = 1.0 @@ -289,8 +303,9 @@ anchor_bottom = 1.0 offset_top = -200.0 offset_right = 200.0 grow_vertical = 0 +script = ExtResource("21_jiiqv") -[node name="Trap" type="TextureButton" parent="Control2"] +[node name="Trap" type="TextureButton" parent="ControlDisplay"] layout_mode = 0 offset_left = 13.0 offset_top = 71.0 @@ -304,7 +319,7 @@ texture_pressed = ExtResource("16_aid7k") ignore_texture_size = true stretch_mode = 0 -[node name="Detect" type="TextureButton" parent="Control2"] +[node name="Detect" type="TextureButton" parent="ControlDisplay"] layout_mode = 0 offset_left = 68.0 offset_top = 35.0 @@ -318,7 +333,7 @@ texture_pressed = ExtResource("18_yda1o") ignore_texture_size = true stretch_mode = 0 -[node name="RangedAttack" type="TextureButton" parent="Control2"] +[node name="RangedAttack" type="TextureButton" parent="ControlDisplay"] layout_mode = 0 offset_left = 123.0 offset_top = 71.0 @@ -332,7 +347,22 @@ texture_pressed = ExtResource("20_vhta5") ignore_texture_size = true stretch_mode = 0 -[node name="Switch" type="TextureButton" parent="Control2"] +[node name="MeleeAttack" type="TextureButton" parent="ControlDisplay"] +visible = false +layout_mode = 0 +offset_left = 123.0 +offset_top = 71.0 +offset_right = 187.0 +offset_bottom = 135.0 +mouse_filter = 2 +toggle_mode = true +button_mask = 0 +texture_normal = ExtResource("28_jf5vi") +texture_pressed = ExtResource("29_deun7") +ignore_texture_size = true +stretch_mode = 0 + +[node name="Switch" type="TextureButton" parent="ControlDisplay"] layout_mode = 0 offset_left = 68.0 offset_top = 110.0 diff --git a/templates/bullet.tscn b/templates/bullet.tscn new file mode 100644 index 0000000..8ee53a8 --- /dev/null +++ b/templates/bullet.tscn @@ -0,0 +1,46 @@ +[gd_scene load_steps=4 format=3 uid="uid://cfunlbp8arnlh"] + +[ext_resource type="Script" uid="uid://dqmdowebyfwbq" path="res://scripts/projectile.gd" id="1_tc5n7"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fnprb"] +albedo_color = Color(1, 0.54124093, 0.4767593, 1) +emission_enabled = true +emission = Color(1, 0, 0, 1) +emission_energy_multiplier = 2.69 + +[sub_resource type="BoxShape3D" id="BoxShape3D_7i3j4"] +size = Vector3(0.15, 0.15, 0.15) + +[node name="Bullet" type="RigidBody3D"] +gravity_scale = 0.0 +contact_monitor = true +max_contacts_reported = 3 +script = ExtResource("1_tc5n7") + +[node name="CSGSphere3D" type="CSGSphere3D" parent="."] +transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0) +radius = 0.05 +radial_segments = 4 +rings = 3 +material = SubResource("StandardMaterial3D_fnprb") + +[node name="HitArea" type="Area3D" parent="."] +collision_layer = 0 +collision_mask = 2 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="HitArea"] +shape = SubResource("BoxShape3D_7i3j4") + +[node name="CollisionShape3D2" type="CollisionShape3D" parent="."] +shape = SubResource("BoxShape3D_7i3j4") + +[node name="OmniLight3D" type="OmniLight3D" parent="."] +light_color = Color(1, 0, 0, 1) +light_energy = 1.5 +light_indirect_energy = 0.0 +light_volumetric_fog_energy = 0.0 +light_size = 0.2 +omni_range = 0.4 + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] +[connection signal="body_entered" from="HitArea" to="." method="_on_hit_area_entered"] diff --git a/templates/explosion.tscn b/templates/explosion.tscn index f42e402..b4edd79 100644 --- a/templates/explosion.tscn +++ b/templates/explosion.tscn @@ -269,7 +269,7 @@ process_material = SubResource("ParticleProcessMaterial_6ym0g") draw_pass_1 = SubResource("SphereMesh_4y8np") [node name="ParticleFX" type="GPUParticles3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4375714, 0, 0.5602956) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0, 0.5) material_override = ExtResource("2_l2v4y") amount = 10 lifetime = 0.6 diff --git a/templates/gas_emitter.tscn b/templates/gas_emitter.tscn new file mode 100644 index 0000000..2493851 --- /dev/null +++ b/templates/gas_emitter.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=2 format=3 uid="uid://cwway5752qsea"] + +[ext_resource type="Script" uid="uid://b06ywr7w0wigy" path="res://scripts/gas_emitter.gd" id="1_4dy13"] + +[node name="Gas Emitter" type="Node3D"] +script = ExtResource("1_4dy13") + +[node name="SpreadTimer" type="Timer" parent="."] +wait_time = 1.25 +autostart = true + +[connection signal="timeout" from="SpreadTimer" to="." method="_on_timeout"] diff --git a/templates/gas_square.tscn b/templates/gas_square.tscn new file mode 100644 index 0000000..89dd60a --- /dev/null +++ b/templates/gas_square.tscn @@ -0,0 +1,90 @@ +[gd_scene load_steps=14 format=3 uid="uid://p6gfy3gdm4fu"] + +[ext_resource type="Texture2D" uid="uid://qs7mgm4vors6" path="res://visuals/textures/T_smoke_b7.png" id="1_i2t7o"] +[ext_resource type="Script" uid="uid://6xmp5cbmjrbw" path="res://scripts/gas_square.gd" id="1_nit1s"] +[ext_resource type="AudioStream" uid="uid://bk4s3yn7473pc" path="res://audio/sounds/gas_leak_med_burst_01.wav" id="3_6ouu1"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_oxb7l"] +transparency = 1 +vertex_color_use_as_albedo = true +vertex_color_is_srgb = true +albedo_texture = ExtResource("1_i2t7o") +billboard_mode = 3 +billboard_keep_scale = true +particles_anim_h_frames = 1 +particles_anim_v_frames = 1 +particles_anim_loop = false +proximity_fade_enabled = true + +[sub_resource type="Curve" id="Curve_nit1s"] +_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.25201073, 0.5114823), 1.9835948, 1.9835948, 0, 0, Vector2(0.81233245, 0.4979124), -1.8980947, -1.8980947, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 4 + +[sub_resource type="CurveTexture" id="CurveTexture_6ouu1"] +curve = SubResource("Curve_nit1s") + +[sub_resource type="Gradient" id="Gradient_mcwmv"] +offsets = PackedFloat32Array(0, 0.5129683, 1) +colors = PackedColorArray(0, 1, 0, 1, 0.5660992, 0.4395883, 0.22195616, 1, 0.46846813, 0.00015392214, 0.46846473, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_3hj10"] +gradient = SubResource("Gradient_mcwmv") +use_hdr = true + +[sub_resource type="Curve" id="Curve_vcxlp"] +_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.36461127, 0.4979124), 0.0, 0.0, 0, 0, Vector2(0.71581775, 0.5318372), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] +point_count = 4 + +[sub_resource type="CurveTexture" id="CurveTexture_qumvk"] +curve = SubResource("Curve_vcxlp") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_6ur4r"] +particle_flag_rotate_y = true +emission_shape = 3 +emission_box_extents = Vector3(0.35, 0.1, 0.35) +angle_min = -179.99998 +angle_max = 180.00002 +direction = Vector3(0, 1, 0) +spread = 0.0 +initial_velocity_min = 1.0 +initial_velocity_max = 1.5 +angular_velocity_min = -50.000015 +angular_velocity_max = 49.99998 +gravity = Vector3(0, 0, 0) +scale_max = 1.35 +scale_curve = SubResource("CurveTexture_qumvk") +color = Color(1.5257139, 1.5257139, 1.5257139, 1) +color_ramp = SubResource("GradientTexture1D_3hj10") +alpha_curve = SubResource("CurveTexture_6ouu1") + +[sub_resource type="QuadMesh" id="QuadMesh_dws4p"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_mcwmv"] +size = Vector3(1, 2, 1) + +[node name="Gas Square" type="Area3D"] +collision_layer = 0 +collision_mask = 2 +script = ExtResource("1_nit1s") + +[node name="ParticleFX" type="GPUParticles3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0, 0.5) +material_override = SubResource("StandardMaterial3D_oxb7l") +emitting = false +amount = 25 +one_shot = true +explosiveness = 0.18 +fixed_fps = 60 +process_material = SubResource("ParticleProcessMaterial_6ur4r") +draw_pass_1 = SubResource("QuadMesh_dws4p") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_mcwmv") + +[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="."] +stream = ExtResource("3_6ouu1") +autoplay = true + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/templates/singleplayer_pc.tscn b/templates/singleplayer_pc.tscn index b007db3..0128554 100644 --- a/templates/singleplayer_pc.tscn +++ b/templates/singleplayer_pc.tscn @@ -1,20 +1,216 @@ -[gd_scene load_steps=7 format=3 uid="uid://c8xf3qawk5c6u"] +[gd_scene load_steps=30 format=3 uid="uid://c8xf3qawk5c6u"] [ext_resource type="Script" uid="uid://bcs7ygh6s3l35" path="res://scripts/player.gd" id="1_a5wj7"] +[ext_resource type="Script" uid="uid://wye3mat5y5yg" path="res://scripts/pawn_body.gd" id="2_ac3v1"] +[ext_resource type="Material" uid="uid://b8e84edfrnn1a" path="res://visuals/materials/pawn.tres" id="2_j3lta"] [ext_resource type="Script" uid="uid://6w608y2grdqb" path="res://scripts/player_data.gd" id="2_sfa2f"] +[ext_resource type="AudioStream" uid="uid://b8ko5lwikj8ts" path="res://audio/sounds/Whoosh Blade 001.wav" id="3_6r6k1"] +[ext_resource type="PackedScene" uid="uid://cfunlbp8arnlh" path="res://templates/bullet.tscn" id="3_ghbft"] [ext_resource type="AudioStream" uid="uid://cjrlb4qiy23sj" path="res://audio/sounds/impact_deep_thud_bounce_09.wav" id="3_sfa2f"] +[ext_resource type="AudioStream" uid="uid://dufoyvysi4pa1" path="res://audio/sounds/Whoosh Blade 002.wav" id="4_ac3v1"] +[ext_resource type="AudioStream" uid="uid://cfq0pu0qxgb6u" path="res://audio/sounds/134688__otbtechno__bike-bell.wav" id="4_xb5g3"] +[ext_resource type="Texture2D" uid="uid://dmnwtwu5v4voh" path="res://visuals/images/icons/detect mark.png" id="5_fwehh"] +[ext_resource type="AudioStream" uid="uid://boe6fidhl6ut5" path="res://audio/sounds/Whoosh Blade 003.wav" id="5_rclin"] +[ext_resource type="AudioStream" uid="uid://b3x0xqu8yrib4" path="res://audio/sounds/Whoosh Blade 004.wav" id="6_0pfk2"] +[ext_resource type="AudioStream" uid="uid://cmnibhyxpag0a" path="res://audio/sounds/BeepBeep_high.wav" id="6_wva0c"] +[ext_resource type="AudioStream" uid="uid://1m2yfje18spo" path="res://audio/sounds/Whoosh Blade 005.wav" id="7_fifli"] +[ext_resource type="AudioStream" uid="uid://c1j8hjmw45x86" path="res://audio/sounds/Hitech Shot A.wav" id="9_fifli"] +[ext_resource type="AudioStream" uid="uid://dgftxjb34d2ph" path="res://audio/sounds/Hitech Shot B.wav" id="10_ghbft"] +[ext_resource type="AudioStream" uid="uid://bguwdvatsf87l" path="res://audio/sounds/Hitech Shot C.wav" id="11_fuq8x"] +[ext_resource type="AudioStream" uid="uid://cw31ymbqgqcq2" path="res://audio/sounds/sci-fi_weapon_reload_03.wav" id="13_fuq8x"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_y646j"] +next_pass = ExtResource("2_j3lta") albedo_color = Color(0.08468992, 0.08468992, 0.08468992, 1) [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lnbra"] +next_pass = ExtResource("2_j3lta") albedo_color = Color(0, 1, 1, 1) +[sub_resource type="BoxShape3D" id="BoxShape3D_j3lta"] +size = Vector3(0.25, 0.6, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fifli"] +albedo_color = Color(1, 0.60701716, 0.54817975, 1) +emission_enabled = true +emission = Color(1, 0, 0, 1) +emission_energy_multiplier = 16.0 + +[sub_resource type="Animation" id="Animation_ofpku"] +resource_name = "melee" +length = 0.25 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("MeleeArea/HitShape:disabled") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("MeleeArea/HitShape:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.03333333, 0.1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector3(0.6446533, 0.4691162, 0.6541977), Vector3(0.04156494, 0.4691162, 0.937973), Vector3(-0.645, 0.469, 0.654)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("MeleeArea/HitShape:rotation") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.03333333, 0.1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector3(0, 0.76134753, 0), Vector3(0, 0, 0), Vector3(0, -0.76096356, 0)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("MeleeArea/HitShape:visible") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, false] +} +tracks/4/type = "method" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("../MeleeSound") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [0.0], +"method": &"play" +}] +} + +[sub_resource type="Animation" id="Animation_56qyi"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("MeleeArea/HitShape:disabled") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("MeleeArea/HitShape:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(0.6446533, 0.4691162, 0.6541977)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("MeleeArea/HitShape:rotation") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(0, 0.76134753, 0)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("MeleeArea/HitShape:visible") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} + +[sub_resource type="Animation" id="Animation_ac3v1"] +resource_name = "shoot" +length = 0.2 +tracks/0/type = "method" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../RangedSound") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [0.0], +"method": &"play" +}] +} +tracks/1/type = "method" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../..") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0.033333335), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"fire_ranged" +}] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ucins"] +_data = { +&"RESET": SubResource("Animation_56qyi"), +&"melee": SubResource("Animation_ofpku"), +&"shoot": SubResource("Animation_ac3v1") +} + +[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_ghbft"] +streams_count = 5 +stream_0/stream = ExtResource("3_6r6k1") +stream_1/stream = ExtResource("4_ac3v1") +stream_2/stream = ExtResource("5_rclin") +stream_3/stream = ExtResource("6_0pfk2") +stream_4/stream = ExtResource("7_fifli") + +[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_rclin"] +streams_count = 3 +stream_0/stream = ExtResource("9_fifli") +stream_1/stream = ExtResource("10_ghbft") +stream_2/stream = ExtResource("11_fuq8x") + [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_a5wj7"] radius = 0.3 height = 1.0 -[node name="Player" type="CharacterBody3D"] +[node name="Player" type="CharacterBody3D" groups=["combat"]] physics_interpolation_mode = 1 collision_layer = 2 collision_mask = 5 @@ -24,17 +220,62 @@ floor_snap_length = 1.0 script = ExtResource("1_a5wj7") speed = 3.0 -[node name="Body" type="CSGBox3D" parent="."] +[node name="PawnBody" type="Node3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.425, 0) +script = ExtResource("2_ac3v1") +projectile_template = ExtResource("3_ghbft") + +[node name="Mesh" type="CSGBox3D" parent="PawnBody"] size = Vector3(0.5, 0.85, 0.5) material = SubResource("StandardMaterial3D_y646j") -[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Body"] +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="PawnBody/Mesh"] transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0, 0.21490532, 0.29997927) radius = 0.15 height = 0.05 material = SubResource("StandardMaterial3D_lnbra") +[node name="MeleeArea" type="Area3D" parent="PawnBody/Mesh"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.425, 0) +collision_layer = 0 +collision_mask = 2 + +[node name="HitShape" type="CollisionShape3D" parent="PawnBody/Mesh/MeleeArea"] +transform = Transform3D(0.723907, 0, 0.68989754, 0, 1, 0, -0.68989754, 0, 0.723907, 0.6446533, 0.4691162, 0.6541977) +visible = false +shape = SubResource("BoxShape3D_j3lta") +disabled = true + +[node name="CSGBox3D" type="CSGBox3D" parent="PawnBody/Mesh/MeleeArea/HitShape"] +size = Vector3(0.1, 0.1, 1) +material = SubResource("StandardMaterial3D_fifli") + +[node name="OmniLight3D" type="OmniLight3D" parent="PawnBody/Mesh/MeleeArea/HitShape/CSGBox3D"] +light_color = Color(1, 0, 0, 1) +light_energy = 1.137 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="PawnBody/Mesh"] +unique_name_in_owner = true +libraries = { +&"": SubResource("AnimationLibrary_ucins") +} + +[node name="RangedPoint" type="Node3D" parent="PawnBody/Mesh"] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.4537468) + +[node name="MeleeSound" type="AudioStreamPlayer3D" parent="PawnBody"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.425, 0) +stream = SubResource("AudioStreamRandomizer_ghbft") + +[node name="RangedSound" type="AudioStreamPlayer3D" parent="PawnBody"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.425, 0) +stream = SubResource("AudioStreamRandomizer_rclin") + +[node name="ReloadSound" type="AudioStreamPlayer3D" parent="PawnBody"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.425, 0) +stream = ExtResource("13_fuq8x") + [node name="CollisionShape3D" type="CollisionShape3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.4665325, 0) shape = SubResource("CapsuleShape3D_a5wj7") @@ -47,3 +288,19 @@ stream = ExtResource("3_sfa2f") [node name="AudioListener3D" type="AudioListener3D" parent="."] current = true + +[node name="DetectSound" type="AudioStreamPlayer3D" parent="."] +stream = ExtResource("4_xb5g3") +volume_db = -80.0 +max_db = -11.464 + +[node name="DetectIcon" type="Sprite3D" parent="."] +transform = Transform3D(0.75, 0, 0, 0, 0.75, 0, 0, 0, 0.75, 0, 1.2337646, 0) +visible = false +billboard = 1 +no_depth_test = true +texture = ExtResource("5_fwehh") + +[node name="DetonateSound" type="AudioStreamPlayer3D" parent="."] +stream = ExtResource("6_wva0c") +max_db = -7.0 diff --git a/templates/trap.tscn b/templates/trap.tscn index f8a74a9..27b533e 100644 --- a/templates/trap.tscn +++ b/templates/trap.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=8 format=3 uid="uid://bk3yqawritfnj"] +[gd_scene load_steps=9 format=3 uid="uid://bk3yqawritfnj"] [ext_resource type="Script" uid="uid://yjsgte3x7jjw" path="res://scripts/trap.gd" id="1_6h4aj"] [ext_resource type="ArrayMesh" uid="uid://bih57xe642hrc" path="res://models/trap.obj" id="2_oj6ox"] [ext_resource type="Texture2D" uid="uid://cmlp8tn6mnbd" path="res://visuals/images/icons/t-bomb.png" id="3_mxvh5"] +[ext_resource type="Texture2D" uid="uid://cm288pisiir7v" path="res://visuals/images/force_panel_strip.png" id="4_oj6ox"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qcd3b"] albedo_color = Color(0, 0, 1, 1) @@ -36,7 +37,7 @@ shape = SubResource("BoxShape3D_dw7u0") [node name="Icon" type="Sprite3D" parent="."] unique_name_in_owner = true -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0) +transform = Transform3D(0.6, 0, 0, 0, 0.6, 0, 0, 0, 0.6, 0, 0.1, 0) pixel_size = 0.0075 axis = 1 double_sided = false @@ -48,11 +49,24 @@ unique_name_in_owner = true [node name="RangeArea" type="Area3D" parent="."] unique_name_in_owner = true collision_layer = 0 -collision_mask = 2 +collision_mask = 6 [node name="RangeShape" type="CollisionShape3D" parent="RangeArea"] unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) shape = SubResource("BoxShape3D_6h4aj") +[node name="ActivationTimer" type="Timer" parent="."] +unique_name_in_owner = true +wait_time = 5.0 + +[node name="ForceStrip" type="Sprite3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1.4, 0, 0, 0, -6.119594e-08, 1.4, 0, -1.4, -6.119594e-08, 0, 0.1, 0) +visible = false +texture_filter = 0 +texture = ExtResource("4_oj6ox") + [connection signal="body_entered" from="." to="." method="_on_body_entered"] [connection signal="timeout" from="RevealTimer" to="." method="_on_reveal_timeout"] +[connection signal="timeout" from="ActivationTimer" to="." method="_on_activation_timer_timeout"] diff --git a/visuals/images/force_panel_strip.png b/visuals/images/force_panel_strip.png new file mode 100644 index 0000000..7be6724 Binary files /dev/null and b/visuals/images/force_panel_strip.png differ diff --git a/visuals/images/force_panel_strip.png.import b/visuals/images/force_panel_strip.png.import new file mode 100644 index 0000000..75c03b3 --- /dev/null +++ b/visuals/images/force_panel_strip.png.import @@ -0,0 +1,41 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cm288pisiir7v" +path.s3tc="res://.godot/imported/force_panel_strip.png-69c5aca74ab6d376cf20ee037697e182.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://visuals/images/force_panel_strip.png" +dest_files=["res://.godot/imported/force_panel_strip.png-69c5aca74ab6d376cf20ee037697e182.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +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/visuals/images/icons/detect mark.png b/visuals/images/icons/detect mark.png new file mode 100644 index 0000000..0f4ead5 Binary files /dev/null and b/visuals/images/icons/detect mark.png differ diff --git a/visuals/images/icons/detect mark.png.import b/visuals/images/icons/detect mark.png.import new file mode 100644 index 0000000..11b108e --- /dev/null +++ b/visuals/images/icons/detect mark.png.import @@ -0,0 +1,41 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmnwtwu5v4voh" +path.s3tc="res://.godot/imported/detect mark.png-69ea5d5e1361087ad3f965d64ee590d8.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://visuals/images/icons/detect mark.png" +dest_files=["res://.godot/imported/detect mark.png-69ea5d5e1361087ad3f965d64ee590d8.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +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/visuals/images/icons/lit melee attack button.png b/visuals/images/icons/lit melee attack button.png new file mode 100644 index 0000000..cef44c8 Binary files /dev/null and b/visuals/images/icons/lit melee attack button.png differ diff --git a/visuals/images/icons/lit melee attack button.png.import b/visuals/images/icons/lit melee attack button.png.import new file mode 100644 index 0000000..18ec1d8 --- /dev/null +++ b/visuals/images/icons/lit melee attack button.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c64lykkbavdmi" +path="res://.godot/imported/lit melee attack button.png-d458a8f85224bc0be9328940f42769ad.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://visuals/images/icons/lit melee attack button.png" +dest_files=["res://.godot/imported/lit melee attack button.png-d458a8f85224bc0be9328940f42769ad.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +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/visuals/images/icons/melee attack button.png b/visuals/images/icons/melee attack button.png new file mode 100644 index 0000000..d671390 Binary files /dev/null and b/visuals/images/icons/melee attack button.png differ diff --git a/visuals/images/icons/melee attack button.png.import b/visuals/images/icons/melee attack button.png.import new file mode 100644 index 0000000..2230d4a --- /dev/null +++ b/visuals/images/icons/melee attack button.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bg0h4l3162pn5" +path="res://.godot/imported/melee attack button.png-18d4abc38507564a05c2563708cfedde.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://visuals/images/icons/melee attack button.png" +dest_files=["res://.godot/imported/melee attack button.png-18d4abc38507564a05c2563708cfedde.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +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/visuals/materials/pawn.tres b/visuals/materials/pawn.tres new file mode 100644 index 0000000..8f7313d --- /dev/null +++ b/visuals/materials/pawn.tres @@ -0,0 +1,10 @@ +[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://b8e84edfrnn1a"] + +[ext_resource type="Shader" uid="uid://bv268o3fy46uq" path="res://visuals/shaders/player.gdshader" id="1_v6pdu"] + +[resource] +resource_local_to_scene = true +render_priority = 1 +shader = ExtResource("1_v6pdu") +shader_parameter/color = Color(1.0762503, 0, 0.64059925, 1) +shader_parameter/strength = 0.0 diff --git a/visuals/shaders/player.gdshader b/visuals/shaders/player.gdshader new file mode 100644 index 0000000..b9f8b55 --- /dev/null +++ b/visuals/shaders/player.gdshader @@ -0,0 +1,17 @@ +shader_type spatial; +uniform vec4 color : source_color; +uniform float strength : hint_range(0.0, 1.0, 0.1); +void vertex() { + // Called for every vertex the material is visible on. +} + +void fragment() { + // Called for every pixel the material is visible on. + ALBEDO = color.rgb; + ALPHA = strength; +} + +//void light() { +// // Called for every pixel for every light affecting the CanvasItem. +// // Uncomment to replace the default light processing function with this one. +//} diff --git a/visuals/shaders/player.gdshader.uid b/visuals/shaders/player.gdshader.uid new file mode 100644 index 0000000..ade6139 --- /dev/null +++ b/visuals/shaders/player.gdshader.uid @@ -0,0 +1 @@ +uid://bv268o3fy46uq diff --git a/visuals/textures/T_smoke_b7.png b/visuals/textures/T_smoke_b7.png new file mode 100644 index 0000000..42d1542 Binary files /dev/null and b/visuals/textures/T_smoke_b7.png differ diff --git a/visuals/textures/T_smoke_b7.png.import b/visuals/textures/T_smoke_b7.png.import new file mode 100644 index 0000000..d0e9a08 --- /dev/null +++ b/visuals/textures/T_smoke_b7.png.import @@ -0,0 +1,41 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://qs7mgm4vors6" +path.s3tc="res://.godot/imported/T_smoke_b7.png-43856d9fe887be7559fba07c8c6babd3.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://visuals/textures/T_smoke_b7.png" +dest_files=["res://.godot/imported/T_smoke_b7.png-43856d9fe887be7559fba07c8c6babd3.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +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