651c4ad94a
ci / verify (push) Successful in 1m57s
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
64 lines
1.5 KiB
GDScript
64 lines
1.5 KiB
GDScript
var _strutils = GutUtils.Strutils.new()
|
|
const INDENT = ' '
|
|
var _max_to_display = 30
|
|
const ABSOLUTE_MAX_DISPLAYED = 10000
|
|
const UNLIMITED = -1
|
|
|
|
|
|
func _single_diff(diff, depth=0):
|
|
var to_return = ""
|
|
var brackets = diff.get_brackets()
|
|
|
|
if(brackets != null and !diff.are_equal):
|
|
to_return = ''
|
|
to_return += str(brackets.open, "\n",
|
|
_strutils.indent_text(differences_to_s(diff.differences, depth), depth+1, INDENT), "\n",
|
|
brackets.close)
|
|
else:
|
|
to_return = str(diff)
|
|
|
|
return to_return
|
|
|
|
|
|
func make_it(diff):
|
|
var to_return = ''
|
|
if(diff.are_equal):
|
|
to_return = diff.summary
|
|
else:
|
|
if(_max_to_display == ABSOLUTE_MAX_DISPLAYED):
|
|
to_return = str(diff.get_value_1(), ' != ', diff.get_value_2())
|
|
else:
|
|
to_return = diff.get_short_summary()
|
|
to_return += str("\n", _strutils.indent_text(_single_diff(diff, 0), 1, ' '))
|
|
return to_return
|
|
|
|
|
|
func differences_to_s(differences, depth=0):
|
|
var to_return = ''
|
|
var keys = differences.keys()
|
|
keys.sort()
|
|
var limit = min(_max_to_display, differences.size())
|
|
|
|
for i in range(limit):
|
|
var key = keys[i]
|
|
to_return += str(key, ": ", _single_diff(differences[key], depth))
|
|
|
|
if(i != limit -1):
|
|
to_return += "\n"
|
|
|
|
if(differences.size() > _max_to_display):
|
|
to_return += str("\n\n... ", differences.size() - _max_to_display, " more.")
|
|
|
|
return to_return
|
|
|
|
|
|
func get_max_to_display():
|
|
return _max_to_display
|
|
|
|
|
|
func set_max_to_display(max_to_display):
|
|
_max_to_display = max_to_display
|
|
if(_max_to_display == UNLIMITED):
|
|
_max_to_display = ABSOLUTE_MAX_DISPLAYED
|
|
|