Prove Terminus docking through generic Unity
This commit is contained in:
parent
6cf616324e
commit
1fbf238adb
5 changed files with 40 additions and 4 deletions
|
|
@ -215,13 +215,13 @@ internal static class AetheriaDaemonZoneGenerator
|
|||
|
||||
var entities = new[]
|
||||
{
|
||||
Entity(loadouts, availabilityFactions, "Anchor Station", "station", -170, -80, 0, 0, "player", 760, keys[6], [keys[1], keys[2], keys[3], keys[4], keys[6], keys[7], keys[11]], ["repair-parts", "reactor-fuel", "drone-core"]),
|
||||
Entity(loadouts, availabilityFactions, "Anchor Station", "station", -50, -30, 0, 0, "player", 760, keys[6], [keys[1], keys[2], keys[3], keys[4], keys[6], keys[7], keys[11]], ["repair-parts", "reactor-fuel", "drone-core"]),
|
||||
Entity(loadouts, availabilityFactions, "Vanguard One", "ship", -40, -30, 10, 4, "player", 540, keys[6], [keys[0], keys[2], keys[4], keys[6], keys[7]], ["coilgun-ammo", "field-rations"]),
|
||||
Entity(loadouts, availabilityFactions, "Wing Two", "ship", 145, 125, -5, 7, "player", 450, keys[6], [keys[0], keys[1], keys[6], keys[8]], ["sensor-buoy", "shield-cell"]),
|
||||
Entity(loadouts, availabilityFactions, "Torch Three", "ship", -235, 210, 8, -4, "player", 500, keys[7], [keys[0], keys[1], keys[7]], ["micro-missile", "coolant-pack"]),
|
||||
Entity(loadouts, availabilityFactions, "Foundry Tug", "ship", 330, -155, -2, 3, "player", 390, keys[6], [keys[0], keys[1], keys[6], keys[10]], ["ore-canister", "field-rations"]),
|
||||
Entity(loadouts, availabilityFactions, "Derelict Relay", "station", -390, 270, 0, 0, "neutral", 160, "", [keys[0], keys[3]], ["ancient-transponder"]),
|
||||
Entity(loadouts, availabilityFactions, "Ash Raider", "ship", 100, -30, -5, -2, "raider", 320, "", [keys[0], keys[1], keys[2], keys[4]], ["scrap-metal", "stolen-capacitor"]),
|
||||
Entity(loadouts, availabilityFactions, "Ash Raider", "ship", 20, -30, -5, -2, "raider", 320, "", [keys[0], keys[1], keys[2], keys[4]], ["scrap-metal", "stolen-capacitor"]),
|
||||
Entity(loadouts, availabilityFactions, "Cinder Knife", "ship", 585, -115, -7, 1, "raider", 280, "", [keys[0], keys[3]], ["volatile-fuel"]),
|
||||
Entity(loadouts, availabilityFactions, "Blackwake", "ship", 690, 300, -4, -3, "raider", 230, "", [keys[2]], ["ore-cache", "burned-relay-core"]),
|
||||
Entity(loadouts, availabilityFactions, "Vesper Sloop", "ship", 960, 620, -3, -5, "raider", 250, "", [keys[4]], ["stolen-map-fragment"]),
|
||||
|
|
|
|||
|
|
@ -573,6 +573,12 @@ namespace GameCult.Aetheria.State.Verse
|
|||
run ??= new AetheriaRuntimeRunCheckpointCommit();
|
||||
zone ??= new AetheriaRuntimeZoneSnapshotCommit();
|
||||
var playerEntityId = PlayableWorldEntityId(run, zone, currentEntityKey);
|
||||
var playerEntityIndex = TryParseEntityIndex(playerEntityId);
|
||||
var dockParent = FindDockParent(zone, playerEntityIndex);
|
||||
var isDocked = dockParent != null;
|
||||
var cameraTargetEntityId = isDocked
|
||||
? run.EntityRecordKey(zone.ZoneIndex, dockParent!.EntityIndex)
|
||||
: playerEntityId;
|
||||
var props = new Dictionary<string, string>(StringComparer.Ordinal)
|
||||
{
|
||||
["label"] = string.IsNullOrWhiteSpace(zone.Name) ? "Aetheria World" : zone.Name,
|
||||
|
|
@ -587,6 +593,10 @@ namespace GameCult.Aetheria.State.Verse
|
|||
["cameraRig"] = "arpg.orbital-follow.v1",
|
||||
["viewId"] = "pilot",
|
||||
["playerEntityId"] = playerEntityId,
|
||||
["cameraTargetEntityId"] = cameraTargetEntityId,
|
||||
["subjectVisible"] = isDocked ? "false" : "true",
|
||||
["movementEnabled"] = isDocked ? "false" : "true",
|
||||
["presentationMode"] = isDocked ? "docked" : "world",
|
||||
["movementCommand"] = CommandName(AetheriaRuntimeDaemonCommandKinds.SetMoveVector),
|
||||
["focusCommand"] = CommandName(AetheriaRuntimeDaemonCommandKinds.TargetNearest),
|
||||
["targetCommand"] = CommandName(AetheriaRuntimeDaemonCommandKinds.SetTarget),
|
||||
|
|
@ -1141,6 +1151,18 @@ namespace GameCult.Aetheria.State.Verse
|
|||
IsControllablePlayerEntity(entity));
|
||||
}
|
||||
|
||||
private static AetheriaRuntimeEntitySnapshotCommit? FindDockParent(
|
||||
AetheriaRuntimeZoneSnapshotCommit zone,
|
||||
int childEntityIndex)
|
||||
{
|
||||
if (childEntityIndex < 0)
|
||||
return null;
|
||||
|
||||
return (zone?.Entities ?? Array.Empty<AetheriaRuntimeEntitySnapshotCommit>())
|
||||
.FirstOrDefault(entity => entity != null &&
|
||||
(entity.DockingBayAssignments ?? Array.Empty<int>()).Contains(childEntityIndex));
|
||||
}
|
||||
|
||||
private static bool IsControllablePlayerEntity(AetheriaRuntimeEntitySnapshotCommit entity)
|
||||
{
|
||||
return entity != null &&
|
||||
|
|
|
|||
|
|
@ -48,11 +48,18 @@ namespace GameCult.Aetheria.State.Verse
|
|||
? (zone?.Entities ?? Array.Empty<AetheriaRuntimeEntitySnapshotCommit>())
|
||||
.FirstOrDefault(entity => entity != null && entity.EntityIndex == controlledEntityIndex)
|
||||
: null;
|
||||
var visibleEntityIndices = (controlled?.Contacts ?? Array.Empty<AetheriaRuntimeEntityContactCommit>())
|
||||
var dockParent = (zone?.Entities ?? Array.Empty<AetheriaRuntimeEntitySnapshotCommit>())
|
||||
.FirstOrDefault(entity => entity != null && controlled != null &&
|
||||
(entity.DockingBayAssignments ?? Array.Empty<int>()).Contains(controlled.EntityIndex));
|
||||
var visibleContacts = (controlled?.Contacts ?? Array.Empty<AetheriaRuntimeEntityContactCommit>())
|
||||
.Concat(dockParent?.Contacts ?? Array.Empty<AetheriaRuntimeEntityContactCommit>());
|
||||
var visibleEntityIndices = visibleContacts
|
||||
.Where(contact => contact != null && contact.Visible)
|
||||
.Select(contact => contact.TargetEntityIndex)
|
||||
.Append(controlled?.EntityIndex ?? -1)
|
||||
.ToHashSet();
|
||||
if (dockParent != null)
|
||||
visibleEntityIndices.Add(dockParent.EntityIndex);
|
||||
var entities = (zone?.Entities ?? Array.Empty<AetheriaRuntimeEntitySnapshotCommit>())
|
||||
.Where(entity => entity != null && visibleEntityIndices.Contains(entity.EntityIndex))
|
||||
.OrderBy(entity => entity.EntityIndex)
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ validation proves contract shape, not wiring, exclusivity, lowering, or parity.
|
|||
| Weapons | ServerShared behaviors + Unity effects | daemon plus Ymir geometry/kinematics | action capability, weapon state, shot/damage receipts | effects/audio/HUD | instant and constant resource/timing lifecycles are daemon-owned; charged weapons accept one semantic request, spool without requiring a solution, hold at full charge, commit automatically when a solution appears, and perform deterministic once-per-second malfunction hazard checks after the authored safe hold interval with increasing persisted risk; generic Eve `weapon.state` exposes charge hold/risk and feedback exposes readiness, commit, refusal, and malfunction chronology; committed direct damage now enters the shared daemon armor-cell transaction | guided persistent payloads, visibility/wear, remaining impact-distribution parity, and Unity effect reconciliation |
|
||||
| Destruction/drops | hull death, 25% equipment rolls, unconditional cargo drops, 25-unit launch, 30-second pickups | daemon | destruction identity, death/drop events, typed pickups | provider-advertised destruction effect and pickups | owner-exists; wired; exclusive; projected: direct and deployable lethal damage commit one deterministic destruction transaction, clear live references, retain only a non-rendered identity tombstone, and emit exact pickups/events; the reserved client `DestroyEntity` command is rejected; Aetheria advertises its original big explosion as `effect.feedback.entity.destroyed`, lowered generically by EveUnity | equipment-destruction-before-hull parity and multiplayer reconnect chronology |
|
||||
| Tractor/scoop | analog tractor and physical timed pickups | daemon + Ymir | tractor power, pickup body and receipt | pickup world entity plus beam/interaction feedback | fossil 2/s power ramp and authored forward radius/traction/distance feed pickup bodies into the shared Ymir world; shield contact collects exactly once when capacity permits or applies the fossil 25-unit rejection kick; 30s daemon lifetime; instant cargo teleport deleted; current-zone pickups now occupy ordinary rows in the shared Eve entity SoA body with stable logical pickup identity and the provider-owned pickup asset; the generic Unity witness sees a paused deterministic salvage pickup, flies through it, and observes daemon/Ymir removal | add generic tractor beam plus rejected-capacity feedback and cargo-delta assertion |
|
||||
| Dock/undock | wormhole-first interact; first eligible bay; component prerequisites | daemon + Ymir placement | dock commands/context | camera/UI transition | daemon path wired/projected; Ymir placement and parity unproven | priority, eligibility, placement and reconnect |
|
||||
| Dock/undock | wormhole-first interact; first eligible bay; component prerequisites | daemon + Ymir placement | dock commands/context | camera/UI transition | live generic Unity witness now proves advertised dock/undock actions, daemon bay assignment, dock-parent inclusion in the SoA view, station sensor-contact sharing, generic camera retargeting, controlled-subject hiding, movement suppression, and restoration on undock; the starter station and local raider form a deterministic Terminus departure proof | restore fossil component-prerequisite rejection reasons, exact undock placement, wormhole priority, reconnect, and docked inventory/trade surfaces |
|
||||
| Inventory/equipment | inventory panels + ServerShared | daemon | inventory/equipment surfaces | generic UI | owner-exists; wired/projected in fragments; not proven | all transfer directions and rejection |
|
||||
| Trade | trade UI/economy | daemon | stock, quote, purchase commands | generic UI | purchase owner wired/projected; not proven | atomic purchase and capacity |
|
||||
| Action bar/input | input shell and rebinding UI | daemon advertises actions; client owns bindings | input capability and action descriptors | universal binding UI | contracts wired; dynamic original behavior source absent | dynamic equipment/cargo actions |
|
||||
|
|
|
|||
|
|
@ -4,6 +4,13 @@ Baselines: RTS `d12d7c5c^`; ARPG `origin/master` at `ab2c2944`.
|
|||
|
||||
## Docking
|
||||
|
||||
While docked, a pilot shares the dock parent's sensor-derived contact set. This
|
||||
is not a special station-quality multiplier: stations can spend their greater
|
||||
size, mass, power, cooling, and equipment capacity on sensor apertures and
|
||||
support systems that ships cannot economically carry. The daemon unions the
|
||||
ship and dock-parent contact sets; Eve receives only the resulting authoritative
|
||||
visibility projection.
|
||||
|
||||
Contextual interact first considers a nearby wormhole, then docking. Docking is
|
||||
proximity-based, requires the ship to be unparented, iterates nearby entities,
|
||||
and uses the first bay accepting `TryDock`. Success changes zone/parent
|
||||
|
|
|
|||
Loading…
Reference in a new issue