Compare commits

...

5 Commits

114 changed files with 122112 additions and 20900 deletions

View File

@@ -19,5 +19,7 @@ class_name PawnBaseData extends Resource
var model
@export var portrait : Texture2D
@export var nameplate : Texture2D
@export var name_audio : AudioStream
@export var pawn_body : PackedScene
@export var starting_hacks : Array[HackSet] = [null, null, null]

View File

@@ -1,30 +1,32 @@
[gd_resource type="Resource" script_class="PawnBaseData" load_steps=7 format=3 uid="uid://yosnkcj4ci4v"]
[gd_resource type="Resource" script_class="PawnBaseData" load_steps=9 format=3 uid="uid://yosnkcj4ci4v"]
[ext_resource type="Texture2D" uid="uid://3dj2p3xerc45" path="res://visuals/images/temp_portraits/tg-abdoll-relin.jpg" id="1_4g7al"]
[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/hackset.gd" id="2_4g7al"]
[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn_base_data.gd" id="2_8dqhi"]
[ext_resource type="AudioStream" uid="uid://dhlg3pk3tbirp" path="res://external/sample audio/a.wav" id="1_mtelv"]
[ext_resource type="PackedScene" uid="uid://c3s6gqy0s5kus" path="res://templates/pawns/a.tscn" id="2_mtelv"]
[ext_resource type="Texture2D" uid="uid://13pdg1vs81as" path="res://external/test portraits/a.png" id="3_qt3l7"]
[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn_base_data.gd" id="4_3x7pt"]
[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/hackset.gd" id="5_lwcbw"]
[sub_resource type="Resource" id="Resource_4g7al"]
script = ExtResource("2_4g7al")
script = ExtResource("5_lwcbw")
type = 1
qty = 3
metadata/_custom_type_script = "uid://b0b1107c0d807"
[sub_resource type="Resource" id="Resource_8dqhi"]
script = ExtResource("2_4g7al")
script = ExtResource("5_lwcbw")
type = 5
qty = 6
metadata/_custom_type_script = "uid://b0b1107c0d807"
[sub_resource type="Resource" id="Resource_32lt6"]
script = ExtResource("2_4g7al")
script = ExtResource("5_lwcbw")
type = 2
qty = 2
metadata/_custom_type_script = "uid://b0b1107c0d807"
[resource]
script = ExtResource("2_8dqhi")
name = "Abdoll Relin"
script = ExtResource("4_3x7pt")
name = "A"
move_speed = 3.0
life = 75
max_life = 75
@@ -35,6 +37,8 @@ range_damage = 12
range_time = 1.0
melee_time = 1.25
reload_time = 1.75
portrait = ExtResource("1_4g7al")
starting_hacks = Array[ExtResource("2_4g7al")]([SubResource("Resource_4g7al"), SubResource("Resource_8dqhi"), SubResource("Resource_32lt6")])
portrait = ExtResource("3_qt3l7")
name_audio = ExtResource("1_mtelv")
pawn_body = ExtResource("2_mtelv")
starting_hacks = Array[ExtResource("5_lwcbw")]([SubResource("Resource_4g7al"), SubResource("Resource_8dqhi"), SubResource("Resource_32lt6")])
metadata/_custom_type_script = "uid://c53ohdio1ksp1"

View File

@@ -1,29 +1,31 @@
[gd_resource type="Resource" script_class="PawnBaseData" load_steps=7 format=3 uid="uid://df4gqi1us2dwu"]
[gd_resource type="Resource" script_class="PawnBaseData" load_steps=9 format=3 uid="uid://df4gqi1us2dwu"]
[ext_resource type="Texture2D" uid="uid://2qoouiv1cf0i" path="res://visuals/images/temp_portraits/tg-john-bishous.jpg" id="1_sb8f5"]
[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/hackset.gd" id="2_sb8f5"]
[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn_base_data.gd" id="2_tu5w7"]
[ext_resource type="AudioStream" uid="uid://7dsv6kcptvar" path="res://external/sample audio/b.wav" id="1_vp6uu"]
[ext_resource type="PackedScene" uid="uid://bum67b50tn8ye" path="res://templates/pawns/b.tscn" id="2_vp6uu"]
[ext_resource type="Texture2D" uid="uid://ca6iihdssrh14" path="res://external/test portraits/b.png" id="3_qojdv"]
[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn_base_data.gd" id="4_0gp76"]
[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/hackset.gd" id="5_ic2r4"]
[sub_resource type="Resource" id="Resource_sb8f5"]
script = ExtResource("2_sb8f5")
script = ExtResource("5_ic2r4")
type = 4
qty = 2
metadata/_custom_type_script = "uid://b0b1107c0d807"
[sub_resource type="Resource" id="Resource_tu5w7"]
script = ExtResource("2_sb8f5")
script = ExtResource("5_ic2r4")
qty = 6
metadata/_custom_type_script = "uid://b0b1107c0d807"
[sub_resource type="Resource" id="Resource_idp5c"]
script = ExtResource("2_sb8f5")
script = ExtResource("5_ic2r4")
type = 2
qty = 2
metadata/_custom_type_script = "uid://b0b1107c0d807"
[resource]
script = ExtResource("2_tu5w7")
name = "John Bishous"
script = ExtResource("4_0gp76")
name = "B"
move_speed = 2.5
life = 125
max_life = 125
@@ -34,6 +36,8 @@ range_damage = 20
range_time = 0.75
melee_time = 1.0
reload_time = 1.75
portrait = ExtResource("1_sb8f5")
starting_hacks = Array[ExtResource("2_sb8f5")]([SubResource("Resource_sb8f5"), SubResource("Resource_tu5w7"), SubResource("Resource_idp5c")])
portrait = ExtResource("3_qojdv")
name_audio = ExtResource("1_vp6uu")
pawn_body = ExtResource("2_vp6uu")
starting_hacks = Array[ExtResource("5_ic2r4")]([SubResource("Resource_sb8f5"), SubResource("Resource_tu5w7"), SubResource("Resource_idp5c")])
metadata/_custom_type_script = "uid://c53ohdio1ksp1"

View File

@@ -1,30 +1,32 @@
[gd_resource type="Resource" script_class="PawnBaseData" load_steps=7 format=3 uid="uid://dnty6gi4s2vdl"]
[gd_resource type="Resource" script_class="PawnBaseData" load_steps=9 format=3 uid="uid://dnty6gi4s2vdl"]
[ext_resource type="Texture2D" uid="uid://db0n6kjwucthf" path="res://visuals/images/temp_portraits/tg-lou-riche.jpg" id="1_onotk"]
[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn_base_data.gd" id="2_7kyxn"]
[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/hackset.gd" id="2_onotk"]
[ext_resource type="AudioStream" uid="uid://dr3jq3tnvtwu" path="res://external/sample audio/c.wav" id="1_ag1od"]
[ext_resource type="PackedScene" uid="uid://c6hojd4o764oc" path="res://templates/pawns/c.tscn" id="2_ag1od"]
[ext_resource type="Texture2D" uid="uid://dm7fo7tt00p1" path="res://external/test portraits/c.png" id="3_1yr5w"]
[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn_base_data.gd" id="4_nmvyh"]
[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/hackset.gd" id="5_2i1hp"]
[sub_resource type="Resource" id="Resource_onotk"]
script = ExtResource("2_onotk")
script = ExtResource("5_2i1hp")
type = 1
qty = 5
metadata/_custom_type_script = "uid://b0b1107c0d807"
[sub_resource type="Resource" id="Resource_7kyxn"]
script = ExtResource("2_onotk")
script = ExtResource("5_2i1hp")
type = 2
qty = 1
metadata/_custom_type_script = "uid://b0b1107c0d807"
[sub_resource type="Resource" id="Resource_6f6nq"]
script = ExtResource("2_onotk")
script = ExtResource("5_2i1hp")
type = 3
qty = 3
metadata/_custom_type_script = "uid://b0b1107c0d807"
[resource]
script = ExtResource("2_7kyxn")
name = "Lou Riche"
script = ExtResource("4_nmvyh")
name = "C"
move_speed = 3.0
life = 100
ammo = 6
@@ -33,6 +35,8 @@ melee_damage = 12
range_damage = 4
range_time = 0.4
melee_time = 1.25
portrait = ExtResource("1_onotk")
starting_hacks = Array[ExtResource("2_onotk")]([SubResource("Resource_onotk"), SubResource("Resource_7kyxn"), SubResource("Resource_6f6nq")])
portrait = ExtResource("3_1yr5w")
name_audio = ExtResource("1_ag1od")
pawn_body = ExtResource("2_ag1od")
starting_hacks = Array[ExtResource("5_2i1hp")]([SubResource("Resource_onotk"), SubResource("Resource_7kyxn"), SubResource("Resource_6f6nq")])
metadata/_custom_type_script = "uid://c53ohdio1ksp1"

View File

@@ -1,33 +1,34 @@
[gd_resource type="Resource" script_class="PawnBaseData" load_steps=7 format=3 uid="uid://bpb2nok3rqm1g"]
[gd_resource type="Resource" script_class="PawnBaseData" load_steps=9 format=3 uid="uid://bpb2nok3rqm1g"]
[ext_resource type="Texture2D" uid="uid://ci86bksme5114" path="res://visuals/images/temp_portraits/tg-tenrou-ugetsu.jpg" id="1_fm4bf"]
[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn_base_data.gd" id="2_0fl5x"]
[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/hackset.gd" id="3_fm4bf"]
[ext_resource type="AudioStream" uid="uid://dsikjobcle18a" path="res://external/sample audio/d.wav" id="1_l2iwo"]
[ext_resource type="PackedScene" uid="uid://bqg51qfb0cj8y" path="res://templates/pawns/d.tscn" id="2_l2iwo"]
[ext_resource type="Texture2D" uid="uid://b2ovogspuupqa" path="res://external/test portraits/d.png" id="3_b6a3y"]
[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn_base_data.gd" id="4_8vcih"]
[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/hackset.gd" id="5_v5xcc"]
[sub_resource type="Resource" id="Resource_0fl5x"]
script = ExtResource("3_fm4bf")
script = ExtResource("5_v5xcc")
type = 1
qty = 2
metadata/_custom_type_script = "uid://b0b1107c0d807"
[sub_resource type="Resource" id="Resource_vnwdb"]
script = ExtResource("3_fm4bf")
script = ExtResource("5_v5xcc")
type = 5
qty = 3
metadata/_custom_type_script = "uid://b0b1107c0d807"
[sub_resource type="Resource" id="Resource_4mj1t"]
script = ExtResource("3_fm4bf")
script = ExtResource("5_v5xcc")
type = 3
qty = 2
metadata/_custom_type_script = "uid://b0b1107c0d807"
[resource]
script = ExtResource("2_0fl5x")
name = "Tenrou Ugetsu"
script = ExtResource("4_8vcih")
name = "D"
move_speed = 3.5
life = 100
max_life = null
ammo = 7
max_ammo = 7
melee_damage = 15
@@ -35,6 +36,8 @@ range_damage = 3
range_time = 0.3
melee_time = 1.25
reload_time = 0.6
portrait = ExtResource("1_fm4bf")
starting_hacks = Array[ExtResource("3_fm4bf")]([SubResource("Resource_0fl5x"), SubResource("Resource_vnwdb"), SubResource("Resource_4mj1t")])
portrait = ExtResource("3_b6a3y")
name_audio = ExtResource("1_l2iwo")
pawn_body = ExtResource("2_l2iwo")
starting_hacks = Array[ExtResource("5_v5xcc")]([SubResource("Resource_0fl5x"), SubResource("Resource_vnwdb"), SubResource("Resource_4mj1t")])
metadata/_custom_type_script = "uid://c53ohdio1ksp1"

View File

@@ -1,30 +1,32 @@
[gd_resource type="Resource" script_class="PawnBaseData" load_steps=7 format=3 uid="uid://casciqabe0wgo"]
[gd_resource type="Resource" script_class="PawnBaseData" load_steps=9 format=3 uid="uid://casciqabe0wgo"]
[ext_resource type="Texture2D" uid="uid://bsug1ur2gifkh" path="res://visuals/images/temp_portraits/tg-tico.jpg" id="1_o3qj5"]
[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn_base_data.gd" id="2_cxp03"]
[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/hackset.gd" id="2_o3qj5"]
[ext_resource type="AudioStream" uid="uid://dornjmfg37bv0" path="res://external/sample audio/e.wav" id="1_hlw2y"]
[ext_resource type="PackedScene" uid="uid://bb6a6wu2kc3fr" path="res://templates/pawns/e.tscn" id="2_hlw2y"]
[ext_resource type="Texture2D" uid="uid://b2rynijk10l8a" path="res://external/test portraits/e.png" id="3_1j2en"]
[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn_base_data.gd" id="4_jmlxg"]
[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/hackset.gd" id="5_f1khw"]
[sub_resource type="Resource" id="Resource_o3qj5"]
script = ExtResource("2_o3qj5")
script = ExtResource("5_f1khw")
type = 4
qty = 3
metadata/_custom_type_script = "uid://b0b1107c0d807"
[sub_resource type="Resource" id="Resource_cxp03"]
script = ExtResource("2_o3qj5")
script = ExtResource("5_f1khw")
type = 5
qty = 4
metadata/_custom_type_script = "uid://b0b1107c0d807"
[sub_resource type="Resource" id="Resource_o75pd"]
script = ExtResource("2_o3qj5")
script = ExtResource("5_f1khw")
type = 3
qty = 4
metadata/_custom_type_script = "uid://b0b1107c0d807"
[resource]
script = ExtResource("2_cxp03")
name = "Tico"
script = ExtResource("4_jmlxg")
name = "E"
move_speed = 3.0
life = 75
max_life = 75
@@ -35,6 +37,8 @@ range_damage = 10
range_time = 1.0
melee_time = 1.25
reload_time = 2.0
portrait = ExtResource("1_o3qj5")
starting_hacks = Array[ExtResource("2_o3qj5")]([SubResource("Resource_o3qj5"), SubResource("Resource_cxp03"), SubResource("Resource_o75pd")])
portrait = ExtResource("3_1j2en")
name_audio = ExtResource("1_hlw2y")
pawn_body = ExtResource("2_hlw2y")
starting_hacks = Array[ExtResource("5_f1khw")]([SubResource("Resource_o3qj5"), SubResource("Resource_cxp03"), SubResource("Resource_o75pd")])
metadata/_custom_type_script = "uid://c53ohdio1ksp1"

View File

@@ -1,29 +1,31 @@
[gd_resource type="Resource" script_class="PawnBaseData" load_steps=7 format=3 uid="uid://6s8tqfssrt5i"]
[gd_resource type="Resource" script_class="PawnBaseData" load_steps=9 format=3 uid="uid://6s8tqfssrt5i"]
[ext_resource type="Texture2D" uid="uid://bp6wc55s2t4si" path="res://visuals/images/temp_portraits/tg-van-raily.jpg" id="1_crpmc"]
[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/hackset.gd" id="2_crpmc"]
[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn_base_data.gd" id="2_nf0ju"]
[ext_resource type="AudioStream" uid="uid://bqu2otr8b1oj6" path="res://external/sample audio/f.wav" id="1_2oi4n"]
[ext_resource type="PackedScene" uid="uid://cwrxbjgwbiv81" path="res://templates/pawns/f.tscn" id="2_2oi4n"]
[ext_resource type="Texture2D" uid="uid://c265jqwykqc2s" path="res://external/test portraits/f.png" id="3_ttwdt"]
[ext_resource type="Script" uid="uid://c53ohdio1ksp1" path="res://data/pawn_base_data.gd" id="4_mlun8"]
[ext_resource type="Script" uid="uid://b0b1107c0d807" path="res://data/hackset.gd" id="5_2hgkw"]
[sub_resource type="Resource" id="Resource_crpmc"]
script = ExtResource("2_crpmc")
script = ExtResource("5_2hgkw")
type = 4
qty = 1
metadata/_custom_type_script = "uid://b0b1107c0d807"
[sub_resource type="Resource" id="Resource_nf0ju"]
script = ExtResource("2_crpmc")
script = ExtResource("5_2hgkw")
qty = 4
metadata/_custom_type_script = "uid://b0b1107c0d807"
[sub_resource type="Resource" id="Resource_2pr8m"]
script = ExtResource("2_crpmc")
script = ExtResource("5_2hgkw")
type = 1
qty = 4
metadata/_custom_type_script = "uid://b0b1107c0d807"
[resource]
script = ExtResource("2_nf0ju")
name = "Van Raily"
script = ExtResource("4_mlun8")
name = "F"
move_speed = 3.0
life = 100
ammo = 5
@@ -31,6 +33,8 @@ melee_damage = 10
range_damage = 5
range_time = 0.5
melee_time = 1.0
portrait = ExtResource("1_crpmc")
starting_hacks = Array[ExtResource("2_crpmc")]([SubResource("Resource_crpmc"), SubResource("Resource_nf0ju"), SubResource("Resource_2pr8m")])
portrait = ExtResource("3_ttwdt")
name_audio = ExtResource("1_2oi4n")
pawn_body = ExtResource("2_2oi4n")
starting_hacks = Array[ExtResource("5_2hgkw")]([SubResource("Resource_crpmc"), SubResource("Resource_nf0ju"), SubResource("Resource_2pr8m")])
metadata/_custom_type_script = "uid://c53ohdio1ksp1"

27
default_bus_layout.tres Normal file
View File

@@ -0,0 +1,27 @@
[gd_resource type="AudioBusLayout" format=3 uid="uid://ck35ska6sr17h"]
[resource]
bus/1/name = &"Voice"
bus/1/solo = false
bus/1/mute = false
bus/1/bypass_fx = false
bus/1/volume_db = 4.4334908
bus/1/send = &"Master"
bus/2/name = &"Music"
bus/2/solo = false
bus/2/mute = false
bus/2/bypass_fx = false
bus/2/volume_db = -8.793672
bus/2/send = &"Master"
bus/3/name = &"SFX"
bus/3/solo = false
bus/3/mute = false
bus/3/bypass_fx = false
bus/3/volume_db = 0.0
bus/3/send = &"Master"
bus/4/name = &"UI"
bus/4/solo = false
bus/4/mute = false
bus/4/bypass_fx = false
bus/4/volume_db = 0.0
bus/4/send = &"Master"

View File

@@ -1,18 +1,18 @@
[gd_scene load_steps=59 format=3 uid="uid://bflg720h1w3d3"]
[ext_resource type="Script" uid="uid://tb7n6ybv43ch" path="res://assets/BinbunVFX/shared/script/vfx_controller.gd" id="1_so17j"]
[ext_resource type="Shader" uid="uid://b6ke6r1fjb8s3" path="res://assets/BinbunVFX/impact_explosions/src/shader/explosion_core.gdshader" id="2_d2rk6"]
[ext_resource type="Material" uid="uid://dnw08mtonx63d" path="res://assets/BinbunVFX/impact_explosions/src/material/explosion/explosion_smoke.tres" id="2_plj08"]
[ext_resource type="Shader" uid="uid://d28ltkmbbdcjb" path="res://assets/BinbunVFX/impact_explosions/src/shader/sparks.gdshader" id="3_msnhc"]
[ext_resource type="Shader" uid="uid://bf8eiigjam2fr" path="res://assets/BinbunVFX/impact_explosions/src/shader/explostion_ring.gdshader" id="5_d2rk6"]
[ext_resource type="Texture2D" uid="uid://85fb3gemkbhp" path="res://assets/BinbunVFX/shared/texture/cracks_01.png" id="5_otofc"]
[ext_resource type="Texture2D" uid="uid://bbxo5nkvy537a" path="res://assets/BinbunVFX/shared/texture/cracks_emission_01.png" id="6_d2rk6"]
[ext_resource type="Shader" uid="uid://ccd4kg68n7uox" path="res://assets/BinbunVFX/impact_explosions/src/shader/basic_billboard.gdshader" id="8_y01pw"]
[ext_resource type="Script" uid="uid://bdk8hhttligw" path="res://assets/BinbunVFX/shared/script/vfx_light.gd" id="9_85p3d"]
[ext_resource type="Script" uid="uid://tb7n6ybv43ch" path="res://experimental/BinbunVFX/shared/script/vfx_controller.gd" id="1_so17j"]
[ext_resource type="Shader" uid="uid://b6ke6r1fjb8s3" path="res://experimental/BinbunVFX/impact_explosions/src/shader/explosion_core.gdshader" id="2_d2rk6"]
[ext_resource type="Material" uid="uid://dnw08mtonx63d" path="res://experimental/BinbunVFX/impact_explosions/src/material/explosion/explosion_smoke.tres" id="2_plj08"]
[ext_resource type="Shader" uid="uid://d28ltkmbbdcjb" path="res://experimental/BinbunVFX/impact_explosions/src/shader/sparks.gdshader" id="3_msnhc"]
[ext_resource type="Shader" uid="uid://bf8eiigjam2fr" path="res://experimental/BinbunVFX/impact_explosions/src/shader/explostion_ring.gdshader" id="5_d2rk6"]
[ext_resource type="Texture2D" uid="uid://85fb3gemkbhp" path="res://experimental/BinbunVFX/shared/texture/cracks_01.png" id="5_otofc"]
[ext_resource type="Texture2D" uid="uid://bbxo5nkvy537a" path="res://experimental/BinbunVFX/shared/texture/cracks_emission_01.png" id="6_d2rk6"]
[ext_resource type="Shader" uid="uid://ccd4kg68n7uox" path="res://experimental/BinbunVFX/impact_explosions/src/shader/basic_billboard.gdshader" id="8_y01pw"]
[ext_resource type="Script" uid="uid://bdk8hhttligw" path="res://experimental/BinbunVFX/shared/script/vfx_light.gd" id="9_85p3d"]
[sub_resource type="Gradient" id="Gradient_y01pw"]
[sub_resource type="Gradient" id="Gradient_iyrbe"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_85p3d"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_dga0b"]
noise_type = 2
frequency = 0.02
fractal_octaves = 1
@@ -22,9 +22,9 @@ domain_warp_amplitude = 5.0
domain_warp_fractal_octaves = 1
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_csir3"]
noise = SubResource("FastNoiseLite_dga0b")
color_ramp = SubResource("Gradient_iyrbe")
seamless = true
color_ramp = SubResource("Gradient_y01pw")
noise = SubResource("FastNoiseLite_85p3d")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_e6ocy"]
resource_local_to_scene = true
@@ -139,8 +139,8 @@ noise_type = 2
fractal_octaves = 3
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_7t2vj"]
seamless = true
noise = SubResource("FastNoiseLite_d2rk6")
seamless = true
[sub_resource type="Gradient" id="Gradient_d2rk6"]
offsets = PackedFloat32Array(0.868159, 0.980099, 1)
@@ -215,10 +215,10 @@ frequency = 0.02
fractal_octaves = 2
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_cwquj"]
invert = true
seamless = true
seamless_blend_skirt = 1.0
noise = SubResource("FastNoiseLite_y01pw")
seamless = true
invert = true
seamless_blend_skirt = 1.0
[sub_resource type="ShaderMaterial" id="ShaderMaterial_85p3d"]
render_priority = 0
@@ -476,6 +476,7 @@ _data = {
}
[node name="VFXExplosion_01" type="Node3D"]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0)
script = ExtResource("1_so17j")
primary_color = Color(1, 0.662745, 0.0666667, 1)
secondary_color = Color(0.984314, 0.192157, 0, 1)
@@ -492,6 +493,7 @@ mesh = SubResource("SphereMesh_awqfb")
[node name="Smoke" type="GPUParticles3D" parent="."]
layers = 540672
material_override = ExtResource("2_plj08")
emitting = false
amount = 16
lifetime = 0.8
one_shot = true
@@ -502,6 +504,7 @@ draw_pass_1 = SubResource("SphereMesh_plj08")
[node name="Sparks" type="GPUParticles3D" parent="."]
layers = 540672
material_override = SubResource("ShaderMaterial_msnhc")
emitting = false
amount = 16
lifetime = 0.5
one_shot = true

View File

@@ -357,6 +357,7 @@ _data = {
}
[node name="VFXExplosion_04" type="Node3D"]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0)
script = ExtResource("1_gkc2v")
primary_color = Color(1, 0.529412, 0, 1)
secondary_color = Color(1, 0.337255, 0, 1)

BIN
external/contain-icon.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

40
external/contain-icon.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cg4fu3fa248cm"
path="res://.godot/imported/contain-icon.png-a3e48c385316cd8572a89a3e09b9d50c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/contain-icon.png"
dest_files=["res://.godot/imported/contain-icon.png-a3e48c385316cd8572a89a3e09b9d50c.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

BIN
external/destroy-icon.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

41
external/destroy-icon.png.import vendored Normal file
View File

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://u12dmhohea1g"
path.s3tc="res://.godot/imported/destroy-icon.png-9ceefbafae80256ab845a59897063ca8.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://external/destroy-icon.png"
dest_files=["res://.godot/imported/destroy-icon.png-9ceefbafae80256ab845a59897063ca8.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

BIN
external/infect-icon.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

40
external/infect-icon.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bbls00lwa4y5n"
path="res://.godot/imported/infect-icon.png-8db1aa042afba559f74a0df4c022ad79.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/infect-icon.png"
dest_files=["res://.godot/imported/infect-icon.png-8db1aa042afba559f74a0df4c022ad79.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

BIN
external/progress_fill.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 B

40
external/progress_fill.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://g7k311jjr73e"
path="res://.godot/imported/progress_fill.png-0edd49454969b595fd5cd4e41197d4b2.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/progress_fill.png"
dest_files=["res://.godot/imported/progress_fill.png-0edd49454969b595fd5cd4e41197d4b2.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

BIN
external/progress_over.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 B

40
external/progress_over.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cp188cfq4qeas"
path="res://.godot/imported/progress_over.png-123d5e181e53b8525430d778ea9358ff.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/progress_over.png"
dest_files=["res://.godot/imported/progress_over.png-123d5e181e53b8525430d778ea9358ff.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

BIN
external/purge-icon.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

40
external/purge-icon.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://pdtmy6qryxb2"
path="res://.godot/imported/purge-icon.png-19a8010519a7938e0198b676b1cc9c83.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/purge-icon.png"
dest_files=["res://.godot/imported/purge-icon.png-19a8010519a7938e0198b676b1cc9c83.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

BIN
external/redirect-icon.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

40
external/redirect-icon.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://duwob32i2ccsk"
path="res://.godot/imported/redirect-icon.png-fe9a5e1b9c27a2ed13e5cd77575b5b34.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/redirect-icon.png"
dest_files=["res://.godot/imported/redirect-icon.png-fe9a5e1b9c27a2ed13e5cd77575b5b34.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

BIN
external/sample audio/a.wav vendored Normal file

Binary file not shown.

24
external/sample audio/a.wav.import vendored Normal file
View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://dhlg3pk3tbirp"
path="res://.godot/imported/a.wav-512eaf7f1be1e1dbb02db32d769d1e7c.sample"
[deps]
source_file="res://external/sample audio/a.wav"
dest_files=["res://.godot/imported/a.wav-512eaf7f1be1e1dbb02db32d769d1e7c.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

BIN
external/sample audio/b.wav vendored Normal file

Binary file not shown.

24
external/sample audio/b.wav.import vendored Normal file
View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://7dsv6kcptvar"
path="res://.godot/imported/b.wav-c59cd0574c9eda65844ca10622a04f6a.sample"
[deps]
source_file="res://external/sample audio/b.wav"
dest_files=["res://.godot/imported/b.wav-c59cd0574c9eda65844ca10622a04f6a.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

BIN
external/sample audio/c.wav vendored Normal file

Binary file not shown.

24
external/sample audio/c.wav.import vendored Normal file
View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://dr3jq3tnvtwu"
path="res://.godot/imported/c.wav-95e1dea73d2cd00bc271f8a5505d51d0.sample"
[deps]
source_file="res://external/sample audio/c.wav"
dest_files=["res://.godot/imported/c.wav-95e1dea73d2cd00bc271f8a5505d51d0.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

BIN
external/sample audio/d.wav vendored Normal file

Binary file not shown.

24
external/sample audio/d.wav.import vendored Normal file
View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://dsikjobcle18a"
path="res://.godot/imported/d.wav-85e5f5f34f2501a9d76f76f4be908185.sample"
[deps]
source_file="res://external/sample audio/d.wav"
dest_files=["res://.godot/imported/d.wav-85e5f5f34f2501a9d76f76f4be908185.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

BIN
external/sample audio/e.wav vendored Normal file

Binary file not shown.

24
external/sample audio/e.wav.import vendored Normal file
View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://dornjmfg37bv0"
path="res://.godot/imported/e.wav-33e3ff5e179b6933a12f0965dbee05eb.sample"
[deps]
source_file="res://external/sample audio/e.wav"
dest_files=["res://.godot/imported/e.wav-33e3ff5e179b6933a12f0965dbee05eb.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

BIN
external/sample audio/f.wav vendored Normal file

Binary file not shown.

24
external/sample audio/f.wav.import vendored Normal file
View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bqu2otr8b1oj6"
path="res://.godot/imported/f.wav-e8b08693b137a9f5e83ffd51a7709a8e.sample"
[deps]
source_file="res://external/sample audio/f.wav"
dest_files=["res://.godot/imported/f.wav-e8b08693b137a9f5e83ffd51a7709a8e.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

BIN
external/test portraits/a.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

40
external/test portraits/a.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://13pdg1vs81as"
path="res://.godot/imported/a.png-ebbbc7f6f20fea8e38d2eb9b9f504ae6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/test portraits/a.png"
dest_files=["res://.godot/imported/a.png-ebbbc7f6f20fea8e38d2eb9b9f504ae6.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

BIN
external/test portraits/b.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

40
external/test portraits/b.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ca6iihdssrh14"
path="res://.godot/imported/b.png-c4aed0756051058e2c54ebf8a9768024.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/test portraits/b.png"
dest_files=["res://.godot/imported/b.png-c4aed0756051058e2c54ebf8a9768024.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

BIN
external/test portraits/c.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

40
external/test portraits/c.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dm7fo7tt00p1"
path="res://.godot/imported/c.png-959ec224d08023f8cd903e843fd686a9.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/test portraits/c.png"
dest_files=["res://.godot/imported/c.png-959ec224d08023f8cd903e843fd686a9.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

BIN
external/test portraits/d.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

40
external/test portraits/d.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b2ovogspuupqa"
path="res://.godot/imported/d.png-eab85833b41c1be7a701598ea9d65289.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/test portraits/d.png"
dest_files=["res://.godot/imported/d.png-eab85833b41c1be7a701598ea9d65289.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

BIN
external/test portraits/e.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

40
external/test portraits/e.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b2rynijk10l8a"
path="res://.godot/imported/e.png-2e8cf58eaf7604a4ffa5b244bcce0759.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/test portraits/e.png"
dest_files=["res://.godot/imported/e.png-2e8cf58eaf7604a4ffa5b244bcce0759.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

BIN
external/test portraits/f.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

40
external/test portraits/f.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c265jqwykqc2s"
path="res://.godot/imported/f.png-781e05d9cb8315bdfb553bff384fdaac.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/test portraits/f.png"
dest_files=["res://.godot/imported/f.png-781e05d9cb8315bdfb553bff384fdaac.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

BIN
external/title.clip vendored

Binary file not shown.

Binary file not shown.

BIN
external/trigger-icon.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

40
external/trigger-icon.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://xomk6sb0cnfy"
path="res://.godot/imported/trigger-icon.png-28f3bc3b679f225965e92f3adaf23e10.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/trigger-icon.png"
dest_files=["res://.godot/imported/trigger-icon.png-28f3bc3b679f225965e92f3adaf23e10.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

1
models/datablock.gltf Normal file
View File

@@ -0,0 +1 @@
{"asset":{"version":"2.0","generator":"Blockbench 5.0.7 glTF exporter"},"scenes":[{"nodes":[0],"name":"blockbench_export"}],"scene":0,"nodes":[{"rotation":[0.3535533905932738,0.3535533905932738,0.14644660940672624,0.8535533905932737],"name":"mesh","mesh":0}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":288,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":576,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":768,"byteLength":72,"target":34963}],"buffers":[{"byteLength":840,"uri":"data:application/octet-stream;base64,AAAAPwAAgD8AAAA/AAAAPwAAAAAAAAA/AAAAPwAAgD8AAAC/AAAAPwAAAAAAAAC/AAAAvwAAgD8AAAA/AAAAvwAAgD8AAAC/AAAAvwAAAAAAAAA/AAAAvwAAAAAAAAC/AAAAPwAAgD8AAAA/AAAAPwAAgD8AAAC/AAAAvwAAgD8AAAA/AAAAvwAAgD8AAAC/AAAAPwAAAAAAAAA/AAAAvwAAAAAAAAA/AAAAPwAAAAAAAAC/AAAAvwAAAAAAAAC/AAAAPwAAgD8AAAA/AAAAvwAAgD8AAAA/AAAAPwAAAAAAAAA/AAAAvwAAAAAAAAA/AAAAPwAAgD8AAAC/AAAAPwAAAAAAAAC/AAAAvwAAgD8AAAC/AAAAvwAAAAAAAAC/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAAAAAACAPwAAgD8AAAAAAACAPwAAgD8AAIA/AAAAAAAAAAAAAAAAAACAPwAAgD8AAAAAAACAPwAAgD8AAIA/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAIA/AAAAAAAAgD8AAIA/AAAAAAAAAAAAAAAAAACAPwAAgD8AAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAIA/AAAAAAAAgD8AAIA/AgAAAAEAAgABAAMABgAEAAUABgAFAAcACgAIAAkACgAJAAsADgAMAA0ADgANAA8AEgAQABEAEgARABMAFgAUABUAFgAVABcA"}],"accessors":[{"bufferView":0,"componentType":5126,"count":24,"max":[0.5,1,0.5],"min":[-0.5,0,-0.5],"type":"VEC3"},{"bufferView":1,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":2,"componentType":5126,"count":24,"max":[1,1],"min":[0,0],"type":"VEC2"},{"bufferView":3,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"}],"materials":[{"pbrMetallicRoughness":{"metallicFactor":0,"roughnessFactor":1,"baseColorTexture":{"index":0}},"alphaMode":"MASK","alphaCutoff":0.05,"doubleSided":true}],"textures":[{"sampler":0,"source":0,"name":"texture"}],"samplers":[{"magFilter":9728,"minFilter":9728,"wrapS":33071,"wrapT":33071}],"images":[{"mimeType":"image/png","uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAgUlEQVR4AeyWsQ0AIQwDI8ZgDuZgWOZgDtb4lwu7/eYTGiOdIqXA5irac/m0uHxUYO8doPcemSAD8N0qwEX1VIE5Z4DsAsgAzFEBLqqnC9iADdiADdiADdiADdiADcjAWitA9rccGYA5KsBF9VSBMUaAc05kggzAh6oAF3/Pr/teAAAA//+XbCPxAAAABklEQVQDAKj338Fk9RQnAAAAAElFTkSuQmCC"}],"meshes":[{"primitives":[{"mode":4,"attributes":{"POSITION":0,"NORMAL":1,"TEXCOORD_0":2},"indices":3,"material":0}]}]}

View File

@@ -0,0 +1,42 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://d187i1jot4wmy"
path="res://.godot/imported/datablock.gltf-bd1206a04074a56813fd4c73675028f6.scn"
[deps]
source_file="res://models/datablock.gltf"
dest_files=["res://.godot/imported/datablock.gltf-bd1206a04074a56813fd4c73675028f6.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=false
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={}
gltf/naming_version=2
gltf/embedded_image_handling=1

BIN
models/datablock_0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 B

View File

@@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b7s2n7xcvntpl"
path.s3tc="res://.godot/imported/datablock_0.png-be2ea7c3074a4bce475d2e7d6a4e74f6.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "78f80e90042787b6f29cb279213d54f5"
}
[deps]
source_file="res://models/datablock_0.png"
dest_files=["res://.godot/imported/datablock_0.png-be2ea7c3074a4bce475d2e7d6a4e74f6.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

View File

@@ -7,6 +7,11 @@ resource_name = "texture_0"
transparency = 4
cull_mode = 2
shading_mode = 0
diffuse_mode = 3
specular_mode = 2
disable_ambient_light = true
disable_fog = true
disable_specular_occlusion = true
albedo_texture = ExtResource("1_anj20")
texture_filter = 0
texture_repeat = false

View File

@@ -1,73 +1,11 @@
[gd_scene load_steps=13 format=3 uid="uid://ck4x56txf676a"]
[gd_scene load_steps=6 format=3 uid="uid://ck4x56txf676a"]
[ext_resource type="Script" uid="uid://grs3nyom325o" path="res://scripts/character_select.gd" id="1_bow2h"]
[ext_resource type="PackedScene" uid="uid://46rpw0rrd51m" path="res://templates/pawn_display.tscn" id="2_5wdeo"]
[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/old-music/16 - Character Select.mp3" id="3_bow2h"]
[ext_resource type="AudioStream" uid="uid://cwmfd8ov3lj1h" path="res://audio/sounds/menu select.wav" id="7_bqp8h"]
[ext_resource type="AudioStream" uid="uid://doelc8yt5snc2" path="res://audio/sounds/Keypad A.wav" id="8_5cdo8"]
[sub_resource type="Shader" id="Shader_fa52j"]
code = "shader_type canvas_item;
uniform sampler2D main_texture;
uniform float granularity : hint_range(5, 30) = 15.0;
uniform float opacity_limit;
float random (vec2 uv) {
return fract(sin(dot(uv.xy,
vec2(12.9898,78.233))) * 43758.5453123);
}
void vertex() {
// Called for every vertex the material is visible on.
}
void fragment() {
// Called for every pixel the material is visible on.
vec2 uv = UV;
float g = ( pow(granularity, 2));
uv = round((uv * g)) / g;
uv.y = TIME * uv.y + TIME * .05;
uv.x = 10.0 * TIME * uv.x + TIME * 1.0;
float val = random(uv);
float op = random(-uv) / val;
float alpha = 1.0;
if(op < opacity_limit){
alpha = 0.0;
}
vec4 color = vec4(val, val, val, alpha * COLOR.a);
COLOR = color;
}
//void light() {
// // Called for every pixel for every light affecting the CanvasItem.
// // Uncomment to replace the default light processing function with this one.
//}
"
[sub_resource type="ShaderMaterial" id="ShaderMaterial_5wdeo"]
shader = SubResource("Shader_fa52j")
shader_parameter/granularity = 10.0000002375
shader_parameter/opacity_limit = 0.86
[sub_resource type="Gradient" id="Gradient_ak2if"]
offsets = PackedFloat32Array(0)
colors = PackedColorArray(0, 0, 0, 1)
[sub_resource type="GradientTexture1D" id="GradientTexture1D_fa52j"]
gradient = SubResource("Gradient_ak2if")
width = 1
[sub_resource type="Gradient" id="Gradient_w1hxv"]
offsets = PackedFloat32Array(1)
colors = PackedColorArray(1, 1, 1, 1)
[sub_resource type="GradientTexture1D" id="GradientTexture1D_bqp8h"]
gradient = SubResource("Gradient_w1hxv")
width = 1
[node name="Control" type="Control" groups=["scenes"]]
layout_mode = 3
anchors_preset = 15
@@ -90,416 +28,109 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Control" type="Control" parent="Panel"]
[node name="PawnDisplays" type="Control" parent="Panel"]
unique_name_in_owner = true
anchors_preset = 0
offset_left = 94.0
offset_top = 98.0
offset_right = 134.0
offset_bottom = 138.0
[node name="P1PawnDisplay" parent="Panel/Control" instance=ExtResource("2_5wdeo")]
unique_name_in_owner = true
[node name="PawnDisplay" parent="Panel/PawnDisplays" instance=ExtResource("2_5wdeo")]
layout_mode = 0
offset_left = 0.0
offset_top = 0.0
offset_right = 700.0
offset_bottom = 700.0
offset_left = -29.0
offset_top = -65.0
offset_right = 471.0
offset_bottom = 435.0
[node name="P2PawnDisplay" parent="Panel/Control" instance=ExtResource("2_5wdeo")]
unique_name_in_owner = true
[node name="PawnDisplay2" parent="Panel/PawnDisplays" instance=ExtResource("2_5wdeo")]
layout_mode = 0
offset_left = 1032.0
offset_top = 0.0
offset_right = 1732.0
offset_bottom = 700.0
offset_left = 1258.0
offset_top = -65.0
offset_right = 1758.0
offset_bottom = 435.0
[node name="PawnName" parent="Panel/Control/P2PawnDisplay/Control" index="0"]
modulate = Color(0.78848296, 0, 0.22455063, 1)
[node name="PawnDisplay3" parent="Panel/PawnDisplays" instance=ExtResource("2_5wdeo")]
layout_mode = 0
offset_left = 36.0
offset_top = 451.0
offset_right = 536.0
offset_bottom = 951.0
[node name="Panel2" type="Panel" parent="."]
[node name="PawnDisplay4" parent="Panel/PawnDisplays" instance=ExtResource("2_5wdeo")]
layout_mode = 0
offset_left = 1192.0
offset_top = 456.0
offset_right = 1692.0
offset_bottom = 956.0
[node name="Panel2" type="Control" parent="."]
custom_minimum_size = Vector2(0, 250)
layout_mode = 1
anchors_preset = 12
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 0
anchors_preset = 0
offset_left = 727.0
offset_top = 98.0
offset_right = 877.0
offset_bottom = 348.0
[node name="HBoxContainer" type="HBoxContainer" parent="Panel2"]
[node name="PawnPickPortraits" type="GridContainer" parent="Panel2"]
unique_name_in_owner = true
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -512.5
offset_top = -75.0
offset_right = 512.5
offset_bottom = 75.0
grow_horizontal = 2
grow_vertical = 2
theme_override_constants/separation = 25
alignment = 1
[node name="Panel" type="Panel" parent="Panel2/HBoxContainer"]
custom_minimum_size = Vector2(150, 150)
layout_mode = 2
[node name="Portrait" type="TextureRect" parent="Panel2/HBoxContainer/Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("2_uxcyu")
expand_mode = 1
[node name="Control" type="Control" parent="Panel2/HBoxContainer/Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Static" type="TextureRect" parent="Panel2/HBoxContainer/Panel/Control"]
material = SubResource("ShaderMaterial_5wdeo")
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = SubResource("GradientTexture1D_fa52j")
expand_mode = 1
[node name="Green Tint" type="TextureRect" parent="Panel2/HBoxContainer/Panel/Control"]
modulate = Color(0, 0.6039216, 0, 0.42745098)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = SubResource("GradientTexture1D_bqp8h")
expand_mode = 1
[node name="NinePatchRect" type="NinePatchRect" parent="Panel2/HBoxContainer/Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Panel2" type="Panel" parent="Panel2/HBoxContainer"]
custom_minimum_size = Vector2(150, 150)
layout_mode = 2
[node name="Portrait" type="TextureRect" parent="Panel2/HBoxContainer/Panel2"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("2_uxcyu")
expand_mode = 1
[node name="Control" type="Control" parent="Panel2/HBoxContainer/Panel2"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Static" type="TextureRect" parent="Panel2/HBoxContainer/Panel2/Control"]
material = SubResource("ShaderMaterial_5wdeo")
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = SubResource("GradientTexture1D_fa52j")
expand_mode = 1
[node name="Green Tint" type="TextureRect" parent="Panel2/HBoxContainer/Panel2/Control"]
modulate = Color(0, 0.6039216, 0, 0.42745098)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = SubResource("GradientTexture1D_bqp8h")
expand_mode = 1
[node name="NinePatchRect" type="NinePatchRect" parent="Panel2/HBoxContainer/Panel2"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Panel3" type="Panel" parent="Panel2/HBoxContainer"]
custom_minimum_size = Vector2(150, 150)
layout_mode = 2
[node name="Portrait" type="TextureRect" parent="Panel2/HBoxContainer/Panel3"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("2_uxcyu")
expand_mode = 1
[node name="Control" type="Control" parent="Panel2/HBoxContainer/Panel3"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Static" type="TextureRect" parent="Panel2/HBoxContainer/Panel3/Control"]
material = SubResource("ShaderMaterial_5wdeo")
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = SubResource("GradientTexture1D_fa52j")
expand_mode = 1
[node name="Green Tint" type="TextureRect" parent="Panel2/HBoxContainer/Panel3/Control"]
modulate = Color(0, 0.6039216, 0, 0.42745098)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = SubResource("GradientTexture1D_bqp8h")
expand_mode = 1
[node name="NinePatchRect" type="NinePatchRect" parent="Panel2/HBoxContainer/Panel3"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Panel4" type="Panel" parent="Panel2/HBoxContainer"]
custom_minimum_size = Vector2(150, 150)
layout_mode = 2
[node name="Portrait" type="TextureRect" parent="Panel2/HBoxContainer/Panel4"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("2_uxcyu")
expand_mode = 1
[node name="Control" type="Control" parent="Panel2/HBoxContainer/Panel4"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Static" type="TextureRect" parent="Panel2/HBoxContainer/Panel4/Control"]
material = SubResource("ShaderMaterial_5wdeo")
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = SubResource("GradientTexture1D_fa52j")
expand_mode = 1
[node name="Green Tint" type="TextureRect" parent="Panel2/HBoxContainer/Panel4/Control"]
modulate = Color(0, 0.6039216, 0, 0.42745098)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = SubResource("GradientTexture1D_bqp8h")
expand_mode = 1
[node name="NinePatchRect" type="NinePatchRect" parent="Panel2/HBoxContainer/Panel4"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Panel5" type="Panel" parent="Panel2/HBoxContainer"]
custom_minimum_size = Vector2(150, 150)
layout_mode = 2
[node name="Portrait" type="TextureRect" parent="Panel2/HBoxContainer/Panel5"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("2_uxcyu")
expand_mode = 1
[node name="Control" type="Control" parent="Panel2/HBoxContainer/Panel5"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Static" type="TextureRect" parent="Panel2/HBoxContainer/Panel5/Control"]
material = SubResource("ShaderMaterial_5wdeo")
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = SubResource("GradientTexture1D_fa52j")
expand_mode = 1
[node name="Green Tint" type="TextureRect" parent="Panel2/HBoxContainer/Panel5/Control"]
modulate = Color(0, 0.6039216, 0, 0.42745098)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = SubResource("GradientTexture1D_bqp8h")
expand_mode = 1
[node name="NinePatchRect" type="NinePatchRect" parent="Panel2/HBoxContainer/Panel5"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Panel6" type="Panel" parent="Panel2/HBoxContainer"]
custom_minimum_size = Vector2(150, 150)
layout_mode = 2
[node name="Portrait" type="TextureRect" parent="Panel2/HBoxContainer/Panel6"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("2_uxcyu")
expand_mode = 1
[node name="Control" type="Control" parent="Panel2/HBoxContainer/Panel6"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Static" type="TextureRect" parent="Panel2/HBoxContainer/Panel6/Control"]
material = SubResource("ShaderMaterial_5wdeo")
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = SubResource("GradientTexture1D_fa52j")
expand_mode = 1
[node name="Green Tint" type="TextureRect" parent="Panel2/HBoxContainer/Panel6/Control"]
modulate = Color(0, 0.6039216, 0, 0.42745098)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = SubResource("GradientTexture1D_bqp8h")
expand_mode = 1
[node name="NinePatchRect" type="NinePatchRect" parent="Panel2/HBoxContainer/Panel6"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -75.0
offset_top = -114.0
offset_right = 383.0
offset_bottom = 806.0
grow_horizontal = 2
grow_vertical = 2
columns = 3
[node name="SelectorStart" type="Control" parent="Panel2"]
unique_name_in_owner = true
anchors_preset = 0
offset_left = 438.0
offset_top = 40.0
offset_right = 478.0
offset_bottom = 80.0
offset_left = -9.0
offset_right = 31.0
offset_bottom = 40.0
[node name="Panel3" type="Panel" parent="."]
layout_mode = 1
anchors_preset = 10
anchor_right = 1.0
offset_bottom = 75.0
grow_horizontal = 2
[node name="Label" type="Label" parent="Panel3"]
[node name="Label" type="Label" parent="."]
layout_mode = 1
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -75.5
offset_top = -23.0
offset_right = 75.5
offset_left = -188.5
offset_top = -1060.0
offset_right = 188.5
offset_bottom = -1005.0
grow_horizontal = 2
grow_vertical = 0
theme_override_font_sizes/font_size = 40
text = "CHARACTER SELECT"
horizontal_alignment = 1
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
[node name="Music" type="AudioStreamPlayer" parent="."]
stream = ExtResource("3_bow2h")
volume_db = -5.0
autoplay = true
bus = &"Music"
[node name="SelectSound" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
stream = ExtResource("7_bqp8h")
[node name="Announcer" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
volume_db = 12.381
bus = &"Voice"
[node name="SwitchSound" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
stream = ExtResource("8_5cdo8")
bus = &"SFX"
[connection signal="spawned" from="SelectorSpawner" to="." method="_on_selector_spawner_spawned"]
[connection signal="child_entered_tree" from="Panel2/SelectorStart" to="." method="_on_selector_start_child_entered_tree"]
[editable path="Panel/Control/P1PawnDisplay"]
[editable path="Panel/Control/P2PawnDisplay"]

View File

@@ -0,0 +1,139 @@
[gd_scene load_steps=6 format=3 uid="uid://ck4x56txf676a"]
[ext_resource type="Script" uid="uid://grs3nyom325o" path="res://scripts/character_select.gd" id="1_bow2h"]
[ext_resource type="PackedScene" uid="uid://46rpw0rrd51m" path="res://templates/pawn_display.tscn" id="2_5wdeo"]
[ext_resource type="AudioStream" uid="uid://vcatohtmt8bk" path="res://audio/old-music/16 - Character Select.mp3" id="3_bow2h"]
[ext_resource type="AudioStream" uid="uid://cwmfd8ov3lj1h" path="res://audio/sounds/menu select.wav" id="7_bqp8h"]
[ext_resource type="AudioStream" uid="uid://doelc8yt5snc2" path="res://audio/sounds/Keypad A.wav" id="8_5cdo8"]
[node name="Control" type="Control" groups=["scenes"]]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_bow2h")
[node name="SelectorSpawner" type="MultiplayerSpawner" parent="."]
unique_name_in_owner = true
_spawnable_scenes = PackedStringArray("uid://bvypswoe6diaq")
spawn_path = NodePath("../Panel2/SelectorStart")
[node name="Panel" type="Panel" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="PawnDisplays" type="Control" parent="Panel"]
unique_name_in_owner = true
anchors_preset = 0
offset_left = 94.0
offset_top = 98.0
offset_right = 134.0
offset_bottom = 138.0
[node name="PawnDisplay" parent="Panel/PawnDisplays" instance=ExtResource("2_5wdeo")]
layout_mode = 0
offset_left = -29.0
offset_top = -65.0
offset_right = 471.0
offset_bottom = 435.0
[node name="PawnDisplay2" parent="Panel/PawnDisplays" instance=ExtResource("2_5wdeo")]
layout_mode = 0
offset_left = 1258.0
offset_top = -65.0
offset_right = 1758.0
offset_bottom = 435.0
[node name="PawnDisplay3" parent="Panel/PawnDisplays" instance=ExtResource("2_5wdeo")]
visible = false
layout_mode = 0
offset_left = 36.0
offset_top = 451.0
offset_right = 536.0
offset_bottom = 951.0
[node name="PawnDisplay4" parent="Panel/PawnDisplays" instance=ExtResource("2_5wdeo")]
visible = false
layout_mode = 0
offset_left = 1192.0
offset_top = 456.0
offset_right = 1692.0
offset_bottom = 956.0
[node name="Panel2" type="Control" parent="."]
custom_minimum_size = Vector2(0, 250)
anchors_preset = 0
offset_left = 727.0
offset_top = 98.0
offset_right = 877.0
offset_bottom = 348.0
[node name="PawnPickPortraits" type="GridContainer" parent="Panel2"]
unique_name_in_owner = true
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -75.0
offset_top = -114.0
offset_right = 383.0
offset_bottom = 806.0
grow_horizontal = 2
grow_vertical = 2
columns = 3
[node name="SelectorStart" type="Control" parent="Panel2"]
unique_name_in_owner = true
anchors_preset = 0
offset_left = 438.0
offset_top = 40.0
offset_right = 478.0
offset_bottom = 80.0
[node name="Label" type="Label" parent="."]
layout_mode = 1
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -188.5
offset_top = -1060.0
offset_right = 188.5
offset_bottom = -1005.0
grow_horizontal = 2
grow_vertical = 0
theme_override_font_sizes/font_size = 40
text = "CHARACTER SELECT"
horizontal_alignment = 1
[node name="Music" type="AudioStreamPlayer" parent="."]
stream = ExtResource("3_bow2h")
volume_db = -5.0
autoplay = true
bus = &"Music"
[node name="SelectSound" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
stream = ExtResource("7_bqp8h")
[node name="Announcer" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
volume_db = 12.381
bus = &"Voice"
[node name="SwitchSound" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
stream = ExtResource("8_5cdo8")
bus = &"SFX"
[connection signal="spawned" from="SelectorSpawner" to="." method="_on_selector_spawner_spawned"]
[connection signal="child_entered_tree" from="Panel2/SelectorStart" to="." method="_on_selector_start_child_entered_tree"]

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=13 format=4 uid="uid://dewb10lmvj1yy"]
[gd_scene load_steps=15 format=4 uid="uid://dewb10lmvj1yy"]
[ext_resource type="Script" uid="uid://d3t381vws7vns" path="res://scripts/level.gd" id="1_0a1dj"]
[ext_resource type="PackedScene" uid="uid://bgocskbofewsr" path="res://templates/HUD.tscn" id="2_uckv6"]
@@ -8,10 +8,19 @@
[ext_resource type="MeshLibrary" uid="uid://bp5402nbrw3hx" path="res://manufactory_minimap_mesh_library.tres" id="6_0a1dj"]
[ext_resource type="Texture2D" uid="uid://dri0a20l6kpbj" path="res://visuals/images/icon.svg" id="7_cttrw"]
[ext_resource type="AudioStream" uid="uid://cr0n18se6jnig" path="res://audio/music/Industrial Matts Fridge Intensity 2.wav" id="9_d3ajt"]
[ext_resource type="Script" uid="uid://b5npi1ys4lnf4" path="res://scripts/multiplayer_level_setup.gd" id="9_owm7e"]
[ext_resource type="PackedScene" uid="uid://dyvov4i48mqoi" path="res://templates/datablock_pickup.tscn" id="10_owm7e"]
[sub_resource type="Environment" id="Environment_x4b8f"]
background_energy_multiplier = 0.29
background_mode = 1
ambient_light_color = Color(1, 1, 1, 1)
reflected_light_source = 1
tonemap_white = 16.0
glow_enabled = true
fog_mode = 1
fog_light_color = Color(0.21401742, 0.23577034, 0.2696176, 1)
fog_light_energy = 0.0
fog_density = 1.0
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_d3ajt"]
resource_name = "material_0"
@@ -57,6 +66,7 @@ blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_tlwuy")
[node name="Manufactory Level" type="Node3D"]
process_mode = 4
script = ExtResource("1_0a1dj")
difficulty = 5
@@ -407,4 +417,14 @@ stream = ExtResource("9_d3ajt")
volume_db = -24.684
autoplay = true
[node name="MultiplayerLevelSetup" type="Node" parent="."]
unique_name_in_owner = true
script = ExtResource("9_owm7e")
[node name="Datablock Pickup" parent="." instance=ExtResource("10_owm7e")]
transform = Transform3D(0.99999994, 0, 0, 0, 0.9426415, -0.33380684, 0, 0.33380687, 0.94264144, 0.5, 1.790432, 0.5)
[connection signal="spawned" from="PawnSpawner" to="MultiplayerLevelSetup" method="_on_pawn_spawner_spawned"]
[connection signal="spawned" from="CameraSpawner" to="MultiplayerLevelSetup" method="_on_camera_spawner_spawned"]
[editable path="CanvasLayer/HUD"]

View File

@@ -3,7 +3,7 @@
[ext_resource type="Script" uid="uid://dep7nr2nkdmga" path="res://scripts/multiplayer_setup.gd" id="1_lckj3"]
[node name="MultiplayerSetup" type="MultiplayerSpawner" groups=["level_spawner"]]
_spawnable_scenes = PackedStringArray("uid://ti65jukt8gvs", "uid://ck4x56txf676a", "uid://by6suwmds7xq2")
_spawnable_scenes = PackedStringArray("uid://ti65jukt8gvs", "uid://ck4x56txf676a", "uid://dewb10lmvj1yy")
spawn_path = NodePath(".")
script = ExtResource("1_lckj3")

File diff suppressed because one or more lines are too long

View File

@@ -412,14 +412,17 @@ offset_bottom = 648.0
stream = ExtResource("4_mykxm")
volume_db = -18.606
autoplay = true
bus = &"Music"
[node name="SelectSound" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
stream = ExtResource("6_3yumr")
bus = &"UI"
[node name="SwitchSound" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
stream = ExtResource("7_cs5ya")
bus = &"UI"
[node name="TextureRect6" type="TextureRect" parent="."]
layout_mode = 0

70
scenes/vrep_loading.tscn Normal file
View File

@@ -0,0 +1,70 @@
[gd_scene load_steps=3 format=3 uid="uid://dq5mtoakhfxx4"]
[ext_resource type="Texture2D" uid="uid://cp188cfq4qeas" path="res://external/progress_over.png" id="1_wa8kr"]
[ext_resource type="Texture2D" uid="uid://g7k311jjr73e" path="res://external/progress_fill.png" id="2_0fdvr"]
[node name="Node2D" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="ColorRect" type="ColorRect" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
color = Color(0, 0, 0, 1)
[node name="RichTextLabel" type="RichTextLabel" parent="."]
layout_mode = 0
offset_left = 160.0
offset_top = 413.0
offset_right = 1765.0
offset_bottom = 618.0
theme_override_font_sizes/normal_font_size = 150
bbcode_enabled = true
text = "LOADING V-REP . . ."
fit_content = true
scroll_active = false
[node name="TextureProgressBar" type="TextureProgressBar" parent="."]
texture_filter = 1
layout_mode = 0
offset_left = 133.0
offset_top = 894.0
offset_right = 1731.0
offset_bottom = 987.0
nine_patch_stretch = true
stretch_margin_left = 10
stretch_margin_top = 10
stretch_margin_right = 10
stretch_margin_bottom = 10
texture_over = ExtResource("1_wa8kr")
texture_progress = ExtResource("2_0fdvr")
[node name="RichTextLabel2" type="RichTextLabel" parent="."]
layout_mode = 1
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -309.0
offset_top = -260.0
offset_right = 309.0
offset_bottom = -205.0
grow_horizontal = 2
grow_vertical = 0
theme_override_font_sizes/normal_font_size = 40
bbcode_enabled = true
text = "[center]Simulating Virtual Environment[/center]
"
fit_content = true
scroll_active = false

View File

@@ -7,6 +7,16 @@ enum Modes{
VS_MAN
}
var pawns : Dictionary = {
"A" : load("res://data/pawns/a.tres"),
"B" : load("res://data/pawns/b.tres"),
"C" : load("res://data/pawns/c.tres"),
"D" : load("res://data/pawns/d.tres"),
"E" : load("res://data/pawns/e.tres"),
"F" : load("res://data/pawns/f.tres")
}
const blinder_template = preload("res://templates/blinder.tscn")
const one_shot_template = preload("res://templates/one_shot.tscn")
@@ -15,13 +25,14 @@ const vs_com_level = preload("res://scenes/test_level.tscn")
const vs_man_level = preload("res://scenes/manufactory.tscn")
const pawn_select_scene = preload("res://scenes/character_select.tscn")
var cmd_args : Dictionary = {}
var player : PawnController
var hud : HUD
var level : Level
var mode : Modes = Modes.STORY
var multiplayer_game : bool = false
var num_players : int = 1
var pawns_selected : Dictionary[int, PawnBaseData] = {}
var pawns_selected : Dictionary[int, StringName] = {}
var level_synced : Dictionary[int, bool] = {}
var net_test : bool #TODO: Remove later
@@ -30,16 +41,21 @@ func _ready() -> void:
for arg in OS.get_cmdline_args():
if arg.begins_with("--"):
var flag = arg.lstrip("--")
if flag.contains("="):
var key_val = flag.split("=")
args[key_val[0]]=key_val[1]
args[flag]=true
if args.has("net_test"):
net_test = true
if args.has("instance_id"):
get_tree().root.title = "Net Gunner (Instance: %s)" % args.instance_id
cmd_args = args
func setup_player(pc : PawnController) -> void:
var is_local = false
Game.level.pawns[pc.id] = pc
if pc.id == Multiplayer.id:
is_local = true
level.pawns[pc.id] = pc
if is_local:
player = pc
if hud:
@@ -49,10 +65,11 @@ func is_multiplayer() -> bool:
return multiplayer_game
func start_level(pawns : Dictionary[int, PawnBaseData]) -> void:
func start_level(pawn_dict : Dictionary[int, StringName]) -> void:
pawns_selected = pawn_dict
if !Multiplayer.is_host():
return
pawns_selected = pawns
for i in Multiplayer.players.values():
level_synced[i] = false
level_synced[1] = true
@@ -117,13 +134,12 @@ func level_spawned(peer_id : int) -> void:
level_synced[peer_id] = true
check_level_ready()
func check_level_ready() -> void:
var ready : bool = true
var level_ready : bool = true
for id in level_synced:
if level_synced[id] == false:
ready = false
if ready:
level_ready = false
if level_ready:
level.setup()
func oneshot(stream : AudioStream) -> void:

View File

@@ -34,11 +34,11 @@ func become_host() -> void:
print("Hosting Room...")
var room_id = await server_peer.room_connected
print("Connected to room: ", server_peer.room_id)
server_peer.get_rooms()
#server_peer.get_rooms()
print("GETTING ROOMS!")
var rooms = await server_peer.rooms_received
#var rooms = await server_peer.rooms_received
print("GOT ROOMS!")
print(rooms)
#print(rooms)
players[handle] = 1
player_readiness[1] = false
@@ -81,26 +81,26 @@ func is_server() -> bool:
func is_host() -> bool:
return id == 1
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
if waiting:
var ready : bool = true
var group_ready : bool = true
for pr in player_readiness.values():
if !pr:
ready = false
group_ready = false
break
if ready:
if group_ready:
all_ready.emit()
waiting = false
for pr in player_readiness.keys():
player_readiness[pr] = false
func _add_player_to_game(id : int) -> void:
print("Player %s joined the game!" % id)
func _add_player_to_game(pid : int) -> void:
print("Player %s joined the game!" % pid)
await get_tree().create_timer(0.5).timeout
get_handle_from_peer(id)
get_handle_from_peer(pid)
func _remove_player_from_game(id : int) -> void:
print("Player %s left the game!" % id)
func _remove_player_from_game(pid : int) -> void:
print("Player %s left the game!" % pid)
func get_handle_from_peer(peer_id) -> void:
rpc_id(peer_id, "report_handle_to_peer", id)

View File

@@ -1,13 +1,6 @@
extends Control
class_name CharacterSelect extends Control
const pawns : Array[PawnBaseData] = [
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")
]
const p_colors : Array[Color] = [
Color.ROYAL_BLUE,
@@ -16,31 +9,53 @@ const p_colors : Array[Color] = [
const selector_template = preload("res://templates/pawn_selector.tscn")
@onready var pawn_displays : Array[PawnDisplay] = [
%P1PawnDisplay,
%P2PawnDisplay
]
const pawn_pick_portrait_template = preload("res://templates/pawn_pick_portrait.tscn")
var selector_wait : float = 0
var selected : int = -1
var selectors : Dictionary[int,PawnSelector] = {}
var displays : Dictionary[int, PawnDisplay] = {}
var portraits : Dictionary[Vector2i, PawnPickPortrait] = {}
var announce_tween : Tween = null
@onready var announcer : AudioStreamPlayer = %Announcer
@onready var selector_start : Control = %SelectorStart
@onready var switch_sound : AudioStreamPlayer = %SwitchSound
@onready var select_sound : AudioStreamPlayer = %SelectSound
@onready var portrait_grid : GridContainer = %PawnPickPortraits
@onready var pawn_displays : Control = %PawnDisplays
func _ready() -> void:
var i : int = 0
var idx : Vector2i = Vector2i.ZERO
for pawn in Game.pawns.values():
var pp : PawnPickPortrait = pawn_pick_portrait_template.instantiate()
portrait_grid.add_child(pp)
pp.setup(pawn, i)
portraits[idx] = pp
i+=1
idx.x += 1
if idx.x >= portrait_grid.columns:
idx.y += 1
idx.x -= portrait_grid.columns
Multiplayer.waiting = true
var plist
if Game.is_multiplayer():
plist = Multiplayer.players.values()
for i in range(Game.num_players):
displays[plist[i]] = pawn_displays[i]
change_display(plist[i], 0)
for id in range(Game.num_players):
var display : PawnDisplay = pawn_displays.get_child(id)
displays[plist[id]] = display
display.visible = true
portraits[Vector2i.ZERO].num_players += 1
change_display(plist[id], 0)
else:
displays[1] = pawn_displays[0]
displays[1] = pawn_displays.get_child(0)
displays[1].visible = true
change_display(1, 0)
portraits[Vector2i.ZERO].num_players += 1
Multiplayer.all_ready.connect(add_selector, CONNECT_ONE_SHOT)
Multiplayer.set_player_ready.rpc(Multiplayer.id)
#Set up each pawn on bottom
@@ -64,12 +79,12 @@ func _process(delta : float) -> void:
if !selectors.has(Multiplayer.id):
return
var locked = true
var pawns_selected : Dictionary[int, PawnBaseData] = {}
var pawns_selected : Dictionary[int, StringName] = {}
for selector : PawnSelector in selectors.values():
if !selector.selected:
locked = false
else:
pawns_selected[selector.player_id] = pawns[selector.selection]
pawns_selected[selector.player_id] = portraits[selector.selection].pawn.name
if locked:
Game.start_level(pawns_selected)
@@ -85,26 +100,34 @@ func _process(delta : float) -> void:
input_vector = Input.get_vector("west","east","north","south")
var move_dir : Vector2 = Vector2.ZERO
var move_dir : Vector2i = Vector2.ZERO
if input_vector.x < 0:
move_dir.x -= 1
if input_vector.x > 0:
move_dir.x += 1
if move_dir.x != 0:
move_selector.rpc(selector.player_id, wrapi(selector.selection + sign(move_dir.x),0, len(pawns)))
move_dir = Vector2i((input_vector + .499 * sign(input_vector)).round())
if move_dir.length_squared() != 0:
var selection : Vector2i = selector.selection + move_dir
selection.x = wrapi(selection.x, 0, portrait_grid.columns)
selection.y = wrapi(selection.y, 0, ceili(float(portrait_grid.get_child_count()) / portrait_grid.columns))
move_selector.rpc(selector.player_id, selection)
selector_wait = 0.25
@rpc("any_peer","call_local","reliable")
func move_selector(peer_id : int, selection : int) -> void:
func move_selector(peer_id : int, selection : Vector2i) -> void:
var selector : PawnSelector = selectors[peer_id]
portraits[selector.selection].num_players -= 1
selector.selection = selection
change_display(peer_id, selector.selection)
var v = Vector2(175 * selector.selection, 0)
selector.position = Vector2(175 * selector.selection, 0)
portraits[selector.selection].num_players += 1
change_display(peer_id, portraits[selector.selection].pawn_idx)
var v = Vector2(154 * selector.selection.x, 154 * selector.selection.y)
selector.position = v
switch_sound.play()
if announce_tween != null and announce_tween.is_running():
announce_tween.stop()
if announcer.playing:
announcer.stop()
announce_tween = create_tween()
announce_tween.tween_interval(.25)
announcer.stream = portraits[selection].pawn.name_audio
announce_tween.tween_callback(announcer.play)
@rpc("any_peer","call_local","reliable")
func lock_selector(peer_id : int) -> void:
@@ -115,9 +138,10 @@ func lock_selector(peer_id : int) -> void:
func change_display(player : int, selection: int) -> void:
var pd : PawnDisplay = displays[player]
pd.set_pawn_name(pawns[selection].name)
pd.set_portrait(pawns[selection].portrait)
pd.set_hacks(pawns[selection].starting_hacks)
var pawn : PawnBaseData = Game.pawns.values()[selection]
pd.set_pawn_name(pawn.name)
pd.set_portrait(pawn.portrait)
pd.set_hacks(pawn.starting_hacks)
func _on_selector_start_child_entered_tree(node: Node) -> void:

17
scripts/collectable.gd Normal file
View File

@@ -0,0 +1,17 @@
class_name Pickup extends Area3D
enum Type{
DATABLOCK,
INTEGRITY,
SCAN,
BASIC_HACK,
ADVANCED_HACK
}
@export var type : Type
func _on_body_entered(body: Node3D) -> void:
if body is PawnController:
body.pickup(type)
queue_free()

View File

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

View File

@@ -10,7 +10,7 @@ func _on_melee_range_changed(melee : bool) -> void:
range_attack_button.visible = !melee
melee_attack_button.visible = melee
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
hack_button.set_pressed_no_signal(Input.is_action_pressed("install"))
detect_button.set_pressed_no_signal(Input.is_action_pressed("detect"))
switch_button.set_pressed_no_signal(Input.is_action_pressed("detonate"))

View File

@@ -47,7 +47,7 @@ var decompiling : bool
var failed : bool
var difficulty : int = 1
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
timer_label.text = "%02f.3" % timer.time_left
func start_decompiling() -> void:
@@ -109,5 +109,5 @@ func succeed() -> void:
func _on_hack_failed() -> void:
fail()
func _on_hack_removed(type : Hack.Type) -> void:
func _on_hack_removed(_type : Hack.Type) -> void:
Game.player.close_modal()

View File

@@ -22,25 +22,25 @@ func _on_timeout() -> void:
func spread() -> void:
var new_squares : Dictionary[Vector3i, bool] = {}
for square in last_spread:
for sq 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
#var ts = sq + Vector3i(i, j, k)
new_squares[sq + Vector3i(i, j, k)] = true
last_spread = []
for square in new_squares.keys():
if squares.has(square):
for sq in new_squares.keys():
if squares.has(sq):
continue
var floor_square = square + Vector3i(0,-1,0)
var floor_square = sq + 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)
last_spread.append(sq)
squares[sq] = true
emit_gas(sq)
func emit_gas(square) -> void:
func emit_gas(sq) -> void:
var gas = gas_square_template.instantiate()
gas.setup(hack_owner, damage)
Game.level.add_vfx(gas, square)
Game.level.add_vfx(gas, sq)

View File

@@ -16,9 +16,9 @@ func _physics_process(delta: float) -> void:
if time_remaining <= 0:
queue_free()
func setup(owner, damage) -> void:
self.hack_owner = hack_owner
self.damage = damage
func setup(h_owner, dam) -> void:
hack_owner = h_owner
damage = dam
time_remaining = 2.0
func _on_body_entered(body: Node3D) -> void:

View File

@@ -1,40 +1,40 @@
class_name Hack extends Area3D
enum Type{
BOMB,
MINE,
GAS,
FORCE_PANEL,
SWITCH,
PITFALL
DESTROY,
PURGE,
INFECT,
REDIRECT,
TRIGGER,
CONTAIN
}
const range_shapes : Dictionary = {
Hack.Type.BOMB : Vector3(4.25,3,4.25),
Hack.Type.GAS : Vector3(1,1,1),
Hack.Type.PITFALL : Vector3(1,1,1),
Hack.Type.FORCE_PANEL : Vector3(1,1,1),
Hack.Type.SWITCH : Vector3(3,1,3),
Hack.Type.MINE : Vector3(4.25,3,4.25),
const range_radius : Dictionary = {
Hack.Type.DESTROY : 2,
Hack.Type.INFECT : .5,
Hack.Type.CONTAIN : .5,
Hack.Type.REDIRECT : .5,
Hack.Type.TRIGGER : 1,
Hack.Type.PURGE : 1.5,
}
const hack_icons : Dictionary = {
Hack.Type.BOMB : preload("res://visuals/images/icons/t-bomb.png"),
Hack.Type.GAS : preload("res://visuals/images/icons/t-gas.png"),
Hack.Type.PITFALL : preload("res://visuals/images/icons/t-pitfall.png"),
Hack.Type.FORCE_PANEL : preload("res://visuals/images/icons/t-force_panel.png"),
Hack.Type.SWITCH : preload("res://visuals/images/icons/t-switch.png"),
Hack.Type.MINE : preload("res://visuals/images/icons/t-mine.png"),
Hack.Type.DESTROY : preload("res://external/destroy-icon.png"),
Hack.Type.INFECT : preload("res://external/infect-icon.png"),
Hack.Type.CONTAIN : preload("res://external/contain-icon.png"),
Hack.Type.REDIRECT : preload("res://external/redirect-icon.png"),
Hack.Type.TRIGGER : preload("res://external/trigger-icon.png"),
Hack.Type.PURGE : preload("res://external/purge-icon.png"),
}
const bomb_explosion_template = preload("res://templates/explosion.tscn")
const mine_explosion_template = preload("res://templates/explosion.tscn")
const pitfall_template = preload("res://templates/pitfall.tscn")
const switch_explosion_template = preload("res://templates/explosion.tscn")
const gas_emitter_template = preload("res://templates/gas_emitter.tscn")
const destroy_explosion_template = preload("res://experimental/BinbunVFX/impact_explosions/effects/explosion/vfx_explosion_01.tscn")
const purge_explosion_template = preload("res://experimental/BinbunVFX/impact_explosions/effects/explosion/vfx_explosion_03.tscn")
const contain_template = preload("res://templates/pitfall.tscn")
const trigger_explosion_template = preload("res://experimental/BinbunVFX/impact_explosions/effects/explosion/vfx_explosion_04.tscn")
const infect_emitter_template = preload("res://templates/gas_emitter.tscn")
const force_activate_sound = preload("res://audio/sounds/TomWinandySFX_UI_ScifiTech_Start_06.wav")
@onready var range_area : Area3D = %RangeArea
@onready var range_shape : BoxShape3D = %RangeShape.shape
@onready var range_shape : SphereShape3D = %RangeShape.shape
@onready var model : MeshInstance3D = %Model
@onready var icon : Sprite3D = %Icon
@onready var force_strip : Sprite3D = %ForceStrip
@@ -69,13 +69,13 @@ func _enter_tree() -> void:
func _exit_tree() -> void:
Game.level.remove_map_marker(self)
func setup(type : Type, direction : Vector3, hack_owner : int) -> void:
self.type = type
self.hack_owner = hack_owner
if type == Type.FORCE_PANEL:
var r : float = atan2(direction.z, direction.x)
func setup(new_type : Type, dir : Vector3, h_owner : int) -> void:
type = new_type
hack_owner = h_owner
if type == Type.REDIRECT:
var r : float = atan2(dir.z, dir.x)
var cardinal : float = roundi(r * 2 / PI) * PI / 2
self.direction = Vector3(cos(cardinal), 0, sin(cardinal))
direction = Vector3(cos(cardinal), 0, sin(cardinal))
func remove() -> void:
removed.emit(type)
@@ -108,27 +108,26 @@ func _on_reveal_timeout() -> void:
func _ready() -> void:
var owns_hack = hack_owner == Multiplayer.id
print("Setup Hack " + name)
material.set_shader_parameter("glow_color", Color.YELLOW if owns_hack else Color.RED)
icon.texture = hack_icons[type]
model.visible = owns_hack
icon.visible = owns_hack
range_shape.size = range_shapes[type]
range_shape.radius = range_radius[type]
match(type):
Type.BOMB:
Type.DESTROY:
damage = 15
Type.MINE:
Type.PURGE:
damage = 10
Type.SWITCH:
Type.TRIGGER:
damage = 5
Type.GAS:
Type.INFECT:
activation_timer.start()
Type.FORCE_PANEL:
Type.REDIRECT:
var r : float = atan2(direction.z, -direction.x) + PI/2
force_strip.rotate_y(r)
force_strip.visible = owns_hack
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
just_revealed = false
func blast(body : PawnController) -> void:
@@ -140,29 +139,29 @@ func activate() -> void:
return
var explode : bool = false
match(type):
Type.PITFALL:
generate_pitfall(square)
Type.CONTAIN:
generate_contain(square)
for body in get_overlapping_bodies():
body.start_pitfall(square, 6.0)
#Generate the circle here
Type.FORCE_PANEL:
Type.REDIRECT:
Game.oneshot(force_activate_sound)
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)
Type.PURGE:
var expl = purge_explosion_template.instantiate()
Game.level.add_vfx(expl, square)
explode = true
Type.SWITCH:
var exp = switch_explosion_template.instantiate()
Game.level.add_vfx(exp, square)
Type.TRIGGER:
var expl = trigger_explosion_template.instantiate()
Game.level.add_vfx(expl, square)
explode = true
Type.BOMB:
var exp = bomb_explosion_template.instantiate()
Game.level.add_vfx(exp, square)
Type.DESTROY:
var expl = destroy_explosion_template.instantiate()
Game.level.add_vfx(expl, square)
explode = true
Type.GAS:
var emitter = gas_emitter_template.instantiate()
Type.INFECT:
var emitter = infect_emitter_template.instantiate()
emitter.hack_owner = hack_owner
emitter.square = square
emitter.damage = 4
@@ -179,13 +178,13 @@ func activate() -> void:
func trigger_adjacent_bombs() -> void:
for hack : Hack in range_area.get_overlapping_areas():
if hack.type == Type.BOMB and hack != self:
if hack.type == Type.DESTROY and hack != self:
hack.delay_trigger()
func generate_pitfall(suqare : Vector3i) -> void:
var pitfall = pitfall_template.instantiate()
pitfall.duration = 6.0
Game.level.add_vfx(pitfall, square)
func generate_contain(sq : Vector3i) -> void:
var contain = contain_template.instantiate()
contain.duration = 6.0
Game.level.add_vfx(contain, sq)
func blast_players() -> void:
for body in range_area.get_overlapping_bodies():
@@ -200,14 +199,14 @@ func delay_trigger() -> void:
func _on_body_entered(body: Node3D) -> void:
if type == Type.GAS or type == Type.BOMB:
if type == Type.INFECT or type == Type.DESTROY:
return
if body.id == hack_owner:
return
if !decompiling or body.id != decompile_id:
if !body.detecting:
if !body.is_detecting():
activate()

View File

@@ -17,8 +17,8 @@ func proximal_shake(distance : float) -> void:
var d = global_position.distance_squared_to(Game.player.global_position)
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))
var strength : float = (d_sq - d) / d_sq
var l_val : float = lerp(0.0, 1.0, strength)
Input.start_joy_vibration(0, l_val,l_val,lerp(0.5, 1.0, strength))
Game.player.camera.add_trauma(l_val)

View File

@@ -1,12 +1,12 @@
class_name HackIcon extends Control
const hack_icons : Dictionary = {
Hack.Type.BOMB : preload("res://visuals/images/icons/bomb.png"),
Hack.Type.GAS : preload("res://visuals/images/icons/gas.png"),
Hack.Type.PITFALL : preload("res://visuals/images/icons/pitfall.png"),
Hack.Type.FORCE_PANEL : preload("res://visuals/images/icons/force_panel.png"),
Hack.Type.SWITCH : preload("res://visuals/images/icons/switch.png"),
Hack.Type.MINE : preload("res://visuals/images/icons/mine.png"),
Hack.Type.DESTROY : preload("res://external/destroy-icon.png"),
Hack.Type.INFECT : preload("res://external/infect-icon.png"),
Hack.Type.CONTAIN : preload("res://external/contain-icon.png"),
Hack.Type.REDIRECT : preload("res://external/redirect-icon.png"),
Hack.Type.TRIGGER : preload("res://external/trigger-icon.png"),
Hack.Type.PURGE : preload("res://external/purge-icon.png"),
}
@onready var icon_image : TextureRect = %Icon

View File

@@ -8,11 +8,11 @@ func _ready() -> void:
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
pass
func _on_health_changed(current : int, max : int) -> void:
max_value = max
func _on_health_changed(current : int, max_amt : int) -> void:
max_value = max_amt
value = current
func _on_poison_status_changed(poisoned : bool) -> void:

View File

@@ -25,6 +25,6 @@ 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:
func _on_ammo_changed(current : int, _max_amt : int) -> void:
set_ammo(current)

View File

@@ -24,7 +24,7 @@ const camera_offset = Vector3(0, 10, 5.25)
@onready var cameras_node : Node3D = %Cameras
@onready var map_markers_node : Node3D = %MapMarkers
@onready var spawn_points : Array[Node] = $PawnSpawner.get_children()
@onready var multiplayer_level_setup : MultiplayerLevelSetup = %MultiplayerLevelSetup
@export var difficulty : int = 1
@@ -34,41 +34,80 @@ var cameras : Dictionary[int, PawnCamera] = {}
var map_markers : Dictionary[Object, MapMarker] = {}
func _ready() -> void:
process_mode=Node.PROCESS_MODE_DISABLED
Game.level = self
if Game.mode == Game.Modes.STORY:
setup()
add_level_hack.call_deferred(Hack.Type.MINE, Vector3.ZERO, Vector3i(-2,2,0))
add_level_hack.call_deferred(Hack.Type.PURGE, Vector3.ZERO, Vector3i(-2,2,0))
func setup() -> void:
if Multiplayer.is_host():
spawn_players()
@rpc("authority")
func spawn_players() -> void:
if Game.is_multiplayer():
spawn_players_multiplayer()
else:
spawn_players_singleplayer()
func spawn_players_singleplayer() -> void:
var pc : PawnController = pawn_controller.instantiate()
pawns[1] = pc
pawns_node.add_child(pc,true)
var pos : Vector3
if(spawn_points == null
or len(spawn_points) <= 1):
pos = Vector3(0,0,0)
else:
pos = spawn_points[0].global_position
pc.global_position = pos
pc.setup(1, Game.pawns_selected[1])
add_pawn_camera(pc)
cameras[1].register_pawn(1)
process_mode=Node.PROCESS_MODE_INHERIT
func spawn_players_multiplayer() -> void:
var count = 0
multiplayer_level_setup.set_players_unready(Multiplayer.players.values())
multiplayer_level_setup.set_pawns_expected.rpc(Game.pawns_selected.size())
for key in Game.pawns_selected:
var pc : PawnController = pawn_controller.instantiate()
var pd = Game.pawns_selected[key]
pawns[key] = pc
pawns_node.add_child(pc,true)
var hacks : Array = []
for hack : HackSet in pd.starting_hacks:
var dict = {
"type":hack.type,
"qty":hack.qty
}
hacks.append(dict)
var position : Vector3
await multiplayer_level_setup.all_players_ready
for key in pawns:
var pc = pawns[key]
var pos : Vector3
if(spawn_points == null
or len(spawn_points) <= count):
if key == Multiplayer.id:
position = Vector3(0,0,0)
pos = Vector3(0,0,0)
else:
position = Vector3(3,0,0)
pos = Vector3(3,0,0)
else:
position = spawn_points[count].global_position
pc.setup.rpc(key,hacks,position)
add_pawn_camera(pc)
pos = spawn_points[count].global_position
count += 1
pc.global_position = pos
pc.setup.rpc(key, Game.pawns_selected[key])
multiplayer_level_setup.set_players_unready(Multiplayer.players.values())
multiplayer_level_setup.set_cameras_expected.rpc(Game.pawns_selected.size())
for pc in pawns.values():
add_pawn_camera(pc)
await multiplayer_level_setup.all_players_ready
setup_cameras()
start_level.rpc()
@rpc("authority", "call_local")
func start_level() -> void:
process_mode=Node.PROCESS_MODE_INHERIT
func is_square_detected(crd) -> bool:
@@ -88,16 +127,22 @@ func detect_square(crd : Vector3i, mark : bool) -> bool:
hack.reveal()
return true
@rpc("any_peer", "call_local", "reliable")
func add_pawn_camera(pawn : PawnController) -> void:
if Multiplayer.is_host():
var camera : PawnCamera = camera_template.instantiate()
camera.position = pawn.global_position + camera_offset
cameras_node.add_child(camera,true)
camera.register_pawn.rpc(pawn.id)
cameras[pawn.id] = camera
func setup_cameras() -> void:
var camera_list = cameras_node.get_children()
var idx = 0
for pawn_id in pawns:
camera_list[idx].register_pawn.rpc(pawn_id)
cameras[pawn_id] = camera_list[idx]
idx += 1
func add_hack(hack : Hack, crd : Vector3i) -> void:
hack.square = crd
hacks[crd] = hack
@@ -153,7 +198,7 @@ func remove_map_marker(target) -> void:
func add_map_marker(target) -> void:
var marker : MapMarker
var height : float
var height : float = 0
if target is PawnController:
marker = map_marker_templates.pawn.instantiate()
height += 40

View File

@@ -2,17 +2,17 @@ class_name MapMarker extends Node3D
var target : Node3D
func register_target(target : Node3D) -> void:
self.target = target
func register_target(new_target : Node3D) -> void:
target = new_target
reposition()
func reposition() -> void:
var loc = target.position
position = Vector3(loc.x, position.y, loc.z)
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
if target:
reposition()
func _on_hack_revealed(is_visible : bool) -> void:
visible = is_visible
func _on_hack_revealed(reveal : bool) -> void:
visible = reveal

View File

@@ -1,19 +0,0 @@
extends Level
#const pawn_controller_template = preload("res://templates/pawn_controller.tscn")
#
#@onready var player_spawner = %Spawner
#func _ready() -> void:
#print("LEVEL LOADING, ID: " + str(Multiplayer.id) + " with " + str(Multiplayer.players.size()) + " keys recognized")
#Game.level = self
#
#func setup() -> void:
#if Multiplayer.is_host():
#spawn_players()
#
#func spawn_players() -> void:
#for key in Game.pawns_selected:
#var pc : PawnController = pawn_controller_template.instantiate()
#var pd = Game.pawns_selected[key]
#player_spawner.add_pawn(pc, key)
#pc.setup(key,pd.starting_hacks)

View File

@@ -0,0 +1,62 @@
class_name MultiplayerLevelSetup extends Node
var players_ready : Dictionary[int, bool] = {}
var pawns_expected : int = 1
var cameras_expected : int = 1
signal all_pawns_spawned()
signal all_cameras_spawned()
signal all_players_ready()
@rpc("authority", "reliable")
func set_pawns_expected(num : int) -> void:
all_pawns_spawned.connect(_on_all_pawns_spawned, CONNECT_ONE_SHOT)
print("(Instance %s) Expecting %d Pawns" % [Game.cmd_args.instance_id, num])
pawns_expected = num
func set_players_unready(list : Array) -> void:
players_ready = {}
for id in list:
players_ready[id] = false
players_ready[1] = true
func check_all_ready() -> bool:
for id in players_ready:
if !players_ready[id]:
return false
return true
func _on_all_pawns_spawned() -> void:
player_ready.rpc_id(1,Multiplayer.id)
func _on_all_cameras_spawned() -> void:
player_ready.rpc_id(1,Multiplayer.id)
@rpc("any_peer", "reliable")
func player_ready(id : int) -> void:
print("(Instance %s) Player %d notified ready" % [Game.cmd_args.instance_id, id])
players_ready[id] = true
if(check_all_ready()):
print("(Instance %s) ALL PLAYERS READY!!" % [Game.cmd_args.instance_id])
all_players_ready.emit()
@rpc("authority", "reliable")
func set_cameras_expected(num : int) -> void:
all_cameras_spawned.connect(_on_all_cameras_spawned, CONNECT_ONE_SHOT)
cameras_expected = num
func _on_pawn_spawner_spawned(node: Node) -> void:
print("(Instance %s) Spawned %d Pawn" % [Game.cmd_args.instance_id, node.id])
pawns_expected -= 1
if pawns_expected == 0:
print("(Instance %s) ALL PAWNS SPAWNED!" % [Game.cmd_args.instance_id])
all_pawns_spawned.emit()
func _on_camera_spawner_spawned(_node: Node) -> void:
cameras_expected -= 1
if cameras_expected == 0:
all_cameras_spawned.emit()

View File

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

View File

@@ -70,7 +70,7 @@ func _on_joining_back_button_pressed() -> void:
%Joining.visible = false
%Menu.visible = true
func _on_client_added(peer_handle : String, peer_id : int) -> void:
func _on_client_added(peer_handle : String, _peer_id : int) -> void:
%ParticipantsText.text = "[color=FFFF00][b]*%s[/b][/color]\n[color=FFFFFF]*%s[/color]" % [handle, peer_handle]
%StartButton.disabled = false

View File

@@ -0,0 +1,18 @@
extends Node3D
func _enter_tree() -> void:
Game.pawns_selected[1] = Game.pawns.keys()[0]
Multiplayer.client_added.connect(_on_client_added)
#SETUP HOST:
if !Game.net_test:
var handle = "Host - P1"
Multiplayer.handle = handle
#Validate entries
Multiplayer.become_host()
func _on_client_added(handle : String, id : int) -> void:
pass

View File

@@ -13,6 +13,9 @@ class_name PawnBody extends Node3D
@onready var walk_sound : AudioStreamPlayer3D = $WalkSound
@onready var footstep_timer : Timer = $FootstepTimer
signal shooting()
signal reloading()
@rpc("call_local")
func play_animation(anim_name : String) -> void:
anim_player.play(anim_name)
@@ -45,6 +48,21 @@ func _on_struggle_changed(value : float) -> void:
else:
struggle_bar.value = value
func set_animation_length(node_name : String, length : float) -> void:
if length == 0:
length = 0.01
var blendtree : AnimationNodeBlendTree = anim_tree.tree_root.get_node(node_name)
if !blendtree:
return
var anim_node : AnimationNodeAnimation = blendtree.get_node("Animation")
if !anim_node:
return
var animation : Animation = anim_player.get_animation(anim_node.animation)
if !animation:
return
var a_scale : float = animation.length / length
anim_tree["parameters/%s/TimeScale/scale" % node_name] = a_scale
func _on_footstep_timer_timeout() -> void:
walk_sound.play()

View File

@@ -4,6 +4,7 @@ class_name PawnCamera extends Camera3D
var target
var player_offset : Vector3
@export var player_id = 1
@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.
@@ -44,7 +45,7 @@ func _process(delta: float) -> void:
func shake():
noise_y += .1
var amount = pow(trauma, trauma_power)
var n_val = noise.get_noise_2d(noise.seed*2, noise_y)
#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])

View File

@@ -2,6 +2,11 @@ class_name PawnController extends CharacterBody3D
enum State {
NORMAL,
DETECTING,
INSTALLING,
UNINSTALLING,
MELEE_ATTACKING,
RANGED_ATTACKING,
KNOCKDOWN,
KNOCKUP,
FLUNG,
@@ -15,9 +20,10 @@ const hack_template = preload("res://templates/hack.tscn")
const uninstall_hack_modal = preload("res://templates/uninstall_hack_modal.tscn")
const decompile_hack_modal = preload("res://templates/decompile_hack_modal.tscn")
const range_sphere_template = preload("res://templates/range_sphere.tscn")
@export var pawn_name : StringName
@export var speed : float = 10
@onready var body : PawnBody = $PawnBody
@onready var body : PawnBody
@onready var input : PawnInput = $PawnInput
@onready var data : PawnLevelData = $Data
@onready var hack_sound : AudioStreamPlayer3D = $HackSound
@@ -25,18 +31,15 @@ const range_sphere_template = preload("res://templates/range_sphere.tscn")
@onready var detect_sound : AudioStreamPlayer3D = $DetectSound
@onready var fling_sound : AudioStreamPlayer3D = $FlingSound
@onready var crash_sound : AudioStreamPlayer3D = $CrashSound
@onready var reload_sound : AudioStreamPlayer3D = $PawnBody/ReloadSound
@onready var reload_sound : AudioStreamPlayer3D
@onready var detect_icon : Sprite3D = $DetectIcon
var id : int = 1
@export var id : int = 1
@export var state : State
var button_actions : Dictionary[int, String]
var current_square : Vector3i
var facing : Vector3
@export var detecting : bool = false
var installing : bool = false
var uninstalling : bool = false
var range_sphere : RangeSphere
var detect_squares : Dictionary[Vector3i, bool] = {}
var detect_tween : Tween = null
@@ -50,18 +53,19 @@ var poison_time_remaining : float = 0
var poison_pulse_timer : float
var melee_range : float = 3.0
var can_melee : bool = false
var ranged_range : float = 6
var attack_timer : float = 0
var melee_recovery_time : float = .75
var ranged_recovery_time : float = .2
var ranged_recovery_time : float = 0.25
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 shooting : bool = false
var reloading : bool = false
var take_shot : bool = false
var flinch : float = 0
@@ -95,6 +99,23 @@ func _exit_tree() -> void:
#Game.level.evaluate_outcome()
#Game.evaluate
func calculate_pawn_velocity(dir : Vector3) -> Vector3:
var y = velocity.y
var result = speed * dir
if is_poisoned():
result *= 0.5
if is_crouching():
result *= .33
result.y = y
return result
func play_footsteps(spd : float, loud : bool) -> void:
if loud:
body.play_footsteps(spd)
func stop_footsteps() -> void:
body.stop_footsteps()
func _physics_process(delta: float) -> void:
if attack_timer > 0:
attack_timer -= delta
@@ -137,26 +158,17 @@ func _physics_process(delta: float) -> void:
knockdown(-fling_direction)
hurt(10)
moving = false
State.NORMAL:
State.NORMAL, State.DETECTING, State.INSTALLING:
can_fall = true
if dir.length_squared() > 0:
moving = true
velocity = calculate_pawn_velocity(dir)
facing = dir.normalized()
body.look_at(body.global_position - dir)
var y = velocity.y
velocity = speed * dir
if is_poisoned():
velocity *= 0.5
if detecting:
velocity *= .33
velocity.y = y
if !detecting:
body.play_footsteps(lerp(.78, .33, dir.length()))
play_footsteps(lerp(.78, .33, dir.length()), true)
else:
body.stop_footsteps()
else:
body.stop_footsteps()
stop_footsteps()
if body != null:
body.set_animation_parameter("parameters/Motion/blend_position", dir.length())
body.set_animation_parameter("parameters/Crouch/blend_position", dir.length())
State.KNOCKUP:
@@ -165,12 +177,9 @@ func _physics_process(delta: float) -> void:
else:
moving = true
can_fall = true
State.KNOCKDOWN,State.BOUND,State.DEAD:
return
if can_fall:
var down = 0
if !is_on_floor():
velocity.y = velocity.y + get_gravity().y * delta
moving = true
@@ -178,9 +187,11 @@ func _physics_process(delta: float) -> void:
if moving:
move_and_slide()
if detecting:
if is_detecting():
update_detect_region.rpc(true)
if range_sphere:
update_range_sphere()
#Deal with the rest of the buttons
if !input_locked:
if modal:
@@ -193,67 +204,100 @@ func _physics_process(delta: float) -> void:
for button in buttons:
if input.is_action_just_pressed(button):
modal.button_pressed(button)
elif state == State.NORMAL:
else:
update_actions()
@rpc("call_local", "reliable")
func setup_pawn_body(pd : PawnBaseData) -> void:
set_pawn_body(pd.pawn_body.instantiate())
func set_pawn_body(pb : PawnBody) -> void:
if body != null:
body.queue_free()
body = pb
pb.reloading.connect(reload_ranged)
pb.shooting.connect(fire_ranged)
reload_sound = body.find_child("ReloadSound")
add_child(body)
body.set_animation_length("Ranged Fire", ranged_recovery_time)
struggling.connect(body._on_struggle_changed)
func attack() -> void:
if attack_timer > 0:
return
if meleeing:
body.play_animation.rpc("melee")
if can_melee:
state = State.MELEE_ATTACKING
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)
reloading = true
return
ammo-=1
ammo_changed.emit(ammo, max_ammo)
attack_timer = ranged_recovery_time
shooting == true
state = State.RANGED_ATTACKING
take_shot = true
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 reload_ranged() -> void:
reloading = false
reload_sound.play()
ammo = max_ammo
attack_timer = ranged_reload_time
ammo_changed.emit(ammo, max_ammo)
func update_actions() -> void:
if attack_timer <= 0 and shooting and !input.is_action_pressed("attack"):
shooting = false
if state == State.DEAD:
return
if attack_timer <= 0 and is_attacking():
if !input.is_action_pressed("attack"):
state = State.NORMAL
elif is_shooting():
if ammo <= 0:
reloading = true
else:
take_shot = true
if input.is_action_just_pressed("left cycle hack"):
cycle_active_hack(-1)
if input.is_action_just_pressed("right cycle hack"):
cycle_active_hack(1)
match(state):
State.NORMAL:
if input.is_action_just_pressed("detonate"):
detonate()
elif !installing:
if input.is_action_just_pressed("detect"):
if(input.is_action_just_pressed("detect")
and input.is_action_pressed("detect")):
start_detecting()
elif input.is_action_just_released("detect"):
stop_detecting()
if!detecting:
if input.is_action_just_pressed("install"):
installing = true
if range_sphere != null:
range_sphere.queue_free()
range_sphere = range_sphere_template.instantiate()
#Set the range sphere size based upon the current hack
update_range_sphere()
if input.is_action_just_released("install"):
installing = false
try_install_hack()
return
if(input.is_action_just_pressed("install")
and input.is_action_pressed("install")):
start_installing()
return
elif input.is_action_pressed("attack"):
attack()
elif input.is_action_just_released("install"):
installing = false
State.DETECTING:
if !input.is_action_pressed("detect"):
stop_detecting()
State.INSTALLING:
if !input.is_action_pressed("install"):
stop_installing()
try_install_hack()
func update_range_sphere() -> void:
pass
var new_pos = (global_position - Vector3.ONE * .5).round() + Vector3(0.5, 0, 0.5)
if range_sphere.global_position != new_pos:
range_sphere.global_position = new_pos
var type = data.hacks[data.active_hack].type
if range_sphere.type != type:
range_sphere.set_range(Hack.range_radius[data.hacks[data.active_hack].type])
range_sphere.type = type
func update_struggle(delta : float) -> bool:
if struggle_timer > 0:
@@ -285,7 +329,11 @@ func update_poison(delta : float) -> void:
func fire_ranged() -> void:
var shot = body.projectile_template.instantiate()
var tdir : Vector3 = Vector3.ZERO
take_shot = false
ammo-=1
ammo_changed.emit(ammo, max_ammo)
shot.speed = projectile_speed
shot.id = id
tdir = body.ranged_point.global_position.direction_to(combat_target.global_position) if combat_target else facing
shot.direction = tdir
shot.damage = projectile_damage
@@ -330,10 +378,10 @@ func check_attack_target() -> void:
ranged_closest = target
ranged_d_sq = d_sq
if melee_closest != null:
meleeing = true
can_melee = true
combat_target = melee_closest
else:
meleeing = false
can_melee = false
if ranged_closest != null:
combat_target = ranged_closest
combat_target_changed.emit(melee_closest != null)
@@ -351,12 +399,13 @@ func try_install_hack() -> void:
action_tween = create_tween()
input_locked = true
body.travel_animation("Install")
#body.travel_animation("Install")
action_tween.tween_interval(.2)
action_tween.tween_callback(Callable(install_hack).bind(square, data.active_hack))
action_tween.tween_interval(.25)
action_tween.tween_callback(clear_action)
func install_hack(square : Vector3i, idx : int) -> void:
var type : Hack.Type = data.hacks[idx].type
var hack = hack_template.instantiate()
@@ -384,21 +433,21 @@ func detect_alert() -> void:
detect_tween.tween_callback(func(): detect_tween = null)
func close_modal() -> void:
uninstalling = false
state = State.NORMAL
if modal != null:
modal.queue_free()
modal = null
func show_uninstall_hack_modal() -> void:
stop_detecting()
uninstalling = true
state = State.UNINSTALLING
modal = uninstall_hack_modal.instantiate()
modal.square = current_square
Game.level.add_child(modal)
func show_decompile_hack_modal() -> void:
stop_detecting()
uninstalling = true
state = State.UNINSTALLING
modal = decompile_hack_modal.instantiate()
modal.difficulty = Game.level.difficulty
modal.square = current_square
@@ -412,8 +461,23 @@ func show_decompile_hack_modal() -> void:
Game.level.add_child(modal)
func start_detecting() -> void:
detecting = true
update_detect_region.rpc(false)
state = State.DETECTING
update_detect_region(false)
func start_installing() -> void:
state = State.INSTALLING
if id == Multiplayer.id:
if range_sphere != null:
range_sphere.queue_free()
range_sphere = range_sphere_template.instantiate()
Game.level.add_child(range_sphere)
#Set the range sphere size based upon the current hack
update_range_sphere()
func stop_installing() -> void:
state = State.NORMAL
range_sphere.queue_free()
range_sphere = null
@rpc("authority", "call_local")
func update_detect_region(update : bool) -> void:
@@ -438,13 +502,14 @@ func update_detect_region(update : bool) -> void:
var remove_list = []
var hack_detected : bool = false
var hack : Hack
for sq in new_squares.keys():
if update and detect_squares.has(sq):
continue
if !Game.level.detect_square(sq, true):
remove_list.append(sq)
else:
var hack = Game.level.get_square_hack(sq + Vector3i(0,1,0))
hack = Game.level.get_square_hack(sq + Vector3i(0,1,0))
if hack and hack.is_just_revealed():
hack_detected = true
@@ -456,7 +521,7 @@ func update_detect_region(update : bool) -> void:
for key in remove_list:
detect_squares.erase(key)
var hack : Hack = Game.level.get_square_hack(current_square)
hack = Game.level.get_square_hack(current_square)
if hack != null:
if hack.hack_owner == Multiplayer.id:
show_uninstall_hack_modal()
@@ -465,7 +530,7 @@ func update_detect_region(update : bool) -> void:
show_decompile_hack_modal()
func stop_detecting() -> void:
detecting = false
state = State.NORMAL
clear_detect_region.rpc()
@rpc("authority", "call_local")
@@ -477,15 +542,15 @@ func clear_detect_region() -> void:
detect_squares = {}
@rpc("authority", "call_local", "reliable")
func setup(id : int, hacks : Array, pos : Vector3) -> void:
self.id = id
self.global_position = pos
func setup(p_id : int, pawn : StringName) -> void:
id = p_id
var base_data : PawnBaseData = Game.pawns[pawn]
var hacklist : Array[PawnLevelData.HackData] = []
for hack in hacks:
for hack in base_data.starting_hacks:
hacklist.append(PawnLevelData.HackData.new(hack.type, hack.qty, hack.qty))
$Data.hacks = hacklist
input.set_multiplayer_authority(id)
struggling.connect(body._on_struggle_changed)
setup_pawn_body(base_data)
Game.setup_player(self)
func uninstall_hack_at(square) -> void:
@@ -525,9 +590,11 @@ func hurt(damage : int) -> void:
health_changed.emit(data.life, data.max_life)
if data.life == 0:
die.rpc()
@rpc("any_peer", "call_local")
@rpc("authority", "call_local")
func die() -> void:
state = State.DEAD
body.travel_animation("Death")
input_locked = true
if id == Multiplayer.id:
var death_tween = create_tween()
@@ -539,28 +606,22 @@ func _on_hack_decompiled(type : Hack.Type) -> void:
for i in range(len(data.hacks)):
var d = data.hacks[i]
if d.type == type:
d.max -= 1
d.max_quantity -= 1
hack_quantity_changed.emit(i, d.quantity)
break
#hurt
#blast
#blast_players
#activate
#activate_hack
#fail
#on_hack_failed
func _on_hack_activated(type : Hack.Type) -> void:
for i in range(len(data.hacks)):
var d = data.hacks[i]
if d.type == type:
d.quantity = min(d.max, d.quantity+ 1)
d.quantity = min(d.max_quantity, d.quantity+ 1)
hack_quantity_changed.emit(i, d.quantity)
break
func detonate() -> void:
var switch_list = []
for hack : Hack in Game.level.hacks.values():
if hack.type == Hack.Type.SWITCH and hack.hack_owner == id:
if hack.type == Hack.Type.TRIGGER and hack.hack_owner == id:
switch_list.append(hack)
detonate_sound.play()
@@ -584,10 +645,10 @@ func poison(damage : int, length : float) -> void:
pshader.set_shader_parameter("strength", 0.5)
poison_status_changed.emit(true)
func fling(direction : Vector3, speed : float) -> void:
func fling(direction : Vector3, spd : float) -> void:
state = State.FLUNG
fling_direction = direction
fling_speed = speed
fling_speed = spd
fling_sound.play()
func knockdown(direction : Vector3) -> void:
@@ -602,14 +663,14 @@ func knockdown(direction : Vector3) -> void:
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:
func knockup(vel : Vector3) -> void:
if state != State.KNOCKUP:
state = State.KNOCKUP
input_locked = true
if is_on_floor():
self.velocity = Vector3.UP * .1
velocity = Vector3.UP * .1
move_and_slide()
self.velocity = velocity
velocity = vel
func knockback(direction : Vector3, impact : float) -> void:
if state != State.NORMAL:
@@ -633,14 +694,46 @@ func start_pitfall(square : Vector3, duration : float) -> void:
tween.tween_property(self, "input_locked", false, 0)
tween.tween_callback(pitfall.bind(duration))
func _on_melee_hit(body : Node3D) -> void:
func _on_melee_hit(_body : Node3D) -> void:
#TODO: WRITE THE MELEE DAMAGE CODE
pass
func is_attacking() -> bool:
return state == State.RANGED_ATTACKING or state == State.MELEE_ATTACKING
func is_meleeing() -> bool:
return state == State.MELEE_ATTACKING
func is_shooting() -> bool:
return state == State.RANGED_ATTACKING
func is_dead() -> bool:
return state == State.DEAD
func is_detecting() -> bool:
return detecting
return state == State.DETECTING
func is_installing() -> bool:
return state == State.INSTALLING
func is_uninstalling() -> bool:
return state == State.UNINSTALLING
func is_crouching() -> bool:
return detecting or installing or uninstalling
var result : bool = false
match(state):
State.DETECTING: result = true
State.INSTALLING: result = true
State.UNINSTALLING: result = true
return result
func add_random_hack(advanced : bool) -> void:
#TODO: Add random hack spawning using RPCs
pass
func pickup(type : Pickup.Type) -> void:
if id != Multiplayer.id:
return
match(type):
Pickup.Type.DATABLOCK: print("Datablock picked up!")
Pickup.Type.BASIC_HACK: add_random_hack(false)

View File

@@ -35,5 +35,5 @@ func tv_blur(amount : float) -> void:
var blinder_mat : ShaderMaterial = portrait_blinder.material
blinder_mat.set_shader_parameter("opacity_limit", amount)
func set_pawn_name(name : String) -> void:
pawn_name.text = name
func set_pawn_name(p_name : String) -> void:
pawn_name.text = p_name

View File

@@ -32,7 +32,7 @@ func _ready() -> void:
"attack":false
}
func _physics_process(delta: float) -> void:
func _physics_process(_delta: float) -> void:
if get_multiplayer_authority() != Multiplayer.id:
return
var d = Input.get_vector("west", "east", "north", "south")

View File

@@ -3,12 +3,12 @@ class_name PawnLevelData extends Node
class HackData:
var type : Hack.Type
var quantity : int
var max : int
var max_quantity : int
func _init(type : Hack.Type, quantity : int, max : int) -> void:
self.type = type
self.quantity = quantity
self.max = max
func _init(new_type : Hack.Type, amt : int, max_amt : int) -> void:
type = new_type
quantity = amt
max_quantity = max_amt
var hacks : Array[HackData] = []
var active_hack : int = 0

View File

@@ -0,0 +1,25 @@
class_name PawnPickPortrait extends Panel
@onready var portrait : TextureRect = %Portrait
@onready var cover : Control = %Cover
var pawn : PawnBaseData
var pawn_idx : int
var _players : int = 0
var num_players : int :
get:
return _players
set(value):
_players = value
if cover != null:
cover.visible = (_players == 0)
func _ready() -> void:
pass
func setup(data : PawnBaseData, idx : int) -> void:
pawn = data
pawn_idx = idx
if portrait != null:
portrait.texture = data.portrait

View File

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

View File

@@ -2,7 +2,7 @@ class_name PawnSelector extends TextureRect
@onready var anim_player : AnimationPlayer = $AnimationPlayer
@export var player_id : int
@export var selection : int = 0
@export var selection : Vector2i = Vector2.ZERO
@export var selected : bool
func setup(id : int, color : Color) -> void:

View File

@@ -1,23 +1,24 @@
class_name Projectile extends RigidBody3D
class_name Projectile extends Area3D
var id : int = 0
var direction : Vector3
var speed : float
var friend_safe : bool = true
var damage
var time_remaining : float
func _ready() -> void:
linear_velocity = speed * direction
time_remaining = 2
func _physics_process(delta: float) -> void:
global_position += speed * direction * delta
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 PawnController:
if !friend_safe or id != body.id:
body.hurt(damage)
queue_free()
else:
queue_free()

View File

@@ -1,5 +1,21 @@
class_name RangeSphere extends CSGSphere3D
@tool
class_name RangeSphere extends Node3D
var _radius : float = 1
var type : Hack.Type = -1
@onready var rim_sphere : CSGSphere3D = $RimSphere
@onready var intersect_sphere : CSGSphere3D = $IntersectSphere
@export_range(0.1, 10.0, 0.1) var radius : float :
get:
return _radius
set(value):
_radius = value
if rim_sphere != null:
rim_sphere.radius = _radius
if intersect_sphere != null:
intersect_sphere.radius = _radius
func set_range(range : int) -> void:
radius = range
func set_range(new_radius : float) -> void:
radius = new_radius

View File

@@ -3,6 +3,6 @@ extends Node3D
@onready var level : Level = $Level
func _ready() -> void:
Game.pawns_selected[1] = load("res://data/pawns/van_reily.tres")
Game.pawns_selected[1] = "a"
level.setup()

View File

@@ -56,7 +56,7 @@ func _ready() -> void:
glow_tween.tween_property(target, "modulate:a", .8, .5)
glow_tween.tween_property(target, "modulate:a", 1, .5)
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
if Input.is_action_just_pressed("ui_menu"):
opened = !opened
start.visible = !opened

View File

@@ -11,27 +11,18 @@ 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
[node name="Bullet" type="Area3D"]
collision_layer = 0
collision_mask = 2
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
radial_segments = 6
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="."]
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("BoxShape3D_7i3j4")
[node name="OmniLight3D" type="OmniLight3D" parent="."]
@@ -42,5 +33,4 @@ 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"]
[connection signal="body_entered" from="." to="." method="_on_hit_area_entered"]

Some files were not shown because too many files have changed in this diff Show More