@rpgm-tools/neo-angband-core 0.34.2 → 1.0.0

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.
Files changed (62) hide show
  1. package/README.md +6 -4
  2. package/dist/agent/entity-views.d.ts.map +1 -1
  3. package/dist/agent/entity-views.js +14 -0
  4. package/dist/agent/entity-views.js.map +1 -1
  5. package/dist/agent/types.d.ts +39 -1
  6. package/dist/agent/types.d.ts.map +1 -1
  7. package/dist/agent/types.js +11 -1
  8. package/dist/agent/types.js.map +1 -1
  9. package/dist/game/gear.d.ts +6 -0
  10. package/dist/game/gear.d.ts.map +1 -1
  11. package/dist/game/gear.js +15 -3
  12. package/dist/game/gear.js.map +1 -1
  13. package/dist/game/obj-cmd.d.ts +19 -0
  14. package/dist/game/obj-cmd.d.ts.map +1 -1
  15. package/dist/game/obj-cmd.js +32 -2
  16. package/dist/game/obj-cmd.js.map +1 -1
  17. package/dist/game/wizard.d.ts +1 -1
  18. package/dist/game/wizard.js +1 -1
  19. package/dist/mod/hooks.d.ts +57 -6
  20. package/dist/mod/hooks.d.ts.map +1 -1
  21. package/dist/mod/hooks.js +39 -0
  22. package/dist/mod/hooks.js.map +1 -1
  23. package/dist/mod/save-blocks.d.ts +1 -1
  24. package/dist/mod/save-blocks.d.ts.map +1 -1
  25. package/dist/mon/bind.d.ts +17 -0
  26. package/dist/mon/bind.d.ts.map +1 -1
  27. package/dist/mon/bind.js +115 -8
  28. package/dist/mon/bind.js.map +1 -1
  29. package/dist/obj/bind.d.ts.map +1 -1
  30. package/dist/obj/bind.js +63 -10
  31. package/dist/obj/bind.js.map +1 -1
  32. package/dist/rng.d.ts +1 -1
  33. package/dist/rng.js +1 -1
  34. package/dist/session/game.d.ts.map +1 -1
  35. package/dist/session/game.js +8 -0
  36. package/dist/session/game.js.map +1 -1
  37. package/dist/store/bind.d.ts +1 -1
  38. package/dist/store/bind.d.ts.map +1 -1
  39. package/dist/store/bind.js +39 -5
  40. package/dist/store/bind.js.map +1 -1
  41. package/dist/version.d.ts +9 -8
  42. package/dist/version.d.ts.map +1 -1
  43. package/dist/version.js +9 -8
  44. package/dist/version.js.map +1 -1
  45. package/dist/world/feature.d.ts +6 -0
  46. package/dist/world/feature.d.ts.map +1 -1
  47. package/dist/world/feature.js +43 -7
  48. package/dist/world/feature.js.map +1 -1
  49. package/package.json +1 -1
  50. package/src/agent/entity-views.ts +14 -0
  51. package/src/agent/types.ts +39 -1
  52. package/src/game/gear.ts +22 -3
  53. package/src/game/obj-cmd.ts +47 -2
  54. package/src/game/wizard.ts +1 -1
  55. package/src/mod/hooks.ts +105 -6
  56. package/src/mon/bind.ts +129 -10
  57. package/src/obj/bind.ts +63 -9
  58. package/src/rng.ts +1 -1
  59. package/src/session/game.ts +8 -0
  60. package/src/store/bind.ts +39 -7
  61. package/src/version.ts +9 -8
  62. package/src/world/feature.ts +44 -6
@@ -88,6 +88,8 @@ function lostWhat(field) {
88
88
  return "shop cannot be entered";
89
89
  if (field === "buy")
90
90
  return "buy list entry dropped";
91
+ if (field === "owner")
92
+ return "owner list dropped";
91
93
  return `${field} stock line dropped`;
92
94
  }
93
95
  /**
@@ -130,11 +132,6 @@ function resolveBuy(entry) {
130
132
  * `StoreRegistry` is the caller that keeps the list for the host to report.
131
133
  */
132
134
  export function bindStore(rec, reg, refused) {
133
- const owners = rec.owner.map((o, index) => ({
134
- index,
135
- name: o.name,
136
- maxCost: o.purse,
137
- }));
138
135
  const from = provenanceOf(rec);
139
136
  /** One refusal for this record, so four call sites cannot disagree. */
140
137
  const refusal = (field, why, id, prov) => ({
@@ -144,6 +141,43 @@ export function bindStore(rec, reg, refused) {
144
141
  id,
145
142
  why: refusalWhy(rec.store, lostWhat(field), why, prov),
146
143
  });
144
+ /*
145
+ * `owner:` IS A REQUIRED LIST, and unlike every other field this binder
146
+ * refuses, nothing inside it names another record - MOD_COMPATIBILITY.md
147
+ * already says as much: "the owner list resolves no names at all and so has
148
+ * nothing to refuse". What that line did not cover is the field going
149
+ * missing ENTIRELY. `replaces` on a record a mod owns can legitimately drop
150
+ * fields the replacing body means to remove - that is how a total
151
+ * conversion works, and composeContentPacks's own shape guard
152
+ * (mod-sdk/compose.ts, `unreadableShape`) deliberately does not restore a
153
+ * field that is simply ABSENT, because "gone" and "total conversion left it
154
+ * out on purpose" are indistinguishable from the composer's side. So a
155
+ * `replaces` body that forgets `owner:` on a record a mod owns reaches this
156
+ * line with `rec.owner` undefined, and `rec.owner.map` was a bare
157
+ * TypeError with no pack named - the same crash this file exists to close,
158
+ * one field up from a stock line.
159
+ *
160
+ * AN EMPTY OWNER LIST IS THE SIZE OF THE DROP: the store keeps functioning
161
+ * (turnover, stock, buy) with nobody to haggle against, which is a strictly
162
+ * smaller loss than the shop vanishing or the boot failing.
163
+ */
164
+ const ownerRecords = Array.isArray(rec.owner) ? rec.owner : null;
165
+ let owners;
166
+ if (ownerRecords) {
167
+ owners = ownerRecords.map((o, index) => ({
168
+ index,
169
+ name: o.name,
170
+ maxCost: o.purse,
171
+ }));
172
+ }
173
+ else {
174
+ const owner = fieldOwner(from, "owner", rec.owner);
175
+ if (owner === null || from === undefined) {
176
+ throw new Error(`store: ${rec.store}: owner is missing or not a list`);
177
+ }
178
+ refused?.push(refusal("owner", "owner list missing or not a list", owner, from));
179
+ owners = [];
180
+ }
147
181
  /**
148
182
  * One stock line, or null when it resolved to nothing and was a mod's to get
149
183
  * wrong. A core-owned miss throws here with exactly the message it always
@@ -1 +1 @@
1
- {"version":3,"file":"bind.js","sourceRoot":"","sources":["../../src/store/bind.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bind.js","sourceRoot":"","sources":["../../src/store/bind.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -11,15 +11,16 @@ export declare const PARITY_BASELINE = "4.2.6";
11
11
  /**
12
12
  * Port version, tracked independently of the baseline.
13
13
  *
14
- * Semver, and 0.x is the pre-release line: a feature release bumps the MINOR
15
- * number, so 0.9.0 is followed by 0.10.0 rather than by 1.0.0. That is worth
16
- * stating because the first reading of "0.9.0" is "nearly 1.0", and it is not -
17
- * 1.0.0 is reserved for the public release and the line can run as far as it needs
18
- * to before then.
14
+ * Standard Semantic Versioning as of 1.0.0, the public release: a breaking
15
+ * change to the API, save format, or mod interfaces is a MAJOR bump, a
16
+ * backward-compatible feature is MINOR, and a fix is PATCH. Before this,
17
+ * `0.x` was the pre-release line, where every feature release bumped the
18
+ * MINOR number instead (0.9.0 was followed by 0.10.0 rather than 1.0.0).
19
19
  *
20
20
  * Each mod carries its own version and moves on its own schedule; a mod whose
21
- * released tag is iterated takes a MINOR bump, because a published tag is pinned
22
- * by digest in a catalogue and must never be moved.
21
+ * released tag needs to be superseded takes whatever bump its actual change
22
+ * warrants, because a published tag is pinned by digest in a catalogue and
23
+ * must never be moved.
23
24
  */
24
- export declare const ENGINE_VERSION = "0.34.2";
25
+ export declare const ENGINE_VERSION = "1.0.0";
25
26
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,sDAAsD;AACtD,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,sDAAsD;AACtD,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,UAAU,CAAC"}
package/dist/version.js CHANGED
@@ -11,15 +11,16 @@ export const PARITY_BASELINE = "4.2.6";
11
11
  /**
12
12
  * Port version, tracked independently of the baseline.
13
13
  *
14
- * Semver, and 0.x is the pre-release line: a feature release bumps the MINOR
15
- * number, so 0.9.0 is followed by 0.10.0 rather than by 1.0.0. That is worth
16
- * stating because the first reading of "0.9.0" is "nearly 1.0", and it is not -
17
- * 1.0.0 is reserved for the public release and the line can run as far as it needs
18
- * to before then.
14
+ * Standard Semantic Versioning as of 1.0.0, the public release: a breaking
15
+ * change to the API, save format, or mod interfaces is a MAJOR bump, a
16
+ * backward-compatible feature is MINOR, and a fix is PATCH. Before this,
17
+ * `0.x` was the pre-release line, where every feature release bumped the
18
+ * MINOR number instead (0.9.0 was followed by 0.10.0 rather than 1.0.0).
19
19
  *
20
20
  * Each mod carries its own version and moves on its own schedule; a mod whose
21
- * released tag is iterated takes a MINOR bump, because a published tag is pinned
22
- * by digest in a catalogue and must never be moved.
21
+ * released tag needs to be superseded takes whatever bump its actual change
22
+ * warrants, because a published tag is pinned by digest in a catalogue and
23
+ * must never be moved.
23
24
  */
24
- export const ENGINE_VERSION = "0.34.2";
25
+ export const ENGINE_VERSION = "1.0.0";
25
26
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,sDAAsD;AACtD,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC;AAEvC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,sDAAsD;AACtD,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC;AAEvC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC"}
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { FlagSet } from "../bitflag.js";
10
10
  import type { ModExtensible } from "../mod/extension.js";
11
+ import type { RecordRefusal } from "../mod/refusal.js";
11
12
  /** Byte size of a terrain FlagSet (upstream TF_SIZE). */
12
13
  export declare const TF_SIZE: number;
13
14
  export interface Feature extends ModExtensible {
@@ -76,6 +77,11 @@ export declare class FeatureRegistry {
76
77
  private byName;
77
78
  /** fidx of each shop entrance, indexed by store number (shopnum - 1). */
78
79
  private shopFeatIdx;
80
+ /**
81
+ * Mod-owned terrain records whose `mimic:` named a feature that does not
82
+ * resolve. Empty for the shipped pack with no mods loaded.
83
+ */
84
+ readonly refused: RecordRefusal[];
79
85
  constructor(records: TerrainRecordJson[]);
80
86
  get(fidx: number): Feature;
81
87
  byCodeName(code: string): Feature;
@@ -1 +1 @@
1
- {"version":3,"file":"feature.d.ts","sourceRoot":"","sources":["../../src/world/feature.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,yDAAyD;AACzD,eAAO,MAAM,OAAO,QAA6C,CAAC;AAElE,MAAM,WAAW,OAAQ,SAAQ,aAAa;IAC5C,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,8CAA8C;AAC9C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAM1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAuED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,MAAM,CAA8B;IAC5C,yEAAyE;IACzE,OAAO,CAAC,WAAW,CAAgB;gBAEvB,OAAO,EAAE,iBAAiB,EAAE;IA6DxC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAM1B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAMjC,4EAA4E;IAC5E,WAAW,IAAI,OAAO,EAAE;IAIxB,+DAA+D;IAC/D,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAI1C;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAI1C,KAAK,IAAI,MAAM;IAIf;;;OAGG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;;;OAIG;IACH,SAAS,IAAI,SAAS,MAAM,EAAE;IAI9B,uEAAuE;IACvE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;CAG3C"}
1
+ {"version":3,"file":"feature.d.ts","sourceRoot":"","sources":["../../src/world/feature.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,8 @@
8
8
  */
9
9
  import { FlagSet } from "../bitflag.js";
10
10
  import { FEAT, RF, TERRAIN_ENTRIES, TERRAIN_FLAG_ENTRIES, TF } from "../generated/index.js";
11
- import { attachExt } from "../mod/extension.js";
11
+ import { attachExt, provenanceOf } from "../mod/extension.js";
12
+ import { fieldOwner, refusalWhy } from "../mod/refusal.js";
12
13
  /** Byte size of a terrain FlagSet (upstream TF_SIZE). */
13
14
  export const TF_SIZE = Math.ceil(TERRAIN_FLAG_ENTRIES.length / 8);
14
15
  function parseFlagNames(lines) {
@@ -87,6 +88,11 @@ export class FeatureRegistry {
87
88
  byName = new Map();
88
89
  /** fidx of each shop entrance, indexed by store number (shopnum - 1). */
89
90
  shopFeatIdx = [];
91
+ /**
92
+ * Mod-owned terrain records whose `mimic:` named a feature that does not
93
+ * resolve. Empty for the shipped pack with no mods loaded.
94
+ */
95
+ refused = [];
90
96
  constructor(records) {
91
97
  const featMap = FEAT;
92
98
  for (const rec of records) {
@@ -120,15 +126,45 @@ export class FeatureRegistry {
120
126
  this.byCode.set(rec.code, feature);
121
127
  this.byName.set(rec.name, feature);
122
128
  }
123
- // Second pass: resolve mimic references by code.
129
+ /*
130
+ * Second pass: resolve mimic references by code.
131
+ *
132
+ * `mimic:` NAMES ANOTHER TERRAIN RECORD, and a mod's terrain.json entries
133
+ * are exactly the mod-appendable list `code:` and every other lookup here
134
+ * cannot be: FEAT codes are the fixed table list-terrain.h compiles, so a
135
+ * mod cannot invent a new one, but it CAN patch an existing feature's
136
+ * `mimic:` to point at a feature a sibling mod supplies - the same
137
+ * "mod A depends on mod B, player disables mod B" shape the store and ego
138
+ * binders already answer. This used to throw `terrain: mimic not found`
139
+ * out of `bindCore` for the whole game over one feature's display alias.
140
+ *
141
+ * LOSING THE MIMIC IS THE SIZE OF THE DROP, matching the store binder's
142
+ * entrance-feature case: `mimic` is a scalar (one feature, or none), so
143
+ * there is no smaller unit to drop than the field itself, and the record
144
+ * survives exactly as it would if `mimic:` had never been written -
145
+ * displayed with its own glyph rather than the target's.
146
+ */
124
147
  for (const rec of records) {
125
- if (rec.mimic !== undefined) {
126
- const f = this.byCode.get(rec.code);
127
- const target = this.byCode.get(rec.mimic);
128
- if (!target)
129
- throw new Error(`terrain: mimic not found: ${rec.mimic}`);
148
+ if (rec.mimic === undefined)
149
+ continue;
150
+ const f = this.byCode.get(rec.code);
151
+ const target = this.byCode.get(rec.mimic);
152
+ if (target) {
130
153
  f.mimic = target.fidx;
154
+ continue;
155
+ }
156
+ const from = provenanceOf(rec);
157
+ const owner = fieldOwner(from, "mimic", rec.mimic);
158
+ if (owner === null || from === undefined) {
159
+ throw new Error(`terrain: mimic not found: ${rec.mimic}`);
131
160
  }
161
+ this.refused.push({
162
+ file: "terrain",
163
+ record: rec.code,
164
+ field: "mimic",
165
+ id: owner,
166
+ why: refusalWhy(rec.code, "mimic dropped", `mimic not found: ${rec.mimic}`, from),
167
+ });
132
168
  }
133
169
  /*
134
170
  * finish_parse_feat (init.c L2249-2257, L2275): "Assign shop index based
@@ -1 +1 @@
1
- {"version":3,"file":"feature.js","sourceRoot":"","sources":["../../src/world/feature.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feature.js","sourceRoot":"","sources":["../../src/world/feature.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpgm-tools/neo-angband-core",
3
- "version": "0.34.2",
3
+ "version": "1.0.0",
4
4
  "description": "Headless Neo Angband game engine: rules, world, entities, effects, generation",
5
5
  "license": "GPL-2.0-only",
6
6
  "author": "neostryder (RPGM Tools)",
@@ -226,6 +226,20 @@ export function playerViewFor(
226
226
  stun: p.timed[TMD.STUN] ?? 0,
227
227
  paralyzed: p.timed[TMD.PARALYZED] ?? 0,
228
228
  food: p.timed[TMD.FOOD] ?? 0,
229
+ fast: p.timed[TMD.FAST] ?? 0,
230
+ sprint: p.timed[TMD.SPRINT] ?? 0,
231
+ protEvil: p.timed[TMD.PROTEVIL] ?? 0,
232
+ hero: p.timed[TMD.HERO] ?? 0,
233
+ shero: p.timed[TMD.SHERO] ?? 0,
234
+ shield: p.timed[TMD.SHIELD] ?? 0,
235
+ stoneskin: p.timed[TMD.STONESKIN] ?? 0,
236
+ blessed: p.timed[TMD.BLESSED] ?? 0,
237
+ fastcast: p.timed[TMD.FASTCAST] ?? 0,
238
+ resAcid: p.timed[TMD.OPP_ACID] ?? 0,
239
+ resElec: p.timed[TMD.OPP_ELEC] ?? 0,
240
+ resFire: p.timed[TMD.OPP_FIRE] ?? 0,
241
+ resCold: p.timed[TMD.OPP_COLD] ?? 0,
242
+ resPois: p.timed[TMD.OPP_POIS] ?? 0,
229
243
  },
230
244
  dead: state.isDead,
231
245
  winner: p.totalWinner,
@@ -63,8 +63,18 @@ import type { ObjectKind } from "../obj/types.js";
63
63
  * skills but no way to answer "does this class have flag X" (issue #34: the
64
64
  * Borg's `borg_check_rest` needs PF_COMBAT_REGEN), which is class-definition
65
65
  * data rather than anything derivable from gear or level. Purely additive.
66
+ *
67
+ * 1.4.0 (2026-08-26): `PlayerStatusView`'s thirteen buff-timer fields (fast,
68
+ * sprint, protEvil, hero, shero, shield, stoneskin, blessed, fastcast,
69
+ * resAcid, resElec, resFire, resCold, resPois). Added because the view
70
+ * exposed the eight negative afflictions upstream's own buff-timer
71
+ * cross-check (`borg-trait.c:3010`) reads player->timed[] against, but none
72
+ * of the buffs it also reads - so a mod tracking its own buffs from game
73
+ * messages (neostryder/neo-angband-mod-borg#32) had no engine state to
74
+ * cross-check against and could only trust its own bookkeeping. Purely
75
+ * additive.
66
76
  */
67
- export const AGENT_API_VERSION = "1.3.0";
77
+ export const AGENT_API_VERSION = "1.4.0";
68
78
 
69
79
  /**
70
80
  * A command an agent emits - identical to the engine's PlayerCommand (codes 1:1
@@ -128,6 +138,34 @@ export interface PlayerStatusView {
128
138
  paralyzed: number;
129
139
  /** food store (p->timed[TMD_FOOD]). */
130
140
  food: number;
141
+ /** Haste (p->timed[TMD_FAST]). */
142
+ fast: number;
143
+ /** The Ranger/Rogue sprint effect (p->timed[TMD_SPRINT]); upstream ORs this with `fast`. */
144
+ sprint: number;
145
+ /** Protection from evil (p->timed[TMD_PROTEVIL]). */
146
+ protEvil: number;
147
+ /** Heroism (p->timed[TMD_HERO]). */
148
+ hero: number;
149
+ /** Berserker strength (p->timed[TMD_SHERO]). */
150
+ shero: number;
151
+ /** Mystic shield (p->timed[TMD_SHIELD]). */
152
+ shield: number;
153
+ /** Stoneskin (p->timed[TMD_STONESKIN]); upstream ORs this with `shield`. */
154
+ stoneskin: number;
155
+ /** Blessed (p->timed[TMD_BLESSED]). */
156
+ blessed: number;
157
+ /** Fast spellcasting (p->timed[TMD_FASTCAST]). */
158
+ fastcast: number;
159
+ /** Temporary acid resistance (p->timed[TMD_OPP_ACID]). */
160
+ resAcid: number;
161
+ /** Temporary lightning resistance (p->timed[TMD_OPP_ELEC]). */
162
+ resElec: number;
163
+ /** Temporary fire resistance (p->timed[TMD_OPP_FIRE]). */
164
+ resFire: number;
165
+ /** Temporary cold resistance (p->timed[TMD_OPP_COLD]). */
166
+ resCold: number;
167
+ /** Temporary poison resistance (p->timed[TMD_OPP_POIS]). */
168
+ resPois: number;
131
169
  }
132
170
 
133
171
  /** A read-only view of the player (BORG_AS_MOD section 3, Player). */
package/src/game/gear.ts CHANGED
@@ -742,6 +742,12 @@ export interface CalcInventoryOpts extends EarlierObjectOpts {
742
742
  isEquipped?: (handle: number) => boolean;
743
743
  /** msg(): the re-arrange / combine notices. */
744
744
  msg?: (text: string) => void;
745
+ /**
746
+ * The mod behaviour seam (mod/hooks.ts), threaded so combinePack can offer
747
+ * its partialStackMerge extension point. Absent => combinePack is faithful
748
+ * 4.2.6.
749
+ */
750
+ hooks?: import("../mod/hooks.js").ModHooks | undefined;
745
751
  }
746
752
 
747
753
  /** Build EarlierObjectOpts (ammo tiebreak) from the calc-inventory opts. */
@@ -984,9 +990,22 @@ export function combinePack(
984
990
 
985
991
  const mode1 = objectIsInQuiver(gear, h1) ? OSTACK_QUIVER : OSTACK_PACK;
986
992
  if (invenCanStackPartial(gear, obj2, obj1, mode2, mode1, constants)) {
987
- /* Shuffling items between stacks - no message (L1282-1287). */
988
- objectAbsorbPartial(obj2, obj1, mode2, mode1, limits, ORIGIN.MIXED);
989
- break;
993
+ /* The partialStackMerge seam (mod/hooks.ts): obj1 (h1) is the stack
994
+ * object_absorb_partial drains (its own obj2 parameter - see that
995
+ * function's L1258 call below) to top up obj2 (h2), the leading stack.
996
+ * Entry 3 / #115's residual bug lives ONLY in the non-quiver branch of
997
+ * object_absorb_partial, so the hook is consulted only there - the
998
+ * quiver's own limits and split-on-overflow arithmetic are untouched.
999
+ * Faithful core (no hook, or a permissive one) proceeds unconditionally,
1000
+ * matching upstream's inven_can_stack_partial, which has no such check. */
1001
+ const nonQuiver = !(mode1 & OSTACK_QUIVER) && !(mode2 & OSTACK_QUIVER);
1002
+ const refused =
1003
+ nonQuiver && opts.hooks?.partialStackMerge?.(obj1, obj2) === false;
1004
+ if (!refused) {
1005
+ /* Shuffling items between stacks - no message (L1282-1287). */
1006
+ objectAbsorbPartial(obj2, obj1, mode2, mode1, limits, ORIGIN.MIXED);
1007
+ break;
1008
+ }
990
1009
  }
991
1010
  }
992
1011
  }
@@ -191,6 +191,10 @@ function calcInvOpts(state: GameState, deps: ObjCmdDeps): CalcInventoryOpts {
191
191
  const at = deps.ammoTval?.() ?? state.playerState?.ammoTval;
192
192
  if (at !== undefined) o.ammoTval = at;
193
193
  if (deps.objectValue) o.objectValue = deps.objectValue;
194
+ /* The mod behaviour seam (mod/hooks.ts), so combinePack's partialStackMerge
195
+ * extension point is reachable from every wield/takeoff/drop call site that
196
+ * routes its tail through this options bag. */
197
+ if (state.modHooks) o.hooks = state.modHooks;
194
198
  return o;
195
199
  }
196
200
 
@@ -203,6 +207,12 @@ function packOpts(state: GameState, deps: ObjCmdDeps): PackOverflowOpts {
203
207
  const o: PackOverflowOpts = { calcInv: calcInvOpts(state, deps) };
204
208
  if (deps.env?.msg) o.msg = deps.env.msg;
205
209
  if (deps.floorEnv) o.floorEnv = deps.floorEnv;
210
+ /* The mod behaviour seam (mod/hooks.ts), so packOverflow's packOverflowVictim
211
+ * extension point is reachable here too. These call sites always pass an
212
+ * explicit handle, so the hook is never actually consulted from them (see
213
+ * packOverflow's handle === 0 gate) - carried through anyway so a caller that
214
+ * starts passing 0 does not silently lose the seam. */
215
+ if (state.modHooks) o.hooks = state.modHooks;
206
216
  return o;
207
217
  }
208
218
 
@@ -245,6 +255,20 @@ export interface PackOverflowOpts {
245
255
  calcInv?: CalcInventoryOpts;
246
256
  /** drop_near seams (isTrap / onDrop / onBreak) for the overflowed item. */
247
257
  floorEnv?: FloorEnv;
258
+ /**
259
+ * The mod behaviour seam (mod/hooks.ts), threaded so packOverflow can offer
260
+ * its packOverflowVictim extension point. Absent => packOverflow is faithful
261
+ * 4.2.6.
262
+ */
263
+ hooks?: import("../mod/hooks.js").ModHooks | undefined;
264
+ /**
265
+ * GameState.gear.quiver as it stood immediately before the calc_inventory
266
+ * recompute that precedes this call - only meaningful (and only read) on the
267
+ * `handle === 0` / upstream-NULL path, where packOverflowVictim uses it to
268
+ * name the item that just left the quiver. Absent on every call that passes
269
+ * an explicit handle, and on any handle===0 caller that has not captured one.
270
+ */
271
+ previousQuiver?: readonly number[] | undefined;
248
272
  }
249
273
 
250
274
  /** The subset of z_info pack_overflow and its calc_inventory refresh read. */
@@ -274,6 +298,11 @@ function overflowCalcInv(opts: PackOverflowOpts): CalcInventoryOpts {
274
298
  * For the NULL case, upkeep->inven[] is represented by the derived,
275
299
  * earlier_object-sorted gear.inven view (player-calcs.c:1191-1222); gear.pack
276
300
  * remains the raw master-gear order and must not select the victim.
301
+ *
302
+ * The NULL case also consults the packOverflowVictim seam (mod/hooks.ts) via
303
+ * `opts.hooks` / `opts.previousQuiver`; see that member's doc for the fact it
304
+ * hands over and what a mod may do with it. Faithful core (no hook) sheds the
305
+ * trailing inven[] entry exactly as upstream does.
277
306
  */
278
307
  export function packOverflow(
279
308
  state: GameState,
@@ -291,11 +320,27 @@ export function packOverflow(
291
320
  /* Warning (L1356). */
292
321
  opts.msg?.("Your pack overflows!");
293
322
 
294
- /* Drop the last inventory item unless requested otherwise (L1359-1366). */
323
+ /* Drop the last inventory item unless requested otherwise (L1359-1366).
324
+ * The packOverflowVictim seam (mod/hooks.ts) only applies to the NULL
325
+ * case - a caller that already knows its victim (wield/takeoff) is never
326
+ * second-guessed. `departedQuiver` is core's own computed fact: the one
327
+ * handle `opts.previousQuiver` held that GameState.gear.quiver no longer
328
+ * does, i.e. whatever the calc_inventory recompute just before this call
329
+ * displaced out of the quiver. A mod may redirect to it, or to any other
330
+ * handle it prefers; declining (null, or no hook at all) falls back to the
331
+ * faithful trailing-inven[]-entry selection. */
332
+ const departedQuiver: number | null =
333
+ handle === 0 && opts.previousQuiver
334
+ ? (opts.previousQuiver.find(
335
+ (h) => h !== 0 && !(state.gear.quiver ?? []).includes(h),
336
+ ) ?? null)
337
+ : null;
295
338
  const victim =
296
339
  handle !== 0
297
340
  ? handle
298
- : (state.gear.inven?.[state.gear.inven.length - 1] ?? 0);
341
+ : (opts.hooks?.packOverflowVictim?.(state, departedQuiver) ??
342
+ state.gear.inven?.[state.gear.inven.length - 1] ??
343
+ 0);
299
344
  const obj = gearGet(state.gear, victim);
300
345
  /* Upstream asserts obj != NULL here (L1369). The port can reach a stale
301
346
  * handle where upstream reads freed memory: combine_pack (which runs just
@@ -265,7 +265,7 @@ export const NOSCORE = {
265
265
  * branch when SCORE_BORGS is defined), so the port records the configuration it
266
266
  * builds under as named constants instead of leaving the choice implicit.
267
267
  *
268
- * ALLOW_BORG: true. The Borg ships as a bundled mod (decision 31), so the bit
268
+ * ALLOW_BORG: true. Borg ships as a bundled mod (decision 31), so the bit
269
269
  * exists and can be set.
270
270
  * SCORE_BORGS: false, matching upstream's default - a borg-played character is
271
271
  * not eligible for the high-score table.