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
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
# This datastructure represents a simple one-to-many relationship. It manages
|
||||
# a dictionary of value/array pairs. It ignores duplicates of both the "one"
|
||||
# and the "many". You can disable ignoring dupliates of the "many" via
|
||||
# ignore_many_dupes. This setting is not retroactive and will only affect
|
||||
# new calls to add.
|
||||
# ------------------------------------------------------------------------------
|
||||
var items = {}
|
||||
var ignore_many_dupes = true
|
||||
|
||||
# return the size of items or the size of an element in items if "one" was
|
||||
# specified.
|
||||
func size(one=null):
|
||||
var to_return = 0
|
||||
if(one == null):
|
||||
to_return = items.size()
|
||||
elif(items.has(one)):
|
||||
to_return = items[one].size()
|
||||
return to_return
|
||||
|
||||
|
||||
# Add an element to "one" if it does not already exist
|
||||
func add(one, many_item):
|
||||
if(items.has(one)):
|
||||
if(!ignore_many_dupes or !items[one].has(many_item)):
|
||||
items[one].append(many_item)
|
||||
else:
|
||||
items[one] = [many_item]
|
||||
|
||||
|
||||
func clear():
|
||||
items.clear()
|
||||
|
||||
|
||||
func has(one, many_item):
|
||||
var to_return = false
|
||||
if(items.has(one)):
|
||||
to_return = items[one].has(many_item)
|
||||
return to_return
|
||||
|
||||
|
||||
func to_s():
|
||||
var to_return = ''
|
||||
for key in items:
|
||||
to_return += str(key, ": ", items[key], "\n")
|
||||
return to_return
|
||||
Reference in New Issue
Block a user