Fresh start: replace with naxIO/netfox-cs-sample foundation

Complete replacement of the tactical-shooter project with the
netfox-cs-sample (MIT) — a CS 1.6 inspired multiplayer FPS built
with Godot 4 and netfox.

## What's new
- Full CS-style gameplay: teams (T/CT), rounds, economy, buy menu
- 6 weapons: Knife, Glock, USP, AK-47, M4A1, AWP
- Bomb plant/defuse with 2 bombsites
- Flashbang & smoke grenades
- Proper netfox rollback netcode at 64 tick
- Network popup UI for host/join
- HUD, crosshair, round timer, scoreboard
- All netfox singletons registered as autoloads (works in exported builds)

## Architecture
- Listen-server (host from client, no dedicated server binary)
- Multiplayer-fps game lives at examples/multiplayer-fps/
- Netfox addons registered as autoloads for exported build compat
- Godot 4.7 with Forward+ renderer

## Removed
- Old headless-server architecture (client_main, server_main, player.gd, etc.)
- Custom netfox bootstrap with ENet fallback
- Old ChaffGames FPS template (2,420 lines, 844 KB)
- SimulationServer GDExtension stub
- Godot-jolt physics (netfox sample uses default Godot physics)
- Duplicate weapon_data.gd, anti_cheat.gd, round_manager.gd, etc.
- Server browser API Python venv (87 MB)
- test_range map and modular assets

## Preserved
- Git history
- Server config at config/default_server_config.cfg
- Windows export preset
- Build directory (gitignored)

Co-authored-by: naxIO <naxIO@users.noreply.github.com>
This commit is contained in:
2026-07-02 20:55:20 -04:00
parent ce39b237c3
commit b0c83af092
4416 changed files with 57418 additions and 902676 deletions
@@ -0,0 +1,24 @@
[gd_scene load_steps=6 format=3 uid="uid://8sru5hge6spx"]
[ext_resource type="Script" path="res://examples/forest-brawl/scripts/bomb-projectile.gd" id="1_eudhi"]
[ext_resource type="PackedScene" uid="uid://cn6ypxuayfwfl" path="res://examples/forest-brawl/models/kenney-platformer-kit/bomb.glb" id="1_lr6uq"]
[ext_resource type="PackedScene" uid="uid://6212jkmbikjq" path="res://examples/forest-brawl/scenes/explosion.tscn" id="2_r3c2e"]
[ext_resource type="Script" path="res://addons/netfox/tick-interpolator.gd" id="4_dyck1"]
[sub_resource type="SphereShape3D" id="SphereShape3D_pc5j5"]
radius = 0.25
[node name="Bomb Projectile" type="ShapeCast3D"]
shape = SubResource("SphereShape3D_pc5j5")
target_position = Vector3(0, 0, 0)
script = ExtResource("1_eudhi")
strength = 4.0
effect = ExtResource("2_r3c2e")
[node name="bomb" parent="." instance=ExtResource("1_lr6uq")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.226921, 0)
[node name="TickInterpolator" type="Node" parent="." node_paths=PackedStringArray("root")]
script = ExtResource("4_dyck1")
root = NodePath("..")
properties = Array[String]([":global_position"])
File diff suppressed because one or more lines are too long
+162
View File
@@ -0,0 +1,162 @@
[gd_scene load_steps=28 format=3 uid="uid://wi4owat0bml3"]
[ext_resource type="Script" path="res://examples/forest-brawl/scripts/brawler-controller.gd" id="1_np8na"]
[ext_resource type="Script" path="res://examples/forest-brawl/scripts/brawler-input.gd" id="2_m3v43"]
[ext_resource type="Script" path="res://examples/forest-brawl/scripts/play-random-3d.gd" id="3_rcsmp"]
[ext_resource type="Script" path="res://examples/forest-brawl/scripts/brawler-weapon.gd" id="4_0hvdj"]
[ext_resource type="AudioStream" uid="uid://cih2i8xa2v2is" path="res://examples/forest-brawl/sounds/fall1.wav" id="4_mw5vb"]
[ext_resource type="PackedScene" uid="uid://8sru5hge6spx" path="res://examples/forest-brawl/scenes/bomb-projectile.tscn" id="5_a4qop"]
[ext_resource type="AudioStream" uid="uid://4oilc8k83mmt" path="res://examples/forest-brawl/sounds/fall2.wav" id="5_kqmf5"]
[ext_resource type="AudioStream" uid="uid://b03phi3tfl21k" path="res://examples/forest-brawl/sounds/whoosh.wav" id="6_gh8ps"]
[ext_resource type="AudioStream" uid="uid://cegpnj82f4gio" path="res://examples/forest-brawl/sounds/fall3.wav" id="6_jc44e"]
[ext_resource type="Script" path="res://addons/netfox/rollback/rollback-synchronizer.gd" id="7_cmfmx"]
[ext_resource type="PackedScene" uid="uid://fctd5hkxnf2y" path="res://examples/forest-brawl/models/player/bomber-guy.glb" id="7_ij3cr"]
[ext_resource type="Script" path="res://addons/netfox/tick-interpolator.gd" id="8_pj7o0"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_gdp4i"]
animation = &"Float"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_qv2tk"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_rss6c"]
animation = &"Idle"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_7lmj4"]
animation = &"Run"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_7yjg4"]
animation = &"Strafe_L"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_v2fmc"]
animation = &"Strafe_R"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_tp0nc"]
animation = &"Backpedal"
[sub_resource type="AnimationNodeBlendSpace2D" id="AnimationNodeBlendSpace2D_blhbt"]
blend_point_0/node = SubResource("AnimationNodeAnimation_rss6c")
blend_point_0/pos = Vector2(0, 0)
blend_point_1/node = SubResource("AnimationNodeAnimation_7lmj4")
blend_point_1/pos = Vector2(0, 1)
blend_point_2/node = SubResource("AnimationNodeAnimation_7yjg4")
blend_point_2/pos = Vector2(1, 0)
blend_point_3/node = SubResource("AnimationNodeAnimation_v2fmc")
blend_point_3/pos = Vector2(-1, 0)
blend_point_4/node = SubResource("AnimationNodeAnimation_tp0nc")
blend_point_4/pos = Vector2(0, -1)
min_space = Vector2(-4, -1)
max_space = Vector2(4, 1)
[sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_2k2qg"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_w05vo"]
animation = &"Throw"
[sub_resource type="AnimationNodeOneShot" id="AnimationNodeOneShot_byyqa"]
filter_enabled = true
filters = ["rig/Skeleton3D:DEF-breast.L", "rig/Skeleton3D:DEF-breast.R", "rig/Skeleton3D:DEF-forearm.L", "rig/Skeleton3D:DEF-forearm.L.001", "rig/Skeleton3D:DEF-forearm.R", "rig/Skeleton3D:DEF-forearm.R.001", "rig/Skeleton3D:DEF-hand.L", "rig/Skeleton3D:DEF-hand.R", "rig/Skeleton3D:DEF-shoulder.L", "rig/Skeleton3D:DEF-shoulder.R", "rig/Skeleton3D:DEF-spine", "rig/Skeleton3D:DEF-spine.001", "rig/Skeleton3D:DEF-spine.002", "rig/Skeleton3D:DEF-spine.003", "rig/Skeleton3D:DEF-spine.004", "rig/Skeleton3D:DEF-spine.005", "rig/Skeleton3D:DEF-spine.006", "rig/Skeleton3D:DEF-upper_arm.L", "rig/Skeleton3D:DEF-upper_arm.L.001", "rig/Skeleton3D:DEF-upper_arm.R", "rig/Skeleton3D:DEF-upper_arm.R.001"]
fadein_time = 0.2
fadeout_time = 0.2
[sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_ofns8"]
[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_8to0y"]
graph_offset = Vector2(-680.797, -57.1155)
nodes/Float/node = SubResource("AnimationNodeBlend2_qv2tk")
nodes/Float/position = Vector2(-80, 0)
"nodes/Float Anim/node" = SubResource("AnimationNodeAnimation_gdp4i")
"nodes/Float Anim/position" = Vector2(-280, 120)
nodes/Move/node = SubResource("AnimationNodeBlendSpace2D_blhbt")
nodes/Move/position = Vector2(-480, -40)
nodes/MoveScale/node = SubResource("AnimationNodeTimeScale_2k2qg")
nodes/MoveScale/position = Vector2(-280, -40)
nodes/Throw/node = SubResource("AnimationNodeOneShot_byyqa")
nodes/Throw/position = Vector2(100, 20)
"nodes/Throw Anim/node" = SubResource("AnimationNodeAnimation_w05vo")
"nodes/Throw Anim/position" = Vector2(-280, 260)
nodes/ThrowScale/node = SubResource("AnimationNodeTimeScale_ofns8")
nodes/ThrowScale/position = Vector2(-100, 260)
nodes/output/position = Vector2(320, 80)
node_connections = [&"output", 0, &"Throw", &"Float", 0, &"MoveScale", &"Float", 1, &"Float Anim", &"MoveScale", 0, &"Move", &"Throw", 0, &"Float", &"Throw", 1, &"ThrowScale", &"ThrowScale", 0, &"Throw Anim"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_qgusj"]
radius = 0.25
height = 1.0
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_4cjl8"]
properties/0/path = NodePath(".:player_name")
properties/0/spawn = true
properties/0/sync = false
properties/0/watch = true
properties/1/path = NodePath(".:visible")
properties/1/spawn = true
properties/1/sync = false
properties/1/watch = true
[node name="Brawler" type="CharacterBody3D" groups=["Brawlers"]]
platform_on_leave = 2
platform_floor_layers = 0
script = ExtResource("1_np8na")
speed = 4.0
death_depth = 16.0
respawn_time = 8.0
[node name="bomber-guy" parent="." instance=ExtResource("7_ij3cr")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, -0.5, 0)
[node name="AnimationTree" type="AnimationTree" parent="."]
tree_root = SubResource("AnimationNodeBlendTree_8to0y")
anim_player = NodePath("../bomber-guy/AnimationPlayer")
active = true
parameters/Float/blend_amount = 0.0
parameters/Move/blend_position = Vector2(0, 0)
parameters/MoveScale/scale = 1.0
parameters/Throw/active = false
parameters/Throw/internal_active = false
parameters/Throw/request = 0
parameters/ThrowScale/scale = 1.0
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("CapsuleShape3D_qgusj")
[node name="Nametag" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
pixel_size = 0.0007
billboard = 1
fixed_size = true
text = "Nameless Brawler"
width = 128.0
[node name="Fall Sound" type="AudioStreamPlayer3D" parent="."]
script = ExtResource("3_rcsmp")
sounds = Array[AudioStream]([ExtResource("4_mw5vb"), ExtResource("5_kqmf5"), ExtResource("6_jc44e")])
[node name="Input" type="Node" parent="."]
script = ExtResource("2_m3v43")
[node name="Weapon" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.5)
script = ExtResource("4_0hvdj")
projectile = ExtResource("5_a4qop")
fire_cooldown = 0.5
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="Weapon"]
stream = ExtResource("6_gh8ps")
[node name="RollbackSynchronizer" type="Node" parent="." node_paths=PackedStringArray("root")]
script = ExtResource("7_cmfmx")
root = NodePath("..")
enable_prediction = true
state_properties = Array[String]([":transform", ":velocity", ":speed", ":mass"])
full_state_interval = 24
diff_ack_interval = 4
input_properties = Array[String](["Input:movement", "Input:aim"])
enable_input_broadcast = false
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."]
replication_config = SubResource("SceneReplicationConfig_4cjl8")
[node name="TickInterpolator" type="Node" parent="." node_paths=PackedStringArray("root")]
script = ExtResource("8_pj7o0")
root = NodePath("..")
properties = Array[String]([":transform"])
@@ -0,0 +1,25 @@
[gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://joecqmf51gl0"]
[sub_resource type="Gradient" id="Gradient_t3ujw"]
interpolation_mode = 2
colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0)
[sub_resource type="GradientTexture2D" id="GradientTexture2D_6a55y"]
gradient = SubResource("Gradient_t3ujw")
width = 256
height = 256
fill = 1
fill_from = Vector2(0.5, 0.5)
fill_to = Vector2(0.75, 0.5)
[resource]
transparency = 1
shading_mode = 2
specular_mode = 2
albedo_color = Color(0.701961, 0.901961, 1, 1)
albedo_texture = SubResource("GradientTexture2D_6a55y")
rim_tint = 1.0
texture_repeat = false
billboard_mode = 1
billboard_keep_scale = true
proximity_fade_enabled = true
@@ -0,0 +1,12 @@
[gd_scene load_steps=3 format=3 uid="uid://bsbr5iwwmvkni"]
[ext_resource type="Material" uid="uid://joecqmf51gl0" path="res://examples/forest-brawl/scenes/doodads/cloud-puff-material.tres" id="1_poiuj"]
[sub_resource type="QuadMesh" id="QuadMesh_o76l3"]
material = ExtResource("1_poiuj")
size = Vector2(16, 16)
[node name="Cloud Puff" type="MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.17294, 0)
cast_shadow = 0
mesh = SubResource("QuadMesh_o76l3")
@@ -0,0 +1,19 @@
[gd_scene load_steps=2 format=3 uid="uid://c12hb5btenkcy"]
[ext_resource type="PackedScene" uid="uid://bsbr5iwwmvkni" path="res://examples/forest-brawl/scenes/doodads/cloud-puff.tscn" id="1_g3m5f"]
[node name="Clouds 1" type="Node3D"]
[node name="Cloud Puff" parent="." instance=ExtResource("1_g3m5f")]
[node name="Cloud Puff2" parent="." instance=ExtResource("1_g3m5f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.61259, 1.17294, 0.902248)
skeleton = NodePath("")
[node name="Cloud Puff3" parent="." instance=ExtResource("1_g3m5f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5049, 1.17294, 2.82576)
skeleton = NodePath("")
[node name="Cloud Puff4" parent="." instance=ExtResource("1_g3m5f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.66857, 1.17294, -0.671089)
skeleton = NodePath("")
@@ -0,0 +1,33 @@
[gd_scene load_steps=2 format=3 uid="uid://c5l8x303sjqhs"]
[ext_resource type="PackedScene" uid="uid://bsbr5iwwmvkni" path="res://examples/forest-brawl/scenes/doodads/cloud-puff.tscn" id="1_inhlv"]
[node name="Clouds 2" type="Node3D"]
[node name="Cloud Puff" parent="." instance=ExtResource("1_inhlv")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.87052, 1.17294, 1.65643)
skeleton = NodePath("")
[node name="Cloud Puff2" parent="." instance=ExtResource("1_inhlv")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.82601, 0.801252, 2.57458)
skeleton = NodePath("")
[node name="Cloud Puff3" parent="." instance=ExtResource("1_inhlv")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.89437, 0.801252, -2.56131)
skeleton = NodePath("")
[node name="Cloud Puff4" parent="." instance=ExtResource("1_inhlv")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.24966, 1.12834, -0.138732)
skeleton = NodePath("")
[node name="Cloud Puff5" parent="." instance=ExtResource("1_inhlv")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.18009, 0.756649, -0.0275192)
skeleton = NodePath("")
[node name="Cloud Puff6" parent="." instance=ExtResource("1_inhlv")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.212608, 2.86806, -0.8603)
skeleton = NodePath("")
[node name="Cloud Puff7" parent="." instance=ExtResource("1_inhlv")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.20852, 0.416291, -2.78978)
skeleton = NodePath("")
@@ -0,0 +1,45 @@
[gd_scene load_steps=2 format=3 uid="uid://dq14vitb32x5p"]
[ext_resource type="PackedScene" uid="uid://bsbr5iwwmvkni" path="res://examples/forest-brawl/scenes/doodads/cloud-puff.tscn" id="1_5rh3p"]
[node name="Clouds 3" type="Node3D"]
[node name="Cloud Puff" parent="." instance=ExtResource("1_5rh3p")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.99559, 0)
skeleton = NodePath("")
[node name="Cloud Puff2" parent="." instance=ExtResource("1_5rh3p")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.49789, 0, 4.6289)
skeleton = NodePath("")
[node name="Cloud Puff3" parent="." instance=ExtResource("1_5rh3p")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.54156, 3.06295, 1.44107)
skeleton = NodePath("")
[node name="Cloud Puff4" parent="." instance=ExtResource("1_5rh3p")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.02192, 0, -2.40179)
skeleton = NodePath("")
[node name="Cloud Puff5" parent="." instance=ExtResource("1_5rh3p")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.30146, 0, 2.75114)
skeleton = NodePath("")
[node name="Cloud Puff6" parent="." instance=ExtResource("1_5rh3p")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.2622, 0, -1.44107)
skeleton = NodePath("")
[node name="Cloud Puff7" parent="." instance=ExtResource("1_5rh3p")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.57647, 0, -2.62013)
skeleton = NodePath("")
[node name="Cloud Puff8" parent="." instance=ExtResource("1_5rh3p")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.54595, 0, 1.48474)
skeleton = NodePath("")
[node name="Cloud Puff9" parent="." instance=ExtResource("1_5rh3p")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.829708, 0, 2.79481)
skeleton = NodePath("")
[node name="Cloud Puff10" parent="." instance=ExtResource("1_5rh3p")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.57207, 0, -3.31883)
skeleton = NodePath("")
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,98 @@
[gd_scene load_steps=17 format=3 uid="uid://6212jkmbikjq"]
[ext_resource type="Script" path="res://examples/forest-brawl/scripts/displacer.gd" id="1_acukw"]
[ext_resource type="Script" path="res://examples/forest-brawl/scripts/explosion.gd" id="2_g53bu"]
[ext_resource type="AudioStream" uid="uid://cuu7355mjw0qm" path="res://examples/forest-brawl/sounds/boom1.wav" id="3_kw7x7"]
[ext_resource type="Script" path="res://examples/forest-brawl/scripts/play-random-3d.gd" id="4_vsx6y"]
[ext_resource type="AudioStream" uid="uid://dk44nxlwr3m1o" path="res://examples/forest-brawl/sounds/boom2.wav" id="5_yr2wj"]
[ext_resource type="AudioStream" uid="uid://yyc2x2137nqa" path="res://examples/forest-brawl/sounds/boom3.wav" id="6_fihgd"]
[sub_resource type="SphereShape3D" id="SphereShape3D_0scc6"]
radius = 2.0
[sub_resource type="Gradient" id="Gradient_32qlm"]
interpolation_mode = 2
colors = PackedColorArray(1, 1, 1, 1, 0, 0, 0, 1)
[sub_resource type="GradientTexture2D" id="GradientTexture2D_nqkbc"]
gradient = SubResource("Gradient_32qlm")
fill = 1
fill_from = Vector2(0.5, 0.5)
fill_to = Vector2(1, 0.5)
metadata/_snap_enabled = true
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_kb3qh"]
transparency = 1
blend_mode = 1
depth_draw_mode = 2
shading_mode = 0
vertex_color_use_as_albedo = true
vertex_color_is_srgb = true
albedo_texture = SubResource("GradientTexture2D_nqkbc")
uv1_scale = Vector3(2, 1, 1)
uv1_offset = Vector3(0.5, 0, 0)
billboard_mode = 1
billboard_keep_scale = true
proximity_fade_enabled = true
proximity_fade_distance = 0.25
[sub_resource type="SphereMesh" id="SphereMesh_5d23i"]
material = SubResource("StandardMaterial3D_kb3qh")
radial_segments = 16
rings = 8
[sub_resource type="Curve" id="Curve_t4jmr"]
_data = [Vector2(0, 0), 0.0, 14.9413, 0, 0, Vector2(0.0942029, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), -3.0072, 0.0, 0, 0]
point_count = 3
[sub_resource type="Gradient" id="Gradient_6w0nn"]
interpolation_mode = 2
offsets = PackedFloat32Array(0, 0.57561, 1)
colors = PackedColorArray(1, 0.7, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0)
[sub_resource type="SphereShape3D" id="SphereShape3D_ddj8d"]
radius = 2.0
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_6rsal"]
transparency = 1
albedo_color = Color(1, 0, 0, 0.25098)
[sub_resource type="SphereMesh" id="SphereMesh_k5smf"]
material = SubResource("StandardMaterial3D_6rsal")
radius = 2.0
height = 4.0
[node name="Explosion" type="Area3D"]
gravity = 0.0
script = ExtResource("1_acukw")
duration = 1.0
strength = 64.0
shape = SubResource("SphereShape3D_0scc6")
[node name="Explosion Particles" type="CPUParticles3D" parent="."]
amount = 32
explosiveness = 0.8
local_coords = true
mesh = SubResource("SphereMesh_5d23i")
emission_shape = 1
emission_sphere_radius = 0.5
particle_flag_align_y = true
particle_flag_rotate_y = true
gravity = Vector3(0, 0, 0)
scale_amount_min = 0.5
scale_amount_max = 2.0
scale_amount_curve = SubResource("Curve_t4jmr")
color_ramp = SubResource("Gradient_6w0nn")
script = ExtResource("2_g53bu")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("SphereShape3D_ddj8d")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
visible = false
mesh = SubResource("SphereMesh_k5smf")
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="."]
autoplay = true
script = ExtResource("4_vsx6y")
sounds = Array[AudioStream]([ExtResource("3_kw7x7"), ExtResource("5_yr2wj"), ExtResource("6_fihgd")])
@@ -0,0 +1,27 @@
[gd_scene load_steps=5 format=3 uid="uid://cjavt41cokqv5"]
[ext_resource type="Script" path="res://examples/forest-brawl/scripts/moving-platform.gd" id="1_q5d25"]
[ext_resource type="PackedScene" uid="uid://bnyoffewc4b" path="res://examples/forest-brawl/models/kenney-platformer-kit/blockHexagon.glb" id="2_h7k7v"]
[ext_resource type="Script" path="res://addons/netfox/tick-interpolator.gd" id="3_b65sx"]
[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_y7a63"]
points = PackedVector3Array(-0.557, 0.890101, -0.299866, 0.648933, 0.781605, 0.229175, 0.62806, 0.823296, 0.270961, -0.0369031, 0.0136385, 0.556084, 0.0421915, 0.0163715, -0.552961, -0.163975, 0.823296, 0.646129, -0.5, 0.00740408, 0.281541, 0.0426543, 0.989841, -0.559451, 0.48164, 0.0113339, -0.2993, -0.495398, 0.988618, 0.298944, 0.523822, 0.76081, -0.45848, -0.5, 0.00740408, -0.281541, 0.48164, 0.0113339, 0.2993, 0.499254, 0.986877, 0.297878, -0.143102, 0.76081, -0.667022, 0.148614, 0.76081, 0.667022, -0.643422, 0.781605, 0.249937, 0.499253, 0.986876, -0.297878, -0.0372869, 0.991605, 0.561466, -0.518184, 0.76081, 0.45848, 0.148614, 0.802501, -0.667022, 0.648933, 0.781605, -0.229175, -0.643422, 0.781605, -0.249937, 0.523822, 0.76081, 0.45848, -0.518184, 0.76081, -0.45848, -0.495399, 0.988619, -0.298944, -0.0368981, 0.0136993, -0.556015, 0.0421962, 0.016314, 0.553027, -0.143102, 0.76081, 0.667022, -0.163975, 0.823296, -0.646129, 0.148614, 0.802501, 0.667022, -0.037283, 0.991557, -0.561412)
[node name="Moving Platform" type="AnimatableBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, -6)
sync_to_physics = false
script = ExtResource("1_q5d25")
speed = 1.0
[node name="blockHexagon" parent="." instance=ExtResource("2_h7k7v")]
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("ConvexPolygonShape3D_y7a63")
[node name="Target" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -4)
[node name="TickInterpolator" type="Node" parent="." node_paths=PackedStringArray("root")]
script = ExtResource("3_b65sx")
root = NodePath("..")
properties = Array[String]([":transform"])
File diff suppressed because one or more lines are too long
@@ -0,0 +1,71 @@
[gd_scene load_steps=4 format=3 uid="uid://ojh5xofoserg"]
[ext_resource type="Script" path="res://examples/forest-brawl/scripts/score-screen.gd" id="1_q3k84"]
[sub_resource type="LabelSettings" id="LabelSettings_qjv80"]
font_size = 32
[sub_resource type="LabelSettings" id="LabelSettings_g3rp6"]
font_size = 24
[node name="Score Screen" type="Control" node_paths=PackedStringArray("message_label", "names_column", "scores_column")]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_q3k84")
messages = PackedStringArray("You\'ve joined the gravitationally challenged!", "Nom nom nom, those bombs must have been tasty!", "If you can\'t dodge \'em, collect \'em!", "Those aren\'t pokeballs, nobody\'s gotta catch \'em all!", "Next time you can try WASD to move", "Try falling, but like, up")
message_label = NodePath("VBoxContainer/Message Label")
names_column = NodePath("VBoxContainer/Scoreboard/Names VBox")
scores_column = NodePath("VBoxContainer/Scoreboard/Scores VBox")
fade_time = 1.0
[node name="ColorRect" type="ColorRect" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0, 0, 0, 1)
[node name="VBoxContainer" type="VBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 14
anchor_top = 0.5
anchor_right = 1.0
anchor_bottom = 0.5
offset_top = -96.0
offset_bottom = 96.0
grow_horizontal = 2
grow_vertical = 2
[node name="Message Label" type="Label" parent="VBoxContainer"]
layout_mode = 2
text = "You've joined the gravitationally challenged"
label_settings = SubResource("LabelSettings_qjv80")
horizontal_alignment = 1
vertical_alignment = 1
autowrap_mode = 2
[node name="Scores Label" type="Label" parent="VBoxContainer"]
layout_mode = 2
text = "Scores:"
label_settings = SubResource("LabelSettings_g3rp6")
horizontal_alignment = 1
vertical_alignment = 1
autowrap_mode = 2
[node name="Scoreboard" type="HBoxContainer" parent="VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
[node name="Names VBox" type="VBoxContainer" parent="VBoxContainer/Scoreboard"]
layout_mode = 2
size_flags_horizontal = 3
[node name="Scores VBox" type="VBoxContainer" parent="VBoxContainer/Scoreboard"]
layout_mode = 2
size_flags_horizontal = 3