@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.
- package/README.md +6 -4
- package/dist/agent/entity-views.d.ts.map +1 -1
- package/dist/agent/entity-views.js +14 -0
- package/dist/agent/entity-views.js.map +1 -1
- package/dist/agent/types.d.ts +39 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +11 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/game/gear.d.ts +6 -0
- package/dist/game/gear.d.ts.map +1 -1
- package/dist/game/gear.js +15 -3
- package/dist/game/gear.js.map +1 -1
- package/dist/game/obj-cmd.d.ts +19 -0
- package/dist/game/obj-cmd.d.ts.map +1 -1
- package/dist/game/obj-cmd.js +32 -2
- package/dist/game/obj-cmd.js.map +1 -1
- package/dist/game/wizard.d.ts +1 -1
- package/dist/game/wizard.js +1 -1
- package/dist/mod/hooks.d.ts +57 -6
- package/dist/mod/hooks.d.ts.map +1 -1
- package/dist/mod/hooks.js +39 -0
- package/dist/mod/hooks.js.map +1 -1
- package/dist/mod/save-blocks.d.ts +1 -1
- package/dist/mod/save-blocks.d.ts.map +1 -1
- package/dist/mon/bind.d.ts +17 -0
- package/dist/mon/bind.d.ts.map +1 -1
- package/dist/mon/bind.js +115 -8
- package/dist/mon/bind.js.map +1 -1
- package/dist/obj/bind.d.ts.map +1 -1
- package/dist/obj/bind.js +63 -10
- package/dist/obj/bind.js.map +1 -1
- package/dist/rng.d.ts +1 -1
- package/dist/rng.js +1 -1
- package/dist/session/game.d.ts.map +1 -1
- package/dist/session/game.js +8 -0
- package/dist/session/game.js.map +1 -1
- package/dist/store/bind.d.ts +1 -1
- package/dist/store/bind.d.ts.map +1 -1
- package/dist/store/bind.js +39 -5
- package/dist/store/bind.js.map +1 -1
- package/dist/version.d.ts +9 -8
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +9 -8
- package/dist/version.js.map +1 -1
- package/dist/world/feature.d.ts +6 -0
- package/dist/world/feature.d.ts.map +1 -1
- package/dist/world/feature.js +43 -7
- package/dist/world/feature.js.map +1 -1
- package/package.json +1 -1
- package/src/agent/entity-views.ts +14 -0
- package/src/agent/types.ts +39 -1
- package/src/game/gear.ts +22 -3
- package/src/game/obj-cmd.ts +47 -2
- package/src/game/wizard.ts +1 -1
- package/src/mod/hooks.ts +105 -6
- package/src/mon/bind.ts +129 -10
- package/src/obj/bind.ts +63 -9
- package/src/rng.ts +1 -1
- package/src/session/game.ts +8 -0
- package/src/store/bind.ts +39 -7
- package/src/version.ts +9 -8
- package/src/world/feature.ts +44 -6
package/dist/store/bind.js
CHANGED
|
@@ -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
|
package/dist/store/bind.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bind.js","sourceRoot":"","sources":["../../src/store/bind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAoB3D;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC;AAKnB;;;;;;;;GAQG;AACH,SAAS,WAAW,CAAC,IAAmB,EAAE,GAAgB;IACxD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IAC1D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,EAAE,GAAG,EAAE,eAAe,IAAI,CAAC,IAAI,gBAAgB,EAAE,CAAC;IAC3D,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IACvE,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,GAAG,EAAE,WAAW,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IAC/D,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,QAAQ,CAAC,KAAiB;IACjC,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,wBAAwB,CAAC;IACvD,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,wBAAwB,CAAC;IACrD,OAAO,GAAG,KAAK,qBAAqB,CAAC;AACvC,CAAC;AAKD;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,KAAmB;IACrC,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5D,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,oBAAoB,IAAI,EAAE,EAAE,CAAC;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI;QAAE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;IAChF,MAAM,IAAI,GAAI,EAA6B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,EAAE,oBAAoB,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;IACzE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;AACjC,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,SAAS,CACvB,GAAoB,EACpB,GAAgB,EAChB,OAAyB;IAEzB,MAAM,
|
|
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
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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
|
|
22
|
-
* by digest in a catalogue and
|
|
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.
|
|
25
|
+
export declare const ENGINE_VERSION = "1.0.0";
|
|
25
26
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.d.ts.map
CHANGED
|
@@ -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
|
|
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
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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
|
|
22
|
-
* by digest in a catalogue and
|
|
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.
|
|
25
|
+
export const ENGINE_VERSION = "1.0.0";
|
|
25
26
|
//# sourceMappingURL=version.js.map
|
package/dist/version.js.map
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/world/feature.d.ts
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"feature.d.ts","sourceRoot":"","sources":["../../src/world/feature.ts"],"names":[],"mappings":"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"}
|
package/dist/world/feature.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,eAAe,EAAE,oBAAoB,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAE5F,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"feature.js","sourceRoot":"","sources":["../../src/world/feature.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -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,
|
package/src/agent/types.ts
CHANGED
|
@@ -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.
|
|
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
|
-
/*
|
|
988
|
-
|
|
989
|
-
|
|
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
|
}
|
package/src/game/obj-cmd.ts
CHANGED
|
@@ -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
|
-
: (
|
|
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
|
package/src/game/wizard.ts
CHANGED
|
@@ -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.
|
|
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.
|