Extensive work done on basically everything. Attacks prototyped, animations prototyped, pawnbody split out, all traps but pitfall implemented, UI hooked up more.

This commit is contained in:
2026-01-01 07:36:54 -05:00
parent 84bf495d11
commit b4910013c0
89 changed files with 1994 additions and 64 deletions

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

Binary file not shown.

View File

@@ -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

View File

@@ -1,20 +1,37 @@
Will S. - Ovani ****Will S. - Ovani
Trap Cycle - 9mm M&P Drop Mag Empty C.wav 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 Trap Place - impact_deep_thud_bounce_09.wav
Explosions Explosions
- explosion_large_01.wav - explosion_large_01.wav
- explosion_large_02.wav - explosion_large_02.wav
- explosion_large_03.wav - explosion_large_03.wav
- explosion_large_04.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_01.wav
- explosion_small_02.wav - explosion_small_02.wav
- explosion_small_03.wav - explosion_small_03.wav
- explosion_small_04.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 Disarm Tap - metal_tiny_hit_impact_01.wav
OTBTechno ****OTBTechno
Trap Alert - 134688__otbtechno__bike-bell.wav Trap Alert - 134688__otbtechno__bike-bell.wav

23
data/pawn.gd Normal file
View File

@@ -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]

1
data/pawn.gd.uid Normal file
View File

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

View File

@@ -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"

View File

@@ -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"

36
data/pawns/lou_riche.tres Normal file
View File

@@ -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"

View File

@@ -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"

38
data/pawns/tico.tres Normal file
View File

@@ -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"

34
data/pawns/van_reily.tres Normal file
View File

@@ -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"

4
data/trapset.gd Normal file
View File

@@ -0,0 +1,4 @@
class_name TrapSet extends Resource
@export var type : Trap.Type
@export var qty : int

1
data/trapset.gd.uid Normal file
View File

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

BIN
models/dodecahedron.fbx Normal file

Binary file not shown.

View File

@@ -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

View File

@@ -34,6 +34,7 @@ project/assembly_name="Trap Gunner"
level_spawner="" level_spawner=""
scenes="" scenes=""
combat="Combat valid targets."
[input] [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) "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

View File

@@ -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="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"] [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 anchor_bottom = 1.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
script = ExtResource("1_bow2h")
[node name="Panel" type="Panel" parent="."] [node name="Panel" type="Panel" parent="."]
layout_mode = 1 layout_mode = 1

View File

@@ -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="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="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://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://bhpyvhf36jl0f" path="res://testing.tres" id="7_88ety"]
[ext_resource type="MeshLibrary" uid="uid://cvhm40o2uw5mr" path="res://testing markers.tres" id="7_ahbqi"] [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"] [node name="Node3D" type="Node3D"]
script = ExtResource("1_qcd3b") script = ExtResource("1_qcd3b")
difficulty = 5 difficulty = 5
@@ -20,6 +28,7 @@ transform = Transform3D(1, 0, 0, 0, 0.49999997, 0.86602545, 0, -0.86602545, 0.49
projection = 1 projection = 1
size = 5.0 size = 5.0
script = ExtResource("3_qcd3b") script = ExtResource("3_qcd3b")
noise = SubResource("FastNoiseLite_qcd3b")
[node name="OmniLight3D" type="OmniLight3D" parent="."] [node name="OmniLight3D" type="OmniLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 18.508709, 0) 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) 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") mesh_library = ExtResource("7_88ety")
cell_size = Vector3(1, 1, 1) cell_size = Vector3(1, 1, 1)
cell_center_y = false cell_center_y = false
@@ -56,3 +66,15 @@ cell_center_y = false
collision_layer = 0 collision_layer = 0
collision_mask = 0 collision_mask = 0
metadata/_editor_floor_ = Vector3(0, -1, 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")

View File

@@ -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")
]

View File

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

1
scripts/combat_target.gd Normal file
View File

@@ -0,0 +1 @@
class_name CombatTarget extends StaticBody3D

View File

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

View File

@@ -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"))

View File

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

View File

@@ -65,7 +65,7 @@ func start_disarming() -> void:
disarm_button_container.add_child(icon) disarm_button_container.add_child(icon)
confirmation_dialog.visible = false confirmation_dialog.visible = false
disarm_window.visible = true 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: func try_advance(btn : int) -> void:
@@ -92,6 +92,8 @@ func button_pressed(event : InputEventAction) -> void:
"detonate": "detonate":
start_disarming() start_disarming()
"attack": "attack":
var trap = Game.level.get_square_trap(square)
trap.disarming = false
Game.player.close_modal() Game.player.close_modal()
_: return _: return

46
scripts/gas_emitter.gd Normal file
View File

@@ -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)

View File

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

27
scripts/gas_square.gd Normal file
View File

@@ -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)

View File

@@ -0,0 +1 @@
uid://6xmp5cbmjrbw

View File

@@ -1,6 +1,7 @@
class_name HealthBar extends TextureProgressBar 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. # Called when the node enters the scene tree for the first time.
func _ready() -> void: func _ready() -> void:
pass # Replace with function body. pass # Replace with function body.
@@ -13,3 +14,6 @@ func _process(delta: float) -> void:
func _on_health_changed(current : int, max : int) -> void: func _on_health_changed(current : int, max : int) -> void:
max_value = max max_value = max
value = current value = current
func _on_poison_status_changed(poisoned : bool) -> void:
texture_progress = poisoned_gradient if poisoned else healthy_gradient

View File

@@ -2,12 +2,26 @@ class_name HUD extends Control
@onready var trap_display : TrapDisplay = %TrapDisplay @onready var trap_display : TrapDisplay = %TrapDisplay
@onready var p1_healthbar : HealthBar = %P1HealthBar @onready var p1_healthbar : HealthBar = %P1HealthBar
@onready var control_display : ControlDisplay = %ControlDisplay
@onready var ammo_label : Label = %AmmoLabel
func _ready() -> void: func _ready() -> void:
Game.hud = self Game.hud = self
func register_player(player : Player) -> void: func register_player(player : Player) -> void:
player.health_changed.connect(p1_healthbar._on_health_changed) 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) trap_display._on_trap_list_changed(player.data.traps, player.data.active_trap)
player.trap_cycled.connect(trap_display._on_trap_cycled) player.trap_cycled.connect(trap_display._on_trap_cycled)
player.trap_quantity_changed.connect(trap_display._on_trap_quantity_changed) player.trap_quantity_changed.connect(trap_display._on_trap_quantity_changed)
player.trap_list_changed.connect(trap_display._on_trap_list_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)

View File

@@ -1,19 +1,48 @@
extends Camera3D class_name PlayerCamera extends Camera3D
var target 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: func _enter_tree() -> void:
call_deferred("register_player") call_deferred("register_player")
func _ready() -> void:
randomize()
noise.seed = randi()
func register_player() -> void: func register_player() -> void:
target = Game.player target = Game.player
target.camera = self
if target: 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: func _process(delta: float) -> void:
if target: 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])

10
scripts/pawn_body.gd Normal file
View File

@@ -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)

1
scripts/pawn_body.gd.uid Normal file
View File

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

View File

@@ -1,46 +1,131 @@
class_name Player extends CharacterBody3D class_name Player extends CharacterBody3D
enum State {
NORMAL,
KNOCKDOWN,
KNOCKUP,
FLUNG,
BOUND,
DEAD
}
const trap_template = preload("res://templates/trap.tscn") const trap_template = preload("res://templates/trap.tscn")
const remove_trap_modal = preload("res://templates/remove_trap_modal.tscn") const remove_trap_modal = preload("res://templates/remove_trap_modal.tscn")
const disarm_trap_modal = preload("res://templates/disarm_trap_modal.tscn") const disarm_trap_modal = preload("res://templates/disarm_trap_modal.tscn")
@export var speed : float = 10 @export var speed : float = 10
@onready var body = $Body @onready var body : PawnBody = $PawnBody
@onready var data : PlayerData = $Data @onready var data : PlayerData = $Data
@onready var trap_sound : AudioStreamPlayer3D = $TrapSound @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 id : int = 1
var state : State
var button_actions : Dictionary[int, String] var button_actions : Dictionary[int, String]
var current_square : Vector3i var current_square : Vector3i
var facing : Vector3
var detecting : bool = false var detecting : bool = false
var detect_squares : Dictionary[Vector3i, bool] = {} 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 input_locked : bool = false
var action_tween : Tween = null var action_tween : Tween = null
var camera : PlayerCamera = null
var modal = null var modal = null
signal trap_cycled(trap_index) signal trap_cycled(trap_index : int)
signal trap_quantity_changed(trap_index, quantity) signal trap_quantity_changed(trap_index : int, quantity : int)
signal trap_list_changed(traps) signal trap_list_changed(traps)
signal health_changed(current : int, max : int) 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: 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") var dir = Input.get_vector("west", "east", "north", "south")
dir = Vector3(dir.x, 0, dir.y) dir = Vector3(dir.x, 0, dir.y)
if input_locked or modal != null: if input_locked or modal != null:
dir = Vector3.ZERO 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) body.look_at(body.global_position - dir)
velocity = speed * dir velocity = speed * dir
if is_poisoned():
velocity *= 0.5
if detecting: if detecting:
velocity /= 3 velocity *= .33
if !is_on_floor(): velocity += Vector3(0, down, 0)
velocity += get_gravity()
move_and_slide() move_and_slide()
elif !is_on_floor(): elif !is_on_floor():
velocity = get_gravity() velocity += get_gravity() * delta
move_and_slide() move_and_slide()
if detecting: if detecting:
@@ -60,17 +145,100 @@ func _physics_process(delta: float) -> void:
evt.action = button evt.action = button
evt.pressed = true evt.pressed = true
modal.button_pressed(evt) modal.button_pressed(evt)
else: elif state == State.NORMAL:
if Input.is_action_just_pressed("left cycle trap"): if Input.is_action_just_pressed("left cycle trap"):
cycle_active_trap(-1) cycle_active_trap(-1)
if Input.is_action_just_pressed("right cycle trap"): if Input.is_action_just_pressed("right cycle trap"):
cycle_active_trap(1) 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() start_detecting()
elif Input.is_action_just_released("detect"): elif Input.is_action_just_released("detect"):
stop_detecting() 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() 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: func try_lay_trap() -> void:
if !is_on_floor(): if !is_on_floor():
@@ -93,8 +261,9 @@ func try_lay_trap() -> void:
func lay_trap(square : Vector3i, idx : int) -> void: func lay_trap(square : Vector3i, idx : int) -> void:
var type : Trap.Type = data.traps[idx].type var type : Trap.Type = data.traps[idx].type
var trap = trap_template.instantiate() var trap = trap_template.instantiate()
trap.setup(type, Multiplayer.id) trap.setup(type, facing, id)
trap.disarmed.connect(_on_trap_disarmed) trap.disarmed.connect(_on_trap_disarmed)
trap.activated.connect(_on_trap_activated)
data.traps[idx].quantity -= 1 data.traps[idx].quantity -= 1
trap_quantity_changed.emit(idx, data.traps[idx].quantity) trap_quantity_changed.emit(idx, data.traps[idx].quantity)
Game.level.add_trap(trap, square) Game.level.add_trap(trap, square)
@@ -125,11 +294,18 @@ func update_detecting() -> void:
var remove_list = [] var remove_list = []
var trap_detected : bool = false
for sq in new_squares.keys(): for sq in new_squares.keys():
if detect_squares.has(sq): if detect_squares.has(sq):
continue continue
if !Game.level.detect_square(sq, true): if !Game.level.detect_square(sq, true):
remove_list.append(sq) 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 detect_squares = new_squares
for key in remove_list: for key in remove_list:
@@ -140,9 +316,20 @@ func update_detecting() -> void:
if trap.trap_owner == Multiplayer.id: if trap.trap_owner == Multiplayer.id:
show_remove_trap_modal() show_remove_trap_modal()
else: else:
trap.disarming = true
show_disarm_trap_modal() 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: func close_modal() -> void:
modal.queue_free() modal.queue_free()
modal = null modal = null
@@ -175,11 +362,16 @@ func start_detecting() -> void:
detect_squares[sq] = true detect_squares[sq] = true
var remove_list = [] var remove_list = []
var trap_detected : bool = false
for sq in detect_squares.keys(): for sq in detect_squares.keys():
if !Game.level.detect_square(sq, true): if !Game.level.detect_square(sq, true):
remove_list.append(sq) 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: for key in remove_list:
detect_squares.erase(key) detect_squares.erase(key)
@@ -221,6 +413,9 @@ func cycle_active_trap(dir) -> void:
if prev != data.active_trap: if prev != data.active_trap:
trap_cycled.emit(data.active_trap) trap_cycled.emit(data.active_trap)
func can_hurt() -> bool:
return true
func hurt(damage : int) -> void: func hurt(damage : int) -> void:
data.life = max(0, data.life - damage) data.life = max(0, data.life - damage)
health_changed.emit(data.life, data.max_life) health_changed.emit(data.life, data.max_life)
@@ -232,3 +427,58 @@ func _on_trap_disarmed(type : Trap.Type) -> void:
d.max -= 1 d.max -= 1
trap_quantity_changed.emit(i, d.quantity) trap_quantity_changed.emit(i, d.quantity)
break 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

23
scripts/projectile.gd Normal file
View File

@@ -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)

View File

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

View File

@@ -4,6 +4,7 @@ const player_controller = preload("res://templates/singleplayer_pc.tscn")
const trap_template = preload("res://templates/trap.tscn") const trap_template = preload("res://templates/trap.tscn")
@onready var floor_layer : GridMap = %Floor @onready var floor_layer : GridMap = %Floor
@onready var ramp_layer : GridMap = %Ramps
@onready var marker_layer : GridMap = %Markers @onready var marker_layer : GridMap = %Markers
@export var difficulty : int = 1 @export var difficulty : int = 1
@@ -14,12 +15,14 @@ func _ready() -> void:
Game.level = self Game.level = self
var player = player_controller.instantiate() var player = player_controller.instantiate()
var traps : Array[PlayerData.TrapData] = [ 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.BOMB, 3, 3),
PlayerData.TrapData.new(Trap.Type.SWITCH, 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) 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) player.setup(traps)
func is_square_detected(crd) -> bool: func is_square_detected(crd) -> bool:
@@ -44,7 +47,12 @@ func add_trap(trap : Trap, crd : Vector3i) -> void:
traps[crd] = trap traps[crd] = trap
trap.global_position = Vector3(crd) + Vector3(.5, 0, .5) trap.global_position = Vector3(crd) + Vector3(.5, 0, .5)
add_child(trap) 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: func get_square_trap(crd : Vector3i) -> Trap:
if traps.has(crd): if traps.has(crd):
@@ -52,6 +60,8 @@ func get_square_trap(crd : Vector3i) -> Trap:
else: else:
return null return null
func is_valid_trap_square(crd : Vector3i) -> bool: func is_valid_trap_square(crd : Vector3i) -> bool:
if floor_layer.get_cell_item(crd + Vector3i(0,-1,0)) == GridMap.INVALID_CELL_ITEM: if floor_layer.get_cell_item(crd + Vector3i(0,-1,0)) == GridMap.INVALID_CELL_ITEM:
return false return false
@@ -68,9 +78,9 @@ func activate_trap(crd : Vector3i) -> void:
#if trap: #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() var trap = trap_template.instantiate()
trap.setup(type, -1) trap.setup(type, dir, -1)
add_trap(trap, square) add_trap(trap, square)
func disarm_trap(crd : Vector3i) -> void: func disarm_trap(crd : Vector3i) -> void:

View File

@@ -26,40 +26,64 @@ const trap_icons : Dictionary = {
Trap.Type.MINE : preload("res://visuals/images/icons/t-mine.png"), 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_area : Area3D = %RangeArea
@onready var range_shape : BoxShape3D = %RangeShape.shape @onready var range_shape : BoxShape3D = %RangeShape.shape
@onready var model : MeshInstance3D = %Model @onready var model : MeshInstance3D = %Model
@onready var icon : Sprite3D = %Icon @onready var icon : Sprite3D = %Icon
@onready var force_strip : Sprite3D = %ForceStrip
@onready var material : StandardMaterial3D = model.get_surface_override_material(0) @onready var material : StandardMaterial3D = model.get_surface_override_material(0)
@onready var reveal_timer : Timer = %RevealTimer @onready var reveal_timer : Timer = %RevealTimer
@onready var activation_timer : Timer = %ActivationTimer
var type : Type var type : Type
var square : Vector3i var square : Vector3i
var trap_owner : int var trap_owner : int
var direction : Vector3
var disarming : bool var disarming : bool
var disarm_id : int var disarm_id : int
var delayed_trigger_tween : Tween = null
var damage : int = 10 var damage : int = 10
var just_revealed : bool = false
signal disarmed(type : Trap.Type) signal disarmed(type : Trap.Type)
signal activated(type : Trap.Type)
func setup(type : Type, direction : Vector3, trap_owner : int) -> void:
func setup(type : Type, trap_owner : int) -> void:
self.type = type self.type = type
self.trap_owner = trap_owner 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: func disarm() -> void:
disarmed.emit(type) disarmed.emit(type)
queue_free() queue_free()
func reveal() -> void: func reveal() -> void:
if model.visible:
return
model.visible = true model.visible = true
reveal_timer.start(5) 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: 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) reveal_timer.start(5)
else: else:
model.visible = false model.visible = false
@@ -71,15 +95,87 @@ func _ready() -> void:
icon.visible = owns_trap icon.visible = owns_trap
range_shape.size = range_shapes[type] range_shape.size = range_shapes[type]
material.albedo_color = Color.YELLOW if owns_trap else Color.RED 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: func activate() -> void:
var exp = explosion_template.instantiate() 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) 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(): for body in range_area.get_overlapping_bodies():
body.hurt(damage) blast(body)
#match(type):
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: 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 !disarming or body.id != disarm_id:
if !body.detecting: if !body.detecting:
activate() activate()
func _on_activation_timer_timeout() -> void:
activate()

View File

@@ -15,6 +15,10 @@ func proximal_shake(distance : float) -> void:
if !Game.player: if !Game.player:
return return
var d = global_position.distance_squared_to(Game.player.global_position) var d = global_position.distance_squared_to(Game.player.global_position)
if d <= distance * distance: var d_sq = distance * distance
Input.start_joy_vibration(0, 1,1,1000) 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)

View File

@@ -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="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"] [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://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://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="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://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"] [sub_resource type="Gradient" id="Gradient_1ghxf"]
@@ -88,6 +98,8 @@ value = 100.0
nine_patch_stretch = true nine_patch_stretch = true
texture_progress = ExtResource("3_vhta5") texture_progress = ExtResource("3_vhta5")
script = ExtResource("4_iv5le") script = ExtResource("4_iv5le")
healthy_gradient = ExtResource("3_vhta5")
poisoned_gradient = SubResource("GradientTexture1D_1ghxf")
[node name="PanelContainer2" type="PanelContainer" parent="Control/PanelContainer/HBoxContainer/VBoxContainer2"] [node name="PanelContainer2" type="PanelContainer" parent="Control/PanelContainer/HBoxContainer/VBoxContainer2"]
custom_minimum_size = Vector2(250, 100) custom_minimum_size = Vector2(250, 100)
@@ -227,7 +239,8 @@ offset_bottom = 104.0
texture = ExtResource("18_iv5le") texture = ExtResource("18_iv5le")
expand_mode = 1 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 layout_mode = 0
offset_left = 141.0 offset_left = 141.0
offset_top = 29.0 offset_top = 29.0
@@ -281,7 +294,8 @@ expand_mode = 1
custom_minimum_size = Vector2(165, 0) custom_minimum_size = Vector2(165, 0)
layout_mode = 2 layout_mode = 2
[node name="Control2" type="Control" parent="."] [node name="ControlDisplay" type="Control" parent="."]
unique_name_in_owner = true
layout_mode = 1 layout_mode = 1
anchors_preset = 2 anchors_preset = 2
anchor_top = 1.0 anchor_top = 1.0
@@ -289,8 +303,9 @@ anchor_bottom = 1.0
offset_top = -200.0 offset_top = -200.0
offset_right = 200.0 offset_right = 200.0
grow_vertical = 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 layout_mode = 0
offset_left = 13.0 offset_left = 13.0
offset_top = 71.0 offset_top = 71.0
@@ -304,7 +319,7 @@ texture_pressed = ExtResource("16_aid7k")
ignore_texture_size = true ignore_texture_size = true
stretch_mode = 0 stretch_mode = 0
[node name="Detect" type="TextureButton" parent="Control2"] [node name="Detect" type="TextureButton" parent="ControlDisplay"]
layout_mode = 0 layout_mode = 0
offset_left = 68.0 offset_left = 68.0
offset_top = 35.0 offset_top = 35.0
@@ -318,7 +333,7 @@ texture_pressed = ExtResource("18_yda1o")
ignore_texture_size = true ignore_texture_size = true
stretch_mode = 0 stretch_mode = 0
[node name="RangedAttack" type="TextureButton" parent="Control2"] [node name="RangedAttack" type="TextureButton" parent="ControlDisplay"]
layout_mode = 0 layout_mode = 0
offset_left = 123.0 offset_left = 123.0
offset_top = 71.0 offset_top = 71.0
@@ -332,7 +347,22 @@ texture_pressed = ExtResource("20_vhta5")
ignore_texture_size = true ignore_texture_size = true
stretch_mode = 0 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 layout_mode = 0
offset_left = 68.0 offset_left = 68.0
offset_top = 110.0 offset_top = 110.0

46
templates/bullet.tscn Normal file
View File

@@ -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"]

View File

@@ -269,7 +269,7 @@ process_material = SubResource("ParticleProcessMaterial_6ym0g")
draw_pass_1 = SubResource("SphereMesh_4y8np") draw_pass_1 = SubResource("SphereMesh_4y8np")
[node name="ParticleFX" type="GPUParticles3D" parent="."] [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") material_override = ExtResource("2_l2v4y")
amount = 10 amount = 10
lifetime = 0.6 lifetime = 0.6

View File

@@ -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"]

90
templates/gas_square.tscn Normal file
View File

@@ -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"]

View File

@@ -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://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="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://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"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_y646j"]
next_pass = ExtResource("2_j3lta")
albedo_color = Color(0.08468992, 0.08468992, 0.08468992, 1) albedo_color = Color(0.08468992, 0.08468992, 0.08468992, 1)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lnbra"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lnbra"]
next_pass = ExtResource("2_j3lta")
albedo_color = Color(0, 1, 1, 1) 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"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_a5wj7"]
radius = 0.3 radius = 0.3
height = 1.0 height = 1.0
[node name="Player" type="CharacterBody3D"] [node name="Player" type="CharacterBody3D" groups=["combat"]]
physics_interpolation_mode = 1 physics_interpolation_mode = 1
collision_layer = 2 collision_layer = 2
collision_mask = 5 collision_mask = 5
@@ -24,17 +220,62 @@ floor_snap_length = 1.0
script = ExtResource("1_a5wj7") script = ExtResource("1_a5wj7")
speed = 3.0 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) 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) size = Vector3(0.5, 0.85, 0.5)
material = SubResource("StandardMaterial3D_y646j") 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) transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0, 0.21490532, 0.29997927)
radius = 0.15 radius = 0.15
height = 0.05 height = 0.05
material = SubResource("StandardMaterial3D_lnbra") 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="."] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.4665325, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.4665325, 0)
shape = SubResource("CapsuleShape3D_a5wj7") shape = SubResource("CapsuleShape3D_a5wj7")
@@ -47,3 +288,19 @@ stream = ExtResource("3_sfa2f")
[node name="AudioListener3D" type="AudioListener3D" parent="."] [node name="AudioListener3D" type="AudioListener3D" parent="."]
current = true 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

View File

@@ -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="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="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://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"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qcd3b"]
albedo_color = Color(0, 0, 1, 1) albedo_color = Color(0, 0, 1, 1)
@@ -36,7 +37,7 @@ shape = SubResource("BoxShape3D_dw7u0")
[node name="Icon" type="Sprite3D" parent="."] [node name="Icon" type="Sprite3D" parent="."]
unique_name_in_owner = true 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 pixel_size = 0.0075
axis = 1 axis = 1
double_sided = false double_sided = false
@@ -48,11 +49,24 @@ unique_name_in_owner = true
[node name="RangeArea" type="Area3D" parent="."] [node name="RangeArea" type="Area3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
collision_layer = 0 collision_layer = 0
collision_mask = 2 collision_mask = 6
[node name="RangeShape" type="CollisionShape3D" parent="RangeArea"] [node name="RangeShape" type="CollisionShape3D" parent="RangeArea"]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
shape = SubResource("BoxShape3D_6h4aj") 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="body_entered" from="." to="." method="_on_body_entered"]
[connection signal="timeout" from="RevealTimer" to="." method="_on_reveal_timeout"] [connection signal="timeout" from="RevealTimer" to="." method="_on_reveal_timeout"]
[connection signal="timeout" from="ActivationTimer" to="." method="_on_activation_timer_timeout"]

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

View File

@@ -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

View File

@@ -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

View File

@@ -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.
//}

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

View File

@@ -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