@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.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +175 -0
  3. package/dist/armor.d.ts +18 -0
  4. package/dist/armor.d.ts.map +1 -0
  5. package/dist/armor.js +84 -0
  6. package/dist/armor.js.map +1 -0
  7. package/dist/chase.d.ts +15 -0
  8. package/dist/chase.d.ts.map +1 -0
  9. package/dist/chase.js +152 -0
  10. package/dist/chase.js.map +1 -0
  11. package/dist/command.d.ts +12 -0
  12. package/dist/command.d.ts.map +1 -0
  13. package/dist/command.js +761 -0
  14. package/dist/command.js.map +1 -0
  15. package/dist/curses.d.ts +102 -0
  16. package/dist/curses.d.ts.map +1 -0
  17. package/dist/curses.js +47 -0
  18. package/dist/curses.js.map +1 -0
  19. package/dist/daemon.d.ts +43 -0
  20. package/dist/daemon.d.ts.map +1 -0
  21. package/dist/daemon.js +116 -0
  22. package/dist/daemon.js.map +1 -0
  23. package/dist/daemons.d.ts +47 -0
  24. package/dist/daemons.d.ts.map +1 -0
  25. package/dist/daemons.js +194 -0
  26. package/dist/daemons.js.map +1 -0
  27. package/dist/fight.d.ts +52 -0
  28. package/dist/fight.d.ts.map +1 -0
  29. package/dist/fight.js +508 -0
  30. package/dist/fight.js.map +1 -0
  31. package/dist/globals.d.ts +387 -0
  32. package/dist/globals.d.ts.map +1 -0
  33. package/dist/globals.js +935 -0
  34. package/dist/globals.js.map +1 -0
  35. package/dist/index.d.ts +11 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +9 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/init.d.ts +30 -0
  40. package/dist/init.d.ts.map +1 -0
  41. package/dist/init.js +159 -0
  42. package/dist/init.js.map +1 -0
  43. package/dist/io.d.ts +48 -0
  44. package/dist/io.d.ts.map +1 -0
  45. package/dist/io.js +248 -0
  46. package/dist/io.js.map +1 -0
  47. package/dist/list.d.ts +37 -0
  48. package/dist/list.d.ts.map +1 -0
  49. package/dist/list.js +109 -0
  50. package/dist/list.js.map +1 -0
  51. package/dist/main.d.ts +23 -0
  52. package/dist/main.d.ts.map +1 -0
  53. package/dist/main.js +207 -0
  54. package/dist/main.js.map +1 -0
  55. package/dist/misc.d.ts +53 -0
  56. package/dist/misc.d.ts.map +1 -0
  57. package/dist/misc.js +296 -0
  58. package/dist/misc.js.map +1 -0
  59. package/dist/monsters.d.ts +55 -0
  60. package/dist/monsters.d.ts.map +1 -0
  61. package/dist/monsters.js +211 -0
  62. package/dist/monsters.js.map +1 -0
  63. package/dist/move.d.ts +23 -0
  64. package/dist/move.d.ts.map +1 -0
  65. package/dist/move.js +270 -0
  66. package/dist/move.js.map +1 -0
  67. package/dist/new_level.d.ts +17 -0
  68. package/dist/new_level.d.ts.map +1 -0
  69. package/dist/new_level.js +173 -0
  70. package/dist/new_level.js.map +1 -0
  71. package/dist/pack.d.ts +47 -0
  72. package/dist/pack.d.ts.map +1 -0
  73. package/dist/pack.js +359 -0
  74. package/dist/pack.js.map +1 -0
  75. package/dist/passages.d.ts +23 -0
  76. package/dist/passages.d.ts.map +1 -0
  77. package/dist/passages.js +277 -0
  78. package/dist/passages.js.map +1 -0
  79. package/dist/potions.d.ts +13 -0
  80. package/dist/potions.d.ts.map +1 -0
  81. package/dist/potions.js +239 -0
  82. package/dist/potions.js.map +1 -0
  83. package/dist/rings.d.ts +13 -0
  84. package/dist/rings.d.ts.map +1 -0
  85. package/dist/rings.js +173 -0
  86. package/dist/rings.js.map +1 -0
  87. package/dist/rip.d.ts +22 -0
  88. package/dist/rip.d.ts.map +1 -0
  89. package/dist/rip.js +216 -0
  90. package/dist/rip.js.map +1 -0
  91. package/dist/rooms.d.ts +62 -0
  92. package/dist/rooms.d.ts.map +1 -0
  93. package/dist/rooms.js +432 -0
  94. package/dist/rooms.js.map +1 -0
  95. package/dist/save.d.ts +25 -0
  96. package/dist/save.d.ts.map +1 -0
  97. package/dist/save.js +565 -0
  98. package/dist/save.js.map +1 -0
  99. package/dist/scrolls.d.ts +13 -0
  100. package/dist/scrolls.d.ts.map +1 -0
  101. package/dist/scrolls.js +305 -0
  102. package/dist/scrolls.js.map +1 -0
  103. package/dist/sticks.d.ts +9 -0
  104. package/dist/sticks.d.ts.map +1 -0
  105. package/dist/sticks.js +379 -0
  106. package/dist/sticks.js.map +1 -0
  107. package/dist/things.d.ts +28 -0
  108. package/dist/things.d.ts.map +1 -0
  109. package/dist/things.js +307 -0
  110. package/dist/things.js.map +1 -0
  111. package/dist/types.d.ts +113 -0
  112. package/dist/types.d.ts.map +1 -0
  113. package/dist/types.js +10 -0
  114. package/dist/types.js.map +1 -0
  115. package/dist/util.d.ts +36 -0
  116. package/dist/util.d.ts.map +1 -0
  117. package/dist/util.js +198 -0
  118. package/dist/util.js.map +1 -0
  119. package/dist/weapons.d.ts +22 -0
  120. package/dist/weapons.d.ts.map +1 -0
  121. package/dist/weapons.js +185 -0
  122. package/dist/weapons.js.map +1 -0
  123. 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
@@ -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"}
@@ -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