c4beeae38f
Top-down twin-stick bullet-hell, Godot 4.7, server-authoritative dedicated server with client-side prediction. Clients send input only; the server resolves every hit for both players and enemies (no PvP). - SimWorld: whole simulation as plain RefCounted objects (no nodes, no physics server), ~0.24ms/tick at peak load -- runs headless for free and drives 78 tests in under a second - BulletPool: struct-of-arrays bullet storage, replicated as spawn/despawn events rather than per-tick state - Emitter framework (Ring/AimedSpread/WallGap/ArcSweep) shared by trash enemies and bosses -- a new boss is data in src/content/content.gd, no simulation changes - The Warden of the Fold: stationary 4-phase boss built entirely on that format - Lobby hub with a portal into on-demand dungeon instances; one process hosts the hub plus every concurrent dungeon - Emergency escape: 3s server-owned channel, cancelled by damage - tools/check.sh, test.sh (GUT), smoke.sh (real server + bot clients over ENet), bench.gd; git hooks wired to the same scripts - docs/ARCHITECTURE.md, NETCODE.md, WORKFLOW.md, ROADMAP.md
162 lines
5.1 KiB
Plaintext
162 lines
5.1 KiB
Plaintext
[gd_scene load_steps=5 format=3 uid="uid://cnqqdfsn80ise"]
|
|
|
|
[ext_resource type="Theme" uid="uid://cstkhwkpajvqu" path="res://addons/gut/gui/GutSceneTheme.tres" id="1_farmq"]
|
|
[ext_resource type="FontFile" uid="uid://bnh0lslf4yh87" path="res://addons/gut/fonts/CourierPrime-Regular.ttf" id="2_a2e2l"]
|
|
[ext_resource type="Script" uid="uid://blvhsbnsvfyow" path="res://addons/gut/gui/gut_gui.gd" id="2_eokrf"]
|
|
[ext_resource type="PackedScene" uid="uid://bvrqqgjpyouse" path="res://addons/gut/gui/ResizeHandle.tscn" id="4_xrhva"]
|
|
|
|
[node name="Min" type="Panel"]
|
|
clip_contents = true
|
|
custom_minimum_size = Vector2(280, 145)
|
|
offset_right = 280.0
|
|
offset_bottom = 145.0
|
|
theme = ExtResource("1_farmq")
|
|
script = ExtResource("2_eokrf")
|
|
|
|
[node name="MainBox" type="VBoxContainer" parent="."]
|
|
layout_mode = 1
|
|
anchors_preset = 15
|
|
anchor_right = 1.0
|
|
anchor_bottom = 1.0
|
|
grow_horizontal = 2
|
|
grow_vertical = 2
|
|
metadata/_edit_layout_mode = 1
|
|
|
|
[node name="TitleBar" type="Panel" parent="MainBox"]
|
|
custom_minimum_size = Vector2(0, 25)
|
|
layout_mode = 2
|
|
|
|
[node name="TitleBox" type="HBoxContainer" parent="MainBox/TitleBar"]
|
|
layout_mode = 0
|
|
anchor_right = 1.0
|
|
anchor_bottom = 1.0
|
|
offset_top = 2.0
|
|
offset_bottom = 3.0
|
|
grow_horizontal = 2
|
|
grow_vertical = 2
|
|
metadata/_edit_layout_mode = 1
|
|
|
|
[node name="Spacer1" type="CenterContainer" parent="MainBox/TitleBar/TitleBox"]
|
|
layout_mode = 2
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="Title" type="Label" parent="MainBox/TitleBar/TitleBox"]
|
|
layout_mode = 2
|
|
text = "Title"
|
|
|
|
[node name="Spacer2" type="CenterContainer" parent="MainBox/TitleBar/TitleBox"]
|
|
layout_mode = 2
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="TimeLabel" type="Label" parent="MainBox/TitleBar/TitleBox"]
|
|
layout_mode = 2
|
|
text = "0.000s"
|
|
|
|
[node name="Body" type="HBoxContainer" parent="MainBox"]
|
|
layout_mode = 2
|
|
size_flags_vertical = 3
|
|
|
|
[node name="LeftMargin" type="CenterContainer" parent="MainBox/Body"]
|
|
custom_minimum_size = Vector2(5, 0)
|
|
layout_mode = 2
|
|
|
|
[node name="BodyRows" type="VBoxContainer" parent="MainBox/Body"]
|
|
layout_mode = 2
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="ProgressBars" type="HBoxContainer" parent="MainBox/Body/BodyRows"]
|
|
layout_mode = 2
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="HBoxContainer" type="HBoxContainer" parent="MainBox/Body/BodyRows/ProgressBars"]
|
|
layout_mode = 2
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="Label" type="Label" parent="MainBox/Body/BodyRows/ProgressBars/HBoxContainer"]
|
|
layout_mode = 2
|
|
text = "T:"
|
|
|
|
[node name="ProgressTest" type="ProgressBar" parent="MainBox/Body/BodyRows/ProgressBars/HBoxContainer"]
|
|
custom_minimum_size = Vector2(100, 0)
|
|
layout_mode = 2
|
|
size_flags_horizontal = 3
|
|
value = 25.0
|
|
|
|
[node name="HBoxContainer2" type="HBoxContainer" parent="MainBox/Body/BodyRows/ProgressBars"]
|
|
layout_mode = 2
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="Label" type="Label" parent="MainBox/Body/BodyRows/ProgressBars/HBoxContainer2"]
|
|
layout_mode = 2
|
|
text = "S:"
|
|
|
|
[node name="ProgressScript" type="ProgressBar" parent="MainBox/Body/BodyRows/ProgressBars/HBoxContainer2"]
|
|
custom_minimum_size = Vector2(100, 0)
|
|
layout_mode = 2
|
|
size_flags_horizontal = 3
|
|
value = 75.0
|
|
|
|
[node name="PathDisplay" type="VBoxContainer" parent="MainBox/Body/BodyRows"]
|
|
clip_contents = true
|
|
layout_mode = 2
|
|
size_flags_vertical = 3
|
|
|
|
[node name="Path" type="Label" parent="MainBox/Body/BodyRows/PathDisplay"]
|
|
layout_mode = 2
|
|
theme_override_fonts/font = ExtResource("2_a2e2l")
|
|
theme_override_font_sizes/font_size = 14
|
|
text = "res://test/integration/whatever"
|
|
clip_text = true
|
|
text_overrun_behavior = 3
|
|
|
|
[node name="HBoxContainer" type="HBoxContainer" parent="MainBox/Body/BodyRows/PathDisplay"]
|
|
clip_contents = true
|
|
layout_mode = 2
|
|
|
|
[node name="S3" type="CenterContainer" parent="MainBox/Body/BodyRows/PathDisplay/HBoxContainer"]
|
|
custom_minimum_size = Vector2(5, 0)
|
|
layout_mode = 2
|
|
|
|
[node name="File" type="Label" parent="MainBox/Body/BodyRows/PathDisplay/HBoxContainer"]
|
|
layout_mode = 2
|
|
size_flags_horizontal = 3
|
|
theme_override_fonts/font = ExtResource("2_a2e2l")
|
|
theme_override_font_sizes/font_size = 14
|
|
text = "test_this_thing.gd"
|
|
text_overrun_behavior = 3
|
|
|
|
[node name="Footer" type="HBoxContainer" parent="MainBox/Body/BodyRows"]
|
|
layout_mode = 2
|
|
|
|
[node name="HandleLeft" parent="MainBox/Body/BodyRows/Footer" node_paths=PackedStringArray("resize_control") instance=ExtResource("4_xrhva")]
|
|
layout_mode = 2
|
|
orientation = 0
|
|
resize_control = NodePath("../../../../..")
|
|
vertical_resize = false
|
|
|
|
[node name="SwitchModes" type="Button" parent="MainBox/Body/BodyRows/Footer"]
|
|
layout_mode = 2
|
|
text = "Expand"
|
|
|
|
[node name="CenterContainer" type="CenterContainer" parent="MainBox/Body/BodyRows/Footer"]
|
|
layout_mode = 2
|
|
size_flags_horizontal = 3
|
|
|
|
[node name="Continue" type="Button" parent="MainBox/Body/BodyRows/Footer"]
|
|
layout_mode = 2
|
|
text = "Continue
|
|
"
|
|
|
|
[node name="HandleRight" parent="MainBox/Body/BodyRows/Footer" node_paths=PackedStringArray("resize_control") instance=ExtResource("4_xrhva")]
|
|
layout_mode = 2
|
|
resize_control = NodePath("../../../../..")
|
|
vertical_resize = false
|
|
|
|
[node name="RightMargin" type="CenterContainer" parent="MainBox/Body"]
|
|
custom_minimum_size = Vector2(5, 0)
|
|
layout_mode = 2
|
|
|
|
[node name="CenterContainer" type="CenterContainer" parent="MainBox"]
|
|
custom_minimum_size = Vector2(2.08165e-12, 2)
|
|
layout_mode = 2
|