@ticktockbent/rogue-ts 0.1.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/LICENSE +21 -0
- package/README.md +175 -0
- package/dist/armor.d.ts +18 -0
- package/dist/armor.d.ts.map +1 -0
- package/dist/armor.js +84 -0
- package/dist/armor.js.map +1 -0
- package/dist/chase.d.ts +15 -0
- package/dist/chase.d.ts.map +1 -0
- package/dist/chase.js +152 -0
- package/dist/chase.js.map +1 -0
- package/dist/command.d.ts +12 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/command.js +761 -0
- package/dist/command.js.map +1 -0
- package/dist/curses.d.ts +102 -0
- package/dist/curses.d.ts.map +1 -0
- package/dist/curses.js +47 -0
- package/dist/curses.js.map +1 -0
- package/dist/daemon.d.ts +43 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +116 -0
- package/dist/daemon.js.map +1 -0
- package/dist/daemons.d.ts +47 -0
- package/dist/daemons.d.ts.map +1 -0
- package/dist/daemons.js +194 -0
- package/dist/daemons.js.map +1 -0
- package/dist/fight.d.ts +52 -0
- package/dist/fight.d.ts.map +1 -0
- package/dist/fight.js +508 -0
- package/dist/fight.js.map +1 -0
- package/dist/globals.d.ts +387 -0
- package/dist/globals.d.ts.map +1 -0
- package/dist/globals.js +935 -0
- package/dist/globals.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +30 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +159 -0
- package/dist/init.js.map +1 -0
- package/dist/io.d.ts +48 -0
- package/dist/io.d.ts.map +1 -0
- package/dist/io.js +248 -0
- package/dist/io.js.map +1 -0
- package/dist/list.d.ts +37 -0
- package/dist/list.d.ts.map +1 -0
- package/dist/list.js +109 -0
- package/dist/list.js.map +1 -0
- package/dist/main.d.ts +23 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +207 -0
- package/dist/main.js.map +1 -0
- package/dist/misc.d.ts +53 -0
- package/dist/misc.d.ts.map +1 -0
- package/dist/misc.js +296 -0
- package/dist/misc.js.map +1 -0
- package/dist/monsters.d.ts +55 -0
- package/dist/monsters.d.ts.map +1 -0
- package/dist/monsters.js +211 -0
- package/dist/monsters.js.map +1 -0
- package/dist/move.d.ts +23 -0
- package/dist/move.d.ts.map +1 -0
- package/dist/move.js +270 -0
- package/dist/move.js.map +1 -0
- package/dist/new_level.d.ts +17 -0
- package/dist/new_level.d.ts.map +1 -0
- package/dist/new_level.js +173 -0
- package/dist/new_level.js.map +1 -0
- package/dist/pack.d.ts +47 -0
- package/dist/pack.d.ts.map +1 -0
- package/dist/pack.js +359 -0
- package/dist/pack.js.map +1 -0
- package/dist/passages.d.ts +23 -0
- package/dist/passages.d.ts.map +1 -0
- package/dist/passages.js +277 -0
- package/dist/passages.js.map +1 -0
- package/dist/potions.d.ts +13 -0
- package/dist/potions.d.ts.map +1 -0
- package/dist/potions.js +239 -0
- package/dist/potions.js.map +1 -0
- package/dist/rings.d.ts +13 -0
- package/dist/rings.d.ts.map +1 -0
- package/dist/rings.js +173 -0
- package/dist/rings.js.map +1 -0
- package/dist/rip.d.ts +22 -0
- package/dist/rip.d.ts.map +1 -0
- package/dist/rip.js +216 -0
- package/dist/rip.js.map +1 -0
- package/dist/rooms.d.ts +62 -0
- package/dist/rooms.d.ts.map +1 -0
- package/dist/rooms.js +432 -0
- package/dist/rooms.js.map +1 -0
- package/dist/save.d.ts +25 -0
- package/dist/save.d.ts.map +1 -0
- package/dist/save.js +565 -0
- package/dist/save.js.map +1 -0
- package/dist/scrolls.d.ts +13 -0
- package/dist/scrolls.d.ts.map +1 -0
- package/dist/scrolls.js +305 -0
- package/dist/scrolls.js.map +1 -0
- package/dist/sticks.d.ts +9 -0
- package/dist/sticks.d.ts.map +1 -0
- package/dist/sticks.js +379 -0
- package/dist/sticks.js.map +1 -0
- package/dist/things.d.ts +28 -0
- package/dist/things.d.ts.map +1 -0
- package/dist/things.js +307 -0
- package/dist/things.js.map +1 -0
- package/dist/types.d.ts +113 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +36 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +198 -0
- package/dist/util.js.map +1 -0
- package/dist/weapons.d.ts +22 -0
- package/dist/weapons.d.ts.map +1 -0
- package/dist/weapons.js +185 -0
- package/dist/weapons.js.map +1 -0
- package/package.json +31 -0
package/dist/pack.js
ADDED
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pack (inventory) management.
|
|
3
|
+
* Ported from pack.c — simplified for Phase 6 milestone.
|
|
4
|
+
*/
|
|
5
|
+
import { state, MAXPACK, GOLD, FOOD, SCROLL, AMULET, ISMANY, ISCURSED, ISFOUND, ISMULT, S_SCARE, F_DROPPED, ESCAPE, FLOOR, PASSAGE, CALLABLE, R_OR_S, HUNGERTIME, STOMACHSIZE, LEFT, RIGHT, NUMLINES, NUMCOLS, chat, setCh, flat, setFlat, moat, } from "./globals.js";
|
|
6
|
+
import { rnd } from "./util.js";
|
|
7
|
+
import { msg, readchar } from "./io.js";
|
|
8
|
+
import { _attach, _detach, new_item, discard } from "./list.js";
|
|
9
|
+
import { inv_name } from "./things.js";
|
|
10
|
+
import { find_obj } from "./misc.js";
|
|
11
|
+
/**
|
|
12
|
+
* add_pack: Add an item to the hero's pack.
|
|
13
|
+
*/
|
|
14
|
+
export async function add_pack(obj, silent) {
|
|
15
|
+
// Assign a pack letter
|
|
16
|
+
if (obj.o_packch === "") {
|
|
17
|
+
for (let i = 0; i < 26; i++) {
|
|
18
|
+
if (!state.pack_used[i]) {
|
|
19
|
+
obj.o_packch = String.fromCharCode("a".charCodeAt(0) + i);
|
|
20
|
+
state.pack_used[i] = true;
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Check if we can merge with existing items
|
|
26
|
+
// C original: ISMANY (thrown weapons) merge by o_group, ISMULT (potions/scrolls/food) merge by o_which
|
|
27
|
+
if (obj.o_flags & ISMANY) {
|
|
28
|
+
let existing = state.player.t_pack;
|
|
29
|
+
while (existing !== null) {
|
|
30
|
+
if (existing._kind === "object" && existing.o_type === obj.o_type &&
|
|
31
|
+
existing.o_which === obj.o_which && existing.o_group === obj.o_group) {
|
|
32
|
+
existing.o_count += obj.o_count;
|
|
33
|
+
if (!silent) {
|
|
34
|
+
await msg("%s (%s)", inv_name(existing, false), existing.o_packch);
|
|
35
|
+
}
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
existing = existing.l_next;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (ISMULT(obj.o_type)) {
|
|
42
|
+
let existing = state.player.t_pack;
|
|
43
|
+
while (existing !== null) {
|
|
44
|
+
if (existing._kind === "object" && existing.o_type === obj.o_type &&
|
|
45
|
+
existing.o_which === obj.o_which) {
|
|
46
|
+
existing.o_count += obj.o_count;
|
|
47
|
+
if (!silent) {
|
|
48
|
+
await msg("%s (%s)", inv_name(existing, false), existing.o_packch);
|
|
49
|
+
}
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
existing = existing.l_next;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (state.inpack >= MAXPACK) {
|
|
56
|
+
await msg("you can't carry anything else");
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// Add to pack
|
|
60
|
+
obj.l_next = state.player.t_pack;
|
|
61
|
+
if (state.player.t_pack !== null) {
|
|
62
|
+
state.player.t_pack.l_prev = obj;
|
|
63
|
+
}
|
|
64
|
+
obj.l_prev = null;
|
|
65
|
+
state.player.t_pack = obj;
|
|
66
|
+
state.inpack++;
|
|
67
|
+
if (!silent) {
|
|
68
|
+
await msg("%s (%s)", inv_name(obj, false), obj.o_packch);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* pick_up: Pick up an object at the hero's location.
|
|
73
|
+
*/
|
|
74
|
+
export async function pick_up(ch) {
|
|
75
|
+
const heroPos = state.player.t_pos;
|
|
76
|
+
if (ch === GOLD) {
|
|
77
|
+
await money();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const obj = find_obj(heroPos.y, heroPos.x);
|
|
81
|
+
if (obj === null || obj._kind !== "object") {
|
|
82
|
+
await msg("that's funny, it seems to have disappeared");
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// C original: scare monster scroll crumbles when picked up
|
|
86
|
+
if (obj.o_type === SCROLL.charCodeAt(0) && obj.o_which === S_SCARE) {
|
|
87
|
+
const lvlHead = { head: state.lvl_obj };
|
|
88
|
+
_detach(lvlHead, obj);
|
|
89
|
+
state.lvl_obj = lvlHead.head;
|
|
90
|
+
setCh(heroPos.y, heroPos.x, (flat(heroPos.y, heroPos.x) & F_DROPPED) ? " " : ".");
|
|
91
|
+
await msg("the scroll turns to dust as you pick it up");
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
// Detach from level
|
|
95
|
+
const lvlHead = { head: state.lvl_obj };
|
|
96
|
+
_detach(lvlHead, obj);
|
|
97
|
+
state.lvl_obj = lvlHead.head;
|
|
98
|
+
// Clear the item from the floor
|
|
99
|
+
setCh(heroPos.y, heroPos.x, (flat(heroPos.y, heroPos.x) & F_DROPPED) ? " " : ".");
|
|
100
|
+
await add_pack(obj, false);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* money: Handle picking up gold.
|
|
104
|
+
*/
|
|
105
|
+
export async function money() {
|
|
106
|
+
const heroPos = state.player.t_pos;
|
|
107
|
+
// Find the gold object
|
|
108
|
+
const obj = find_obj(heroPos.y, heroPos.x);
|
|
109
|
+
if (obj === null || obj._kind !== "object")
|
|
110
|
+
return;
|
|
111
|
+
const value = obj.o_arm; // o_goldval alias
|
|
112
|
+
// Detach from level
|
|
113
|
+
const lvlHead = { head: state.lvl_obj };
|
|
114
|
+
_detach(lvlHead, obj);
|
|
115
|
+
state.lvl_obj = lvlHead.head;
|
|
116
|
+
// Clear from floor
|
|
117
|
+
setCh(heroPos.y, heroPos.x, ".");
|
|
118
|
+
state.purse += value;
|
|
119
|
+
await msg("%d gold pieces", value);
|
|
120
|
+
// Also clear gold from room
|
|
121
|
+
const playerRoom = state.player.t_room;
|
|
122
|
+
if (playerRoom !== null) {
|
|
123
|
+
playerRoom.r_goldval = 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* inventory: Display the player's inventory.
|
|
128
|
+
*/
|
|
129
|
+
export async function inventory(list, type) {
|
|
130
|
+
if (list === null) {
|
|
131
|
+
await msg("you are empty handed");
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
let count = 0;
|
|
135
|
+
let item = list;
|
|
136
|
+
while (item !== null) {
|
|
137
|
+
if (item._kind === "object") {
|
|
138
|
+
if (type === 0 || item.o_type === type) {
|
|
139
|
+
const name = inv_name(item, false);
|
|
140
|
+
await msg("%s) %s", item.o_packch, name);
|
|
141
|
+
count++;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
item = item.l_next;
|
|
145
|
+
}
|
|
146
|
+
if (count === 0) {
|
|
147
|
+
await msg("you don't have anything appropriate");
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* get_item: Get an item from the pack by letter.
|
|
154
|
+
*/
|
|
155
|
+
export async function get_item(purpose, type) {
|
|
156
|
+
if (state.player.t_pack === null) {
|
|
157
|
+
await msg("you aren't carrying anything");
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
if (!state.terse) {
|
|
161
|
+
await msg("which object do you want to %s?", purpose);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
await msg("%s what?", purpose);
|
|
165
|
+
}
|
|
166
|
+
const ch = await readchar();
|
|
167
|
+
state.mpos = 0;
|
|
168
|
+
if (ch.charCodeAt(0) === ESCAPE) {
|
|
169
|
+
state.after = false;
|
|
170
|
+
await msg("");
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
let item = state.player.t_pack;
|
|
174
|
+
while (item !== null) {
|
|
175
|
+
if (item._kind === "object" && item.o_packch === ch) {
|
|
176
|
+
if (type !== 0 && type !== CALLABLE && type !== R_OR_S &&
|
|
177
|
+
item.o_type !== type) {
|
|
178
|
+
await msg("that's not a valid %s", purpose);
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
return item;
|
|
182
|
+
}
|
|
183
|
+
item = item.l_next;
|
|
184
|
+
}
|
|
185
|
+
await msg("'%s' is not a valid pack character", ch);
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* leave_pack: Take an item out of the pack.
|
|
190
|
+
* If count > 1 and !all, splits off one copy.
|
|
191
|
+
*/
|
|
192
|
+
export function leave_pack(obj, newpack, all) {
|
|
193
|
+
if (obj.o_count > 1 && !all) {
|
|
194
|
+
state.last_pick = obj;
|
|
195
|
+
obj.o_count--;
|
|
196
|
+
if (obj.o_group === 0) {
|
|
197
|
+
state.inpack--;
|
|
198
|
+
}
|
|
199
|
+
const nobj = new_item();
|
|
200
|
+
nobj.o_type = obj.o_type;
|
|
201
|
+
nobj.o_which = obj.o_which;
|
|
202
|
+
nobj.o_hplus = obj.o_hplus;
|
|
203
|
+
nobj.o_dplus = obj.o_dplus;
|
|
204
|
+
nobj.o_arm = obj.o_arm;
|
|
205
|
+
nobj.o_damage = obj.o_damage;
|
|
206
|
+
nobj.o_hurldmg = obj.o_hurldmg;
|
|
207
|
+
nobj.o_launch = obj.o_launch;
|
|
208
|
+
nobj.o_flags = obj.o_flags;
|
|
209
|
+
nobj.o_group = obj.o_group;
|
|
210
|
+
nobj.o_count = 1;
|
|
211
|
+
nobj.o_packch = obj.o_packch;
|
|
212
|
+
nobj.o_text = obj.o_text;
|
|
213
|
+
nobj.o_label = obj.o_label;
|
|
214
|
+
return nobj;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
state.last_pick = null;
|
|
218
|
+
const packIdx = obj.o_packch.charCodeAt(0) - "a".charCodeAt(0);
|
|
219
|
+
if (packIdx >= 0 && packIdx < 26) {
|
|
220
|
+
state.pack_used[packIdx] = false;
|
|
221
|
+
}
|
|
222
|
+
const packHead = { head: state.player.t_pack };
|
|
223
|
+
_detach(packHead, obj);
|
|
224
|
+
state.player.t_pack = packHead.head;
|
|
225
|
+
state.inpack--;
|
|
226
|
+
return obj;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* dropcheck: Check if an item can be dropped/thrown. Unequips if needed.
|
|
231
|
+
*/
|
|
232
|
+
export async function dropcheck(obj) {
|
|
233
|
+
if (obj !== state.cur_armor && obj !== state.cur_weapon &&
|
|
234
|
+
obj !== state.cur_ring[LEFT] && obj !== state.cur_ring[RIGHT]) {
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
if (obj.o_flags & ISCURSED) {
|
|
238
|
+
await msg("you can't. It appears to be cursed");
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
if (obj === state.cur_weapon) {
|
|
242
|
+
state.cur_weapon = null;
|
|
243
|
+
}
|
|
244
|
+
else if (obj === state.cur_armor) {
|
|
245
|
+
const { waste_time } = await import("./armor.js");
|
|
246
|
+
await waste_time();
|
|
247
|
+
state.cur_armor = null;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
const hand = obj === state.cur_ring[LEFT] ? LEFT : RIGHT;
|
|
251
|
+
state.cur_ring[hand] = null;
|
|
252
|
+
}
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* fallpos: Find an adjacent empty position for a dropped/thrown item.
|
|
257
|
+
*/
|
|
258
|
+
export function fallpos(pos, newpos) {
|
|
259
|
+
// C original: collect all valid spots, pick one randomly
|
|
260
|
+
const spots = [];
|
|
261
|
+
for (let dy = -1; dy <= 1; dy++) {
|
|
262
|
+
for (let dx = -1; dx <= 1; dx++) {
|
|
263
|
+
const ny = pos.y + dy;
|
|
264
|
+
const nx = pos.x + dx;
|
|
265
|
+
if (ny <= 0 || ny >= NUMLINES - 1 || nx < 0 || nx >= NUMCOLS)
|
|
266
|
+
continue;
|
|
267
|
+
if (ny === state.player.t_pos.y && nx === state.player.t_pos.x)
|
|
268
|
+
continue;
|
|
269
|
+
const ch = chat(ny, nx);
|
|
270
|
+
if ((ch === FLOOR || ch === PASSAGE) && moat(ny, nx) === null) {
|
|
271
|
+
spots.push({ y: ny, x: nx });
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (spots.length === 0)
|
|
276
|
+
return false;
|
|
277
|
+
const pick = spots[rnd(spots.length)];
|
|
278
|
+
newpos.y = pick.y;
|
|
279
|
+
newpos.x = pick.x;
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* drop: The drop command — drop an item from the pack.
|
|
284
|
+
*/
|
|
285
|
+
export async function drop() {
|
|
286
|
+
const heroPos = state.player.t_pos;
|
|
287
|
+
const ch = chat(heroPos.y, heroPos.x);
|
|
288
|
+
if (ch !== FLOOR && ch !== PASSAGE) {
|
|
289
|
+
state.after = false;
|
|
290
|
+
await msg("there is something there already");
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
const obj = await get_item("drop", 0);
|
|
294
|
+
if (obj === null)
|
|
295
|
+
return;
|
|
296
|
+
if (!await dropcheck(obj))
|
|
297
|
+
return;
|
|
298
|
+
const droppedObj = leave_pack(obj, true, false);
|
|
299
|
+
droppedObj.o_pos.y = heroPos.y;
|
|
300
|
+
droppedObj.o_pos.x = heroPos.x;
|
|
301
|
+
const typeCh = String.fromCharCode(droppedObj.o_type);
|
|
302
|
+
setCh(heroPos.y, heroPos.x, typeCh);
|
|
303
|
+
setFlat(heroPos.y, heroPos.x, flat(heroPos.y, heroPos.x) | F_DROPPED);
|
|
304
|
+
droppedObj.o_flags |= ISFOUND;
|
|
305
|
+
if (droppedObj.o_type === AMULET.charCodeAt(0)) {
|
|
306
|
+
state.amulet = false;
|
|
307
|
+
}
|
|
308
|
+
const listHead = { head: state.lvl_obj };
|
|
309
|
+
_attach(listHead, droppedObj);
|
|
310
|
+
state.lvl_obj = listHead.head;
|
|
311
|
+
await msg("dropped %s", inv_name(droppedObj, true));
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* eat: Eat food from the pack.
|
|
315
|
+
*/
|
|
316
|
+
export async function eat() {
|
|
317
|
+
const obj = await get_item("eat", FOOD.charCodeAt(0));
|
|
318
|
+
if (obj === null)
|
|
319
|
+
return;
|
|
320
|
+
if (obj.o_type !== FOOD.charCodeAt(0)) {
|
|
321
|
+
if (!state.terse) {
|
|
322
|
+
await msg("ugh, that tastes terrible");
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
await msg("yuk");
|
|
326
|
+
}
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
if (obj.o_which === 1) {
|
|
330
|
+
await msg("my, that was a yummy %s", state.fruit);
|
|
331
|
+
}
|
|
332
|
+
else if (rnd(100) > 70) {
|
|
333
|
+
await msg("yuk, this food tastes awful");
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
await msg("yum, that tasted good");
|
|
337
|
+
}
|
|
338
|
+
state.food_left += HUNGERTIME - 200 + rnd(400);
|
|
339
|
+
if (state.food_left > STOMACHSIZE) {
|
|
340
|
+
state.food_left = STOMACHSIZE;
|
|
341
|
+
}
|
|
342
|
+
state.hungry_state = 0;
|
|
343
|
+
if (obj === state.cur_weapon) {
|
|
344
|
+
state.cur_weapon = null;
|
|
345
|
+
}
|
|
346
|
+
obj.o_count--;
|
|
347
|
+
if (obj.o_count < 1) {
|
|
348
|
+
const packIdx = obj.o_packch.charCodeAt(0) - "a".charCodeAt(0);
|
|
349
|
+
if (packIdx >= 0 && packIdx < 26) {
|
|
350
|
+
state.pack_used[packIdx] = false;
|
|
351
|
+
}
|
|
352
|
+
const packHead = { head: state.player.t_pack };
|
|
353
|
+
_detach(packHead, obj);
|
|
354
|
+
state.player.t_pack = packHead.head;
|
|
355
|
+
discard(obj);
|
|
356
|
+
state.inpack--;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=pack.js.map
|
package/dist/pack.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passage drawing and connectivity.
|
|
3
|
+
* Ported from passages.c
|
|
4
|
+
*/
|
|
5
|
+
import type { Coord, Room } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* do_passages: Draw all the passages on a level.
|
|
8
|
+
*/
|
|
9
|
+
export declare function do_passages(): void;
|
|
10
|
+
/**
|
|
11
|
+
* conn: Draw a corridor between two rooms.
|
|
12
|
+
*/
|
|
13
|
+
export declare function conn(r1: number, r2: number): void;
|
|
14
|
+
/**
|
|
15
|
+
* door: Add a door or possibly a secret door. Also enters the door
|
|
16
|
+
* in the exits array of the room.
|
|
17
|
+
*/
|
|
18
|
+
export declare function door(rm: Room, cp: Coord): void;
|
|
19
|
+
/**
|
|
20
|
+
* passnum: Assign a number to each passageway.
|
|
21
|
+
*/
|
|
22
|
+
export declare function passnum(): void;
|
|
23
|
+
//# sourceMappingURL=passages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passages.d.ts","sourceRoot":"","sources":["../src/passages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAkC9C;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAkElC;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAkHjD;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,GAAG,IAAI,CAkB9C;AAMD;;GAEG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAkB9B"}
|
package/dist/passages.js
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passage drawing and connectivity.
|
|
3
|
+
* Ported from passages.c
|
|
4
|
+
*/
|
|
5
|
+
import { state, MAXROOMS, NUMLINES, NUMCOLS, ISGONE, ISMAZE, DOOR, F_PASS, F_REAL, F_PNUM, INDEX, flat, } from "./globals.js";
|
|
6
|
+
import { rnd } from "./util.js";
|
|
7
|
+
import { putpass } from "./rooms.js";
|
|
8
|
+
// Adjacency matrix for 3x3 room grid
|
|
9
|
+
// 0 1 2
|
|
10
|
+
// 3 4 5
|
|
11
|
+
// 6 7 8
|
|
12
|
+
const connMatrix = [
|
|
13
|
+
[false, true, false, true, false, false, false, false, false], // 0
|
|
14
|
+
[true, false, true, false, true, false, false, false, false], // 1
|
|
15
|
+
[false, true, false, false, false, true, false, false, false], // 2
|
|
16
|
+
[true, false, false, false, true, false, true, false, false], // 3
|
|
17
|
+
[false, true, false, true, false, true, false, true, false], // 4
|
|
18
|
+
[false, false, true, false, true, false, false, false, true], // 5
|
|
19
|
+
[false, false, false, true, false, false, false, true, false], // 6
|
|
20
|
+
[false, false, false, false, true, false, true, false, true], // 7
|
|
21
|
+
[false, false, false, false, false, true, false, true, false], // 8
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* do_passages: Draw all the passages on a level.
|
|
25
|
+
*/
|
|
26
|
+
export function do_passages() {
|
|
27
|
+
// Initialize room descriptors
|
|
28
|
+
const rdes = [];
|
|
29
|
+
for (let i = 0; i < MAXROOMS; i++) {
|
|
30
|
+
rdes.push({
|
|
31
|
+
conn: [...connMatrix[i]],
|
|
32
|
+
isconn: new Array(MAXROOMS).fill(false),
|
|
33
|
+
ingraph: false,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
// Starting with one room, connect it to a random adjacent room
|
|
37
|
+
let roomcount = 1;
|
|
38
|
+
let r1 = rdes[rnd(MAXROOMS)];
|
|
39
|
+
r1.ingraph = true;
|
|
40
|
+
let r2 = null;
|
|
41
|
+
do {
|
|
42
|
+
// Find a room to connect with
|
|
43
|
+
let candidateCount = 0;
|
|
44
|
+
for (let i = 0; i < MAXROOMS; i++) {
|
|
45
|
+
if (r1.conn[i] && !rdes[i].ingraph && rnd(++candidateCount) === 0) {
|
|
46
|
+
r2 = rdes[i];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (candidateCount === 0) {
|
|
50
|
+
// No adjacent rooms outside graph, pick a new starting room
|
|
51
|
+
do {
|
|
52
|
+
r1 = rdes[rnd(MAXROOMS)];
|
|
53
|
+
} while (!r1.ingraph);
|
|
54
|
+
}
|
|
55
|
+
else if (r2 !== null) {
|
|
56
|
+
// Connect new room to graph and draw tunnel
|
|
57
|
+
r2.ingraph = true;
|
|
58
|
+
const r1idx = rdes.indexOf(r1);
|
|
59
|
+
const r2idx = rdes.indexOf(r2);
|
|
60
|
+
conn(r1idx, r2idx);
|
|
61
|
+
r1.isconn[r2idx] = true;
|
|
62
|
+
r2.isconn[r1idx] = true;
|
|
63
|
+
roomcount++;
|
|
64
|
+
}
|
|
65
|
+
} while (roomcount < MAXROOMS);
|
|
66
|
+
// Add extra passages for variety
|
|
67
|
+
for (let extraCount = rnd(5); extraCount > 0; extraCount--) {
|
|
68
|
+
r1 = rdes[rnd(MAXROOMS)];
|
|
69
|
+
let candidateCount = 0;
|
|
70
|
+
r2 = null;
|
|
71
|
+
for (let i = 0; i < MAXROOMS; i++) {
|
|
72
|
+
if (r1.conn[i] && !r1.isconn[i] && rnd(++candidateCount) === 0) {
|
|
73
|
+
r2 = rdes[i];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (candidateCount !== 0 && r2 !== null) {
|
|
77
|
+
const r1idx = rdes.indexOf(r1);
|
|
78
|
+
const r2idx = rdes.indexOf(r2);
|
|
79
|
+
conn(r1idx, r2idx);
|
|
80
|
+
r1.isconn[r2idx] = true;
|
|
81
|
+
r2.isconn[r1idx] = true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
passnum();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* conn: Draw a corridor between two rooms.
|
|
88
|
+
*/
|
|
89
|
+
export function conn(r1, r2) {
|
|
90
|
+
let rm;
|
|
91
|
+
let direc;
|
|
92
|
+
let rmt;
|
|
93
|
+
if (r1 < r2) {
|
|
94
|
+
rm = r1;
|
|
95
|
+
direc = (r1 + 1 === r2) ? "r" : "d";
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
rm = r2;
|
|
99
|
+
direc = (r2 + 1 === r1) ? "r" : "d";
|
|
100
|
+
}
|
|
101
|
+
const rpf = state.rooms[rm];
|
|
102
|
+
let rpt;
|
|
103
|
+
const del = { x: 0, y: 0 };
|
|
104
|
+
const spos = { x: 0, y: 0 };
|
|
105
|
+
const epos = { x: 0, y: 0 };
|
|
106
|
+
const turnDelta = { x: 0, y: 0 };
|
|
107
|
+
let distance = 0;
|
|
108
|
+
let turnDistance = 0;
|
|
109
|
+
if (direc === "d") {
|
|
110
|
+
rmt = rm + 3;
|
|
111
|
+
rpt = state.rooms[rmt];
|
|
112
|
+
del.x = 0;
|
|
113
|
+
del.y = 1;
|
|
114
|
+
spos.x = rpf.r_pos.x;
|
|
115
|
+
spos.y = rpf.r_pos.y;
|
|
116
|
+
epos.x = rpt.r_pos.x;
|
|
117
|
+
epos.y = rpt.r_pos.y;
|
|
118
|
+
if (!(rpf.r_flags & ISGONE)) {
|
|
119
|
+
do {
|
|
120
|
+
spos.x = rpf.r_pos.x + rnd(rpf.r_max.x - 2) + 1;
|
|
121
|
+
spos.y = rpf.r_pos.y + rpf.r_max.y - 1;
|
|
122
|
+
} while ((rpf.r_flags & ISMAZE) && !(flat(spos.y, spos.x) & F_PASS));
|
|
123
|
+
}
|
|
124
|
+
if (!(rpt.r_flags & ISGONE)) {
|
|
125
|
+
do {
|
|
126
|
+
epos.x = rpt.r_pos.x + rnd(rpt.r_max.x - 2) + 1;
|
|
127
|
+
} while ((rpt.r_flags & ISMAZE) && !(flat(epos.y, epos.x) & F_PASS));
|
|
128
|
+
}
|
|
129
|
+
distance = Math.abs(spos.y - epos.y) - 1;
|
|
130
|
+
turnDelta.y = 0;
|
|
131
|
+
turnDelta.x = spos.x < epos.x ? 1 : -1;
|
|
132
|
+
turnDistance = Math.abs(spos.x - epos.x);
|
|
133
|
+
}
|
|
134
|
+
else if (direc === "r") {
|
|
135
|
+
rmt = rm + 1;
|
|
136
|
+
rpt = state.rooms[rmt];
|
|
137
|
+
del.x = 1;
|
|
138
|
+
del.y = 0;
|
|
139
|
+
spos.x = rpf.r_pos.x;
|
|
140
|
+
spos.y = rpf.r_pos.y;
|
|
141
|
+
epos.x = rpt.r_pos.x;
|
|
142
|
+
epos.y = rpt.r_pos.y;
|
|
143
|
+
if (!(rpf.r_flags & ISGONE)) {
|
|
144
|
+
do {
|
|
145
|
+
spos.x = rpf.r_pos.x + rpf.r_max.x - 1;
|
|
146
|
+
spos.y = rpf.r_pos.y + rnd(rpf.r_max.y - 2) + 1;
|
|
147
|
+
} while ((rpf.r_flags & ISMAZE) && !(flat(spos.y, spos.x) & F_PASS));
|
|
148
|
+
}
|
|
149
|
+
if (!(rpt.r_flags & ISGONE)) {
|
|
150
|
+
do {
|
|
151
|
+
epos.y = rpt.r_pos.y + rnd(rpt.r_max.y - 2) + 1;
|
|
152
|
+
} while ((rpt.r_flags & ISMAZE) && !(flat(epos.y, epos.x) & F_PASS));
|
|
153
|
+
}
|
|
154
|
+
distance = Math.abs(spos.x - epos.x) - 1;
|
|
155
|
+
turnDelta.y = spos.y < epos.y ? 1 : -1;
|
|
156
|
+
turnDelta.x = 0;
|
|
157
|
+
turnDistance = Math.abs(spos.y - epos.y);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const turnSpot = rnd(distance - 1) + 1;
|
|
163
|
+
// Draw doors or passage markers at endpoints
|
|
164
|
+
if (!(rpf.r_flags & ISGONE)) {
|
|
165
|
+
door(rpf, spos);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
putpass(spos);
|
|
169
|
+
}
|
|
170
|
+
if (!(rpt.r_flags & ISGONE)) {
|
|
171
|
+
door(rpt, epos);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
putpass(epos);
|
|
175
|
+
}
|
|
176
|
+
// Draw the corridor
|
|
177
|
+
const curr = { x: spos.x, y: spos.y };
|
|
178
|
+
while (distance > 0) {
|
|
179
|
+
curr.x += del.x;
|
|
180
|
+
curr.y += del.y;
|
|
181
|
+
if (distance === turnSpot) {
|
|
182
|
+
while (turnDistance-- > 0) {
|
|
183
|
+
putpass(curr);
|
|
184
|
+
curr.x += turnDelta.x;
|
|
185
|
+
curr.y += turnDelta.y;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
putpass(curr);
|
|
189
|
+
distance--;
|
|
190
|
+
}
|
|
191
|
+
curr.x += del.x;
|
|
192
|
+
curr.y += del.y;
|
|
193
|
+
// In original: if (!ce(curr, epos)) msg("warning, connectivity problem");
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* door: Add a door or possibly a secret door. Also enters the door
|
|
197
|
+
* in the exits array of the room.
|
|
198
|
+
*/
|
|
199
|
+
export function door(rm, cp) {
|
|
200
|
+
if (!rm.r_exit)
|
|
201
|
+
rm.r_exit = [];
|
|
202
|
+
rm.r_exit[rm.r_nexits++] = { x: cp.x, y: cp.y };
|
|
203
|
+
if (rm.r_flags & ISMAZE)
|
|
204
|
+
return;
|
|
205
|
+
const pp = INDEX(cp.y, cp.x);
|
|
206
|
+
if (rnd(10) + 1 < state.level && rnd(5) === 0) {
|
|
207
|
+
// Secret door — looks like a wall
|
|
208
|
+
if (cp.y === rm.r_pos.y || cp.y === rm.r_pos.y + rm.r_max.y - 1) {
|
|
209
|
+
pp.p_ch = "-";
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
pp.p_ch = "|";
|
|
213
|
+
}
|
|
214
|
+
pp.p_flags &= ~F_REAL;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
pp.p_ch = DOOR;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Passage numbering statics (matching passages.c)
|
|
221
|
+
let pnum = 0;
|
|
222
|
+
let newPnum = false;
|
|
223
|
+
/**
|
|
224
|
+
* passnum: Assign a number to each passageway.
|
|
225
|
+
*/
|
|
226
|
+
export function passnum() {
|
|
227
|
+
pnum = 0;
|
|
228
|
+
newPnum = false;
|
|
229
|
+
for (const rp of state.passages) {
|
|
230
|
+
rp.r_nexits = 0;
|
|
231
|
+
rp.r_exit = [];
|
|
232
|
+
}
|
|
233
|
+
for (const rp of state.rooms) {
|
|
234
|
+
for (let i = 0; i < rp.r_nexits; i++) {
|
|
235
|
+
newPnum = true;
|
|
236
|
+
const exit = rp.r_exit[i];
|
|
237
|
+
if (exit) {
|
|
238
|
+
numpass(exit.y, exit.x);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* numpass: Number a passageway square and its neighbors.
|
|
245
|
+
*/
|
|
246
|
+
function numpass(y, x) {
|
|
247
|
+
if (x >= NUMCOLS || x < 0 || y >= NUMLINES || y <= 0)
|
|
248
|
+
return;
|
|
249
|
+
const pp = INDEX(y, x);
|
|
250
|
+
if (pp.p_flags & F_PNUM)
|
|
251
|
+
return;
|
|
252
|
+
if (newPnum) {
|
|
253
|
+
pnum++;
|
|
254
|
+
newPnum = false;
|
|
255
|
+
}
|
|
256
|
+
const ch = pp.p_ch;
|
|
257
|
+
if (ch === DOOR || (!(pp.p_flags & F_REAL) && (ch === "|" || ch === "-"))) {
|
|
258
|
+
// It's a door — register as passage exit
|
|
259
|
+
if (pnum < state.passages.length) {
|
|
260
|
+
const rp = state.passages[pnum];
|
|
261
|
+
if (!rp.r_exit)
|
|
262
|
+
rp.r_exit = [];
|
|
263
|
+
rp.r_exit[rp.r_nexits] = { y, x };
|
|
264
|
+
rp.r_nexits++;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
else if (!(pp.p_flags & F_PASS)) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
pp.p_flags |= pnum;
|
|
271
|
+
// Recurse on surrounding places
|
|
272
|
+
numpass(y + 1, x);
|
|
273
|
+
numpass(y - 1, x);
|
|
274
|
+
numpass(y, x + 1);
|
|
275
|
+
numpass(y, x - 1);
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=passages.js.map
|