@aephia/atlas-kit 0.6.0-next.71 → 0.6.0-next.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starbase-status.d.ts","sourceRoot":"","sources":["../../src/world/starbase-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ import { InvalidDerivationInputError, entityRef, } from '../client/index.js';
2
+ import { attachJsonSerialization } from '../internal/json.js';
3
+ import { attachReadMeta, readMeta } from '../internal/read-meta.js';
4
+ import { freezeResolvedSnapshot } from '../internal/resolved-snapshot.js';
5
+ import { resolveCargo, } from '../registry/index.js';
6
+ const STARBASE_LEVEL_INDEX = Object.freeze({
7
+ 'level-0': 0,
8
+ 'level-1': 1,
9
+ 'level-2': 2,
10
+ 'level-3': 3,
11
+ 'level-4': 4,
12
+ 'level-5': 5,
13
+ css: 6,
14
+ });
15
+ /** Returns the zero-based ordinal of a Starbase level label.
16
+ *
17
+ * Levels `level-0` through `level-5` map to 0 through 5 and the Central Space
18
+ * Station (`css`) ranks above them as 6. This is the row index used by Planet
19
+ * Claim Stake plot tables and Starbase Crafting Hab plot tables, and the order
20
+ * used to compare a Starbase level with a service enable level.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const unlocked = starbaseLevelIndex('level-3') >= starbaseLevelIndex('level-2');
25
+ * ```
26
+ */
27
+ export function starbaseLevelIndex(level) {
28
+ return STARBASE_LEVEL_INDEX[level];
29
+ }
30
+ function copyFixed(value) {
31
+ return { raw: value.raw, value: value.value };
32
+ }
33
+ function copyLevelInfo(info) {
34
+ return {
35
+ damagePerRound: info.damagePerRound,
36
+ hp: info.hp,
37
+ repairAbility: copyFixed(info.repairAbility),
38
+ repairCost: copyFixed(info.repairCost),
39
+ repairEfficiency: copyFixed(info.repairEfficiency),
40
+ repairFeeAtlas: info.repairFeeAtlas,
41
+ repairFeeRaw: info.repairFeeRaw,
42
+ repairRate: copyFixed(info.repairRate),
43
+ shieldBreakDelaySeconds: info.shieldBreakDelaySeconds,
44
+ shieldRechargeRate: copyFixed(info.shieldRechargeRate),
45
+ sp: info.sp,
46
+ xp: copyFixed(info.xp),
47
+ };
48
+ }
49
+ function serviceAvailability(levelIndex, enabledFromLevel) {
50
+ return {
51
+ available: levelIndex >= starbaseLevelIndex(enabledFromLevel),
52
+ enabledFromLevel,
53
+ };
54
+ }
55
+ function upgradeProgress(toLevel, upgrades) {
56
+ const materials = upgrades.map((upgrade) => {
57
+ const remaining = upgrade.needed > upgrade.deposited
58
+ ? upgrade.needed - upgrade.deposited
59
+ : 0n;
60
+ return {
61
+ cargoId: upgrade.cargoId,
62
+ complete: remaining === 0n,
63
+ crew: upgrade.crew,
64
+ deposited: upgrade.deposited,
65
+ durationSeconds: upgrade.durationSeconds,
66
+ needed: upgrade.needed,
67
+ remaining,
68
+ };
69
+ });
70
+ return {
71
+ complete: materials.every((material) => material.complete),
72
+ materials,
73
+ toLevel,
74
+ };
75
+ }
76
+ /** Derives the status of a shared Starbase from already-loaded StarSystem data.
77
+ *
78
+ * This is pure and network-free: it needs neither the context nor the Game
79
+ * definitions registry, so galaxy-map readers can call it on every System they
80
+ * already hold. The result is a new deeply frozen value; the input is left
81
+ * untouched. Materials carry numeric cargo ids; use `getStarbaseStatus` when
82
+ * you want them resolved to cargo definitions.
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * declare const system: StarSystemSnapshot;
87
+ * if (system.starbase !== undefined) {
88
+ * const status = deriveStarbaseStatus(system.starbase);
89
+ * console.log(status.level, status.upgrade?.toLevel);
90
+ * }
91
+ * ```
92
+ */
93
+ export function deriveStarbaseStatus(starbase) {
94
+ const levels = starbase.maxLevel.levels;
95
+ const position = levels.findIndex((entry) => entry.level === starbase.level);
96
+ if (position === -1) {
97
+ throw new InvalidDerivationInputError('Starbase level', starbase.level, `The nested Starbase reports level ${starbase.level}, but its ${starbase.maxLevel.kind} level table only describes ${levels.map((entry) => entry.level).join(', ')}. Refresh the StarSystem and verify the pinned binding version before deriving its status.`);
98
+ }
99
+ const current = levels[position];
100
+ const next = levels[position + 1];
101
+ const levelIndex = starbaseLevelIndex(starbase.level);
102
+ const upgrade = next === undefined
103
+ ? undefined
104
+ : upgradeProgress(next.level, current.upgrades);
105
+ return freezeResolvedSnapshot(attachJsonSerialization({
106
+ atMaxLevel: next === undefined,
107
+ current: {
108
+ hullPoints: starbase.hp,
109
+ maxHullPoints: current.info.hp,
110
+ maxShieldPoints: current.info.sp,
111
+ pendingHullPoints: starbase.pendingHp,
112
+ shieldPoints: starbase.sp,
113
+ },
114
+ kind: 'starbaseStatus',
115
+ level: starbase.level,
116
+ levelIndex,
117
+ levelInfo: copyLevelInfo(current.info),
118
+ maxLevel: starbase.maxLevel.kind,
119
+ owner: starbase.owner,
120
+ services: {
121
+ localMarket: serviceAvailability(levelIndex, starbase.localMarketEnableLevel),
122
+ repair: serviceAvailability(levelIndex, starbase.repairEnableLevel),
123
+ },
124
+ timing: {
125
+ builtOrDestroyedAtUnixSeconds: starbase.builtDestroyedAtUnixSeconds,
126
+ lastCombatUpdateAtUnixSeconds: starbase.lastCombatUpdateUnixSeconds,
127
+ shieldBreakDelayEndsAtUnixSeconds: starbase.shieldBreakDelayExpiresAtUnixSeconds,
128
+ },
129
+ ...(upgrade === undefined ? {} : { upgrade }),
130
+ }));
131
+ }
132
+ /** Builds the resolved status snapshot for a loaded StarSystem's Starbase. */
133
+ export async function createStarbaseStatusSnapshot(context, system, starbase) {
134
+ const { upgrade, ...status } = deriveStarbaseStatus(starbase);
135
+ const resolvedUpgrade = upgrade === undefined
136
+ ? undefined
137
+ : {
138
+ complete: upgrade.complete,
139
+ materials: await Promise.all(upgrade.materials.map(async (material) => ({
140
+ ...material,
141
+ cargo: await resolveCargo(context, material.cargoId),
142
+ }))),
143
+ toLevel: upgrade.toLevel,
144
+ };
145
+ return freezeResolvedSnapshot(attachReadMeta(attachJsonSerialization({
146
+ ...status,
147
+ address: system.address,
148
+ system: entityRef('starSystem', system.address),
149
+ systemName: system.name,
150
+ ...(resolvedUpgrade === undefined ? {} : { upgrade: resolvedUpgrade }),
151
+ }), readMeta(system)));
152
+ }
153
+ //# sourceMappingURL=starbase-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starbase-status.js","sourceRoot":"","sources":["../../src/world/starbase-status.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aephia/atlas-kit",
3
- "version": "0.6.0-next.71",
3
+ "version": "0.6.0-next.73",
4
4
  "description": "Community-maintained non-custodial TypeScript SDK for Star Atlas SAGE C4.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Aephia contributors",