@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/list.d.ts ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Linked list operations.
3
+ * Ported from list.c
4
+ */
5
+ import type { Thing, Monster, GameObj } from "./types.js";
6
+ /**
7
+ * _detach: Takes an item out of whatever linked list it might be in.
8
+ * The listHead object holds { head: Thing | null } — we mutate head if needed.
9
+ */
10
+ export declare function _detach(listHead: {
11
+ head: Thing | null;
12
+ }, item: Thing): void;
13
+ /**
14
+ * _attach: Add an item to the head of a list.
15
+ */
16
+ export declare function _attach(listHead: {
17
+ head: Thing | null;
18
+ }, item: Thing): void;
19
+ /**
20
+ * _free_list: Throw the whole list away.
21
+ */
22
+ export declare function _free_list(listHead: {
23
+ head: Thing | null;
24
+ }): void;
25
+ /**
26
+ * discard: Free up an item (in JS, just unlink it).
27
+ */
28
+ export declare function discard(_item: Thing): void;
29
+ /**
30
+ * new_item: Create a new GameObj (the common case for items).
31
+ */
32
+ export declare function new_item(): GameObj;
33
+ /**
34
+ * new_monster_thing: Create a new Monster thing.
35
+ */
36
+ export declare function new_monster_thing(): Monster;
37
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,CAY3E;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,CAU3E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAMjE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAI1C;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CAqBlC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAyB3C"}
package/dist/list.js ADDED
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Linked list operations.
3
+ * Ported from list.c
4
+ */
5
+ /**
6
+ * _detach: Takes an item out of whatever linked list it might be in.
7
+ * The listHead object holds { head: Thing | null } — we mutate head if needed.
8
+ */
9
+ export function _detach(listHead, item) {
10
+ if (listHead.head === item) {
11
+ listHead.head = item.l_next;
12
+ }
13
+ if (item.l_prev !== null) {
14
+ item.l_prev.l_next = item.l_next;
15
+ }
16
+ if (item.l_next !== null) {
17
+ item.l_next.l_prev = item.l_prev;
18
+ }
19
+ item.l_next = null;
20
+ item.l_prev = null;
21
+ }
22
+ /**
23
+ * _attach: Add an item to the head of a list.
24
+ */
25
+ export function _attach(listHead, item) {
26
+ if (listHead.head !== null) {
27
+ item.l_next = listHead.head;
28
+ listHead.head.l_prev = item;
29
+ item.l_prev = null;
30
+ }
31
+ else {
32
+ item.l_next = null;
33
+ item.l_prev = null;
34
+ }
35
+ listHead.head = item;
36
+ }
37
+ /**
38
+ * _free_list: Throw the whole list away.
39
+ */
40
+ export function _free_list(listHead) {
41
+ while (listHead.head !== null) {
42
+ const item = listHead.head;
43
+ listHead.head = item.l_next;
44
+ discard(item);
45
+ }
46
+ }
47
+ /**
48
+ * discard: Free up an item (in JS, just unlink it).
49
+ */
50
+ export function discard(_item) {
51
+ // In JS, garbage collection handles freeing.
52
+ // We just need to make sure the item is detached from any list,
53
+ // which _detach already does.
54
+ }
55
+ /**
56
+ * new_item: Create a new GameObj (the common case for items).
57
+ */
58
+ export function new_item() {
59
+ return {
60
+ _kind: "object",
61
+ l_next: null,
62
+ l_prev: null,
63
+ o_type: 0,
64
+ o_pos: { x: 0, y: 0 },
65
+ o_text: null,
66
+ o_launch: 0,
67
+ o_packch: "",
68
+ o_damage: "0x0",
69
+ o_hurldmg: "0x0",
70
+ o_count: 1,
71
+ o_which: 0,
72
+ o_hplus: 0,
73
+ o_dplus: 0,
74
+ o_arm: 0,
75
+ o_flags: 0,
76
+ o_group: 0,
77
+ o_label: null,
78
+ };
79
+ }
80
+ /**
81
+ * new_monster_thing: Create a new Monster thing.
82
+ */
83
+ export function new_monster_thing() {
84
+ return {
85
+ _kind: "monster",
86
+ l_next: null,
87
+ l_prev: null,
88
+ t_pos: { x: 0, y: 0 },
89
+ t_turn: false,
90
+ t_type: "A",
91
+ t_disguise: "A",
92
+ t_oldch: " ",
93
+ t_dest: null,
94
+ t_flags: 0,
95
+ t_stats: {
96
+ s_str: 0,
97
+ s_exp: 0,
98
+ s_lvl: 0,
99
+ s_arm: 0,
100
+ s_hpt: 0,
101
+ s_dmg: "0x0",
102
+ s_maxhp: 0,
103
+ },
104
+ t_room: null,
105
+ t_pack: null,
106
+ t_reserved: 0,
107
+ };
108
+ }
109
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":"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"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Main game entry point and loop.
3
+ * Ported from main.c
4
+ */
5
+ import type { CursesBackend } from "./curses.js";
6
+ import type { RogueOptions, RogueResult } from "./types.js";
7
+ /**
8
+ * startRogue: Initialize and run a game of Rogue.
9
+ *
10
+ * This is the primary public API. The caller provides a CursesBackend
11
+ * implementation and optional configuration. Returns a RogueResult
12
+ * describing how the game ended.
13
+ */
14
+ export declare function startRogue(backend: CursesBackend, options?: RogueOptions): Promise<RogueResult>;
15
+ /**
16
+ * resumeRogue: Resume a saved game from a JSON string.
17
+ *
18
+ * The caller provides the same CursesBackend, plus the save data.
19
+ * Returns a RogueResult when the game ends.
20
+ */
21
+ export declare function resumeRogue(backend: CursesBackend, saveData: string): Promise<RogueResult>;
22
+ export { saveGame } from "./save.js";
23
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAsC5D;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,CAAC,CA6EtB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAiEtB;AAGD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC"}
package/dist/main.js ADDED
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Main game entry point and loop.
3
+ * Ported from main.c
4
+ */
5
+ import { RogueExit } from "./types.js";
6
+ import { state, resetState, NUMLINES, NUMCOLS, BEFORE, AFTER, ISHASTE } from "./globals.js";
7
+ import { setRNGSeed, rnd } from "./util.js";
8
+ import { setBackend, resetIOState } from "./io.js";
9
+ import { init_player, init_colors, init_names, init_stones, init_materials, init_probs, } from "./init.js";
10
+ import { setNewThingFactory } from "./monsters.js";
11
+ import { new_thing } from "./things.js";
12
+ import { new_level } from "./new_level.js";
13
+ import { command } from "./command.js";
14
+ import { runners } from "./chase.js";
15
+ import { do_daemons, do_fuses } from "./daemon.js";
16
+ import { start_daemon, fuse } from "./daemon.js";
17
+ import { doctor, stomach, swander, rollwand, unconfuse, unsee, sight, nohaste } from "./daemons.js";
18
+ import { land } from "./potions.js";
19
+ import { registerDaemonFunc, restoreGame } from "./save.js";
20
+ // BEFORE and AFTER imported from globals.js
21
+ /**
22
+ * registerAllDaemons: Register all daemon/fuse callbacks for save/restore.
23
+ */
24
+ function registerAllDaemons() {
25
+ registerDaemonFunc("doctor", doctor);
26
+ registerDaemonFunc("stomach", stomach);
27
+ registerDaemonFunc("swander", swander);
28
+ registerDaemonFunc("rollwand", rollwand);
29
+ registerDaemonFunc("unconfuse", unconfuse);
30
+ registerDaemonFunc("unsee", unsee);
31
+ registerDaemonFunc("sight", sight);
32
+ registerDaemonFunc("nohaste", nohaste);
33
+ registerDaemonFunc("land", land);
34
+ }
35
+ /**
36
+ * startRogue: Initialize and run a game of Rogue.
37
+ *
38
+ * This is the primary public API. The caller provides a CursesBackend
39
+ * implementation and optional configuration. Returns a RogueResult
40
+ * describing how the game ended.
41
+ */
42
+ export async function startRogue(backend, options) {
43
+ // Reset all mutable state
44
+ resetState();
45
+ resetIOState();
46
+ // Wire the backend
47
+ setBackend(backend);
48
+ // Wire the circular dependency: monsters.ts needs things.ts new_thing
49
+ setNewThingFactory(new_thing);
50
+ // Register daemon functions for save/restore
51
+ registerAllDaemons();
52
+ // Seed the RNG
53
+ const seed = options?.seed ?? Date.now();
54
+ setRNGSeed(seed);
55
+ state.seed = seed;
56
+ // Player name
57
+ if (options?.playerName) {
58
+ state.whoami = options.playerName;
59
+ }
60
+ // Initialize curses
61
+ const stdscr = backend.initscr();
62
+ state.stdscr = stdscr;
63
+ state.hw = backend.newwin(NUMLINES, NUMCOLS, 0, 0);
64
+ // Initialize data tables and randomize names/colors
65
+ init_probs();
66
+ init_colors();
67
+ init_names();
68
+ init_stones();
69
+ init_materials();
70
+ // Initialize the player
71
+ await init_player();
72
+ // Start daemons
73
+ start_daemon(doctor, 0, AFTER);
74
+ start_daemon(stomach, 0, AFTER);
75
+ fuse(swander, 0, rnd(55) + 1, AFTER);
76
+ // Generate the first level
77
+ new_level();
78
+ state._newLevel = false;
79
+ // Run the game loop
80
+ try {
81
+ await playit();
82
+ }
83
+ catch (err) {
84
+ if (err instanceof RogueExit) {
85
+ // Normal game termination
86
+ }
87
+ else {
88
+ throw err;
89
+ }
90
+ }
91
+ // Clean up curses
92
+ await backend.endwin();
93
+ // Check if this was a save
94
+ if (state._saveData !== null) {
95
+ return {
96
+ outcome: "save",
97
+ gold: state.purse,
98
+ level: state.level,
99
+ saveData: state._saveData,
100
+ };
101
+ }
102
+ return state._result ?? {
103
+ outcome: "quit",
104
+ gold: state.purse,
105
+ level: state.level,
106
+ };
107
+ }
108
+ /**
109
+ * resumeRogue: Resume a saved game from a JSON string.
110
+ *
111
+ * The caller provides the same CursesBackend, plus the save data.
112
+ * Returns a RogueResult when the game ends.
113
+ */
114
+ export async function resumeRogue(backend, saveData) {
115
+ // Reset all mutable state
116
+ resetState();
117
+ resetIOState();
118
+ // Wire the backend
119
+ setBackend(backend);
120
+ setNewThingFactory(new_thing);
121
+ registerAllDaemons();
122
+ // Initialize curses
123
+ const stdscr = backend.initscr();
124
+ state.stdscr = stdscr;
125
+ state.hw = backend.newwin(NUMLINES, NUMCOLS, 0, 0);
126
+ // Restore saved state
127
+ if (!restoreGame(saveData)) {
128
+ await backend.endwin();
129
+ return { outcome: "quit", gold: 0, level: 0 };
130
+ }
131
+ // Restore RNG seed
132
+ setRNGSeed(state.seed);
133
+ // Redraw the level from the places array
134
+ for (let x = 0; x < NUMCOLS; x++) {
135
+ for (let y = 0; y < NUMLINES; y++) {
136
+ const ch = state.places[(x << 5) + y].p_ch;
137
+ const mon = state.places[(x << 5) + y].p_monst;
138
+ if (mon !== null && mon._kind === "monster") {
139
+ backend.mvaddch(y, x, mon.t_disguise.charCodeAt(0));
140
+ }
141
+ else if (ch !== " ") {
142
+ backend.mvaddch(y, x, ch.charCodeAt(0));
143
+ }
144
+ }
145
+ }
146
+ backend.refresh();
147
+ // Run the game loop
148
+ try {
149
+ await playit();
150
+ }
151
+ catch (err) {
152
+ if (err instanceof RogueExit) {
153
+ // Normal game termination
154
+ }
155
+ else {
156
+ throw err;
157
+ }
158
+ }
159
+ await backend.endwin();
160
+ if (state._saveData !== null) {
161
+ return {
162
+ outcome: "save",
163
+ gold: state.purse,
164
+ level: state.level,
165
+ saveData: state._saveData,
166
+ };
167
+ }
168
+ return state._result ?? {
169
+ outcome: "quit",
170
+ gold: state.purse,
171
+ level: state.level,
172
+ };
173
+ }
174
+ // Re-export saveGame for the public API
175
+ export { saveGame } from "./save.js";
176
+ /**
177
+ * playit: The main game loop.
178
+ */
179
+ async function playit() {
180
+ while (state.playing) {
181
+ // Check if we need a new level (from stairs or trap)
182
+ if (state._newLevel) {
183
+ state._newLevel = false;
184
+ new_level();
185
+ }
186
+ // Run BEFORE daemons and fuses
187
+ await do_daemons(BEFORE);
188
+ await do_fuses(BEFORE);
189
+ // C original: ISHASTE gives the player a double turn
190
+ const ntimes = (state.player.t_flags & ISHASTE) ? 2 : 1;
191
+ let monstersTurn = false;
192
+ for (let i = 0; i < ntimes && state.playing && !state._newLevel; i++) {
193
+ monstersTurn = await command();
194
+ }
195
+ // If monsters get a turn
196
+ if (monstersTurn) {
197
+ // Run AFTER daemons and fuses
198
+ await do_daemons(AFTER);
199
+ await do_fuses(AFTER);
200
+ // Move monsters
201
+ if (state.playing) {
202
+ await runners();
203
+ }
204
+ }
205
+ }
206
+ }
207
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
package/dist/misc.d.ts ADDED
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Miscellaneous utility functions.
3
+ * Ported from misc.c
4
+ */
5
+ import type { Coord, Thing, Monster } from "./types.js";
6
+ /**
7
+ * look: Examine the surroundings and update the display.
8
+ * C original: scans 3x3 area around hero, handles dark rooms,
9
+ * hallucination, wake_monster, SEEMONST, and lamp area.
10
+ */
11
+ export declare function look(wakeup: boolean): Promise<void>;
12
+ /**
13
+ * cansee: Returns true if the hero can see a certain coordinate.
14
+ */
15
+ export declare function cansee(y: number, x: number): boolean;
16
+ /**
17
+ * see_monst: Returns true if the hero can see the monster.
18
+ */
19
+ export declare function see_monst(mp: Monster): boolean;
20
+ /**
21
+ * diag_ok: Returns true if it is ok to move diagonally from sp to ep.
22
+ */
23
+ export declare function diag_ok(sp: Coord, ep: Coord): boolean;
24
+ /**
25
+ * find_obj: Find an object at a given position.
26
+ */
27
+ export declare function find_obj(y: number, x: number): Thing | null;
28
+ /**
29
+ * floor_at: Get the floor character at the hero's position.
30
+ */
31
+ export declare function floor_at(): string;
32
+ /**
33
+ * check_level: Check if the player should go up a level of experience.
34
+ */
35
+ export declare function check_level(): Promise<void>;
36
+ /**
37
+ * chg_str: Change the hero's strength.
38
+ */
39
+ export declare function chg_str(amt: number): void;
40
+ /**
41
+ * get_dir: Get a direction from the user.
42
+ * Returns true if a valid direction was obtained.
43
+ */
44
+ export declare function get_dir(): Promise<boolean>;
45
+ /**
46
+ * sign: Return -1, 0, or 1.
47
+ */
48
+ export { sign } from "./util.js";
49
+ /**
50
+ * set_mname: Get the name of a monster for messages.
51
+ */
52
+ export declare function set_mname(tp: Monster): string;
53
+ //# sourceMappingURL=misc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../src/misc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAQ,OAAO,EAAW,MAAM,YAAY,CAAC;AAiBvE;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAsFzD;AAmBD;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAuBpD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAM9C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAOrD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAS3D;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CASjC;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAejD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAczC;AAED;;;GAGG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CA+BhD;AAED;;GAEG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,CAU7C"}