@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/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 TickTockBent
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# rogue-ts
|
|
2
|
+
|
|
3
|
+
A faithful TypeScript port of **Rogue 5.4.4**, the 1980 dungeon crawler that started the roguelike genre.
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
__________
|
|
7
|
+
/ \
|
|
8
|
+
/ REST \
|
|
9
|
+
/ IN \
|
|
10
|
+
/ PEACE \
|
|
11
|
+
/ \
|
|
12
|
+
| adventurer |
|
|
13
|
+
| 142 Au |
|
|
14
|
+
| killed by a |
|
|
15
|
+
| hobgoblin |
|
|
16
|
+
| on level 3 |
|
|
17
|
+
| |
|
|
18
|
+
*| * * |*
|
|
19
|
+
________)|//\//\///\//\//\//|(________
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## What is this?
|
|
23
|
+
|
|
24
|
+
Rogue is the original dungeon-crawling game. You descend through procedurally generated levels of the Dungeons of Doom, fighting monsters, collecting treasure, and searching for the Amulet of Yendor. Every run is different. When you die, you stay dead. It invented the genre that bears its name.
|
|
25
|
+
|
|
26
|
+
This project is a line-by-line port of the [original C source code](https://github.com/Davidslv/rogue) (Rogue 5.4.4) into TypeScript. It preserves the original game mechanics, formulas, data tables, and behavior — down to the RNG algorithm and the exact damage calculation for a rattlesnake bite.
|
|
27
|
+
|
|
28
|
+
## Why?
|
|
29
|
+
|
|
30
|
+
The original Rogue is tightly coupled to Unix curses and terminal I/O. This port separates the game engine from its display layer, exposing a clean `CursesBackend` interface. You provide the rendering; the engine provides the dungeon.
|
|
31
|
+
|
|
32
|
+
This means Rogue can now run in a browser, in Electron, in a TUI framework, on a canvas, or anywhere else you can draw characters on a grid and read keystrokes.
|
|
33
|
+
|
|
34
|
+
## Architecture
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
┌─────────────────────────────────┐
|
|
38
|
+
│ Your Frontend │
|
|
39
|
+
│ (terminal, browser, canvas) │
|
|
40
|
+
└──────────┬──────────────────────┘
|
|
41
|
+
│ implements CursesBackend
|
|
42
|
+
┌──────────▼──────────────────────┐
|
|
43
|
+
│ rogue-ts engine │
|
|
44
|
+
│ │
|
|
45
|
+
│ 30 source files, ~8000 lines │
|
|
46
|
+
│ Zero runtime dependencies │
|
|
47
|
+
│ Pure ESM, fully async │
|
|
48
|
+
└─────────────────────────────────┘
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**30 source files** mirror the original C source structure:
|
|
52
|
+
|
|
53
|
+
| File | Purpose |
|
|
54
|
+
|------|---------|
|
|
55
|
+
| `main.ts` | Game loop, public API (`startRogue`, `resumeRogue`) |
|
|
56
|
+
| `globals.ts` | All game state, constants, and 16 data tables |
|
|
57
|
+
| `command.ts` | Keyboard input dispatcher (40+ commands) |
|
|
58
|
+
| `rooms.ts` | Room generation and room management |
|
|
59
|
+
| `passages.ts` | Corridor generation between rooms |
|
|
60
|
+
| `new_level.ts` | Level generation orchestrator |
|
|
61
|
+
| `move.ts` | Hero movement and trap effects |
|
|
62
|
+
| `fight.ts` | Combat system with 8 monster special attacks |
|
|
63
|
+
| `chase.ts` | Monster AI and pathfinding |
|
|
64
|
+
| `monsters.ts` | Monster creation, wanderers, Medusa gaze |
|
|
65
|
+
| `pack.ts` | Inventory management |
|
|
66
|
+
| `things.ts` | Item creation and naming |
|
|
67
|
+
| `potions.ts` | 14 potion effects |
|
|
68
|
+
| `scrolls.ts` | 18 scroll effects |
|
|
69
|
+
| `sticks.ts` | 14 wand/staff effects with bolt bouncing |
|
|
70
|
+
| `rings.ts` | 14 ring types |
|
|
71
|
+
| `weapons.ts` | Weapon system with thrown missiles |
|
|
72
|
+
| `armor.ts` | Armor equip/remove |
|
|
73
|
+
| `daemons.ts` | Timed effects (healing, hunger, wandering monsters) |
|
|
74
|
+
| `daemon.ts` | Daemon/fuse scheduling system |
|
|
75
|
+
| `save.ts` | JSON-based save/restore |
|
|
76
|
+
| `rip.ts` | Death, scoring, and victory |
|
|
77
|
+
| `init.ts` | Player creation and item name generation |
|
|
78
|
+
| `misc.ts` | Visibility, `look()`, field-of-view |
|
|
79
|
+
| `io.ts` | Message system and input helpers |
|
|
80
|
+
| `list.ts` | Linked list operations |
|
|
81
|
+
| `util.ts` | RNG, dice rolling, utility functions |
|
|
82
|
+
| `types.ts` | Core data structures |
|
|
83
|
+
| `curses.ts` | `CursesBackend` interface definition |
|
|
84
|
+
| `index.ts` | Public API exports |
|
|
85
|
+
|
|
86
|
+
## Usage
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
import { startRogue } from "@ticktockbent/rogue-ts";
|
|
90
|
+
import type { CursesBackend } from "@ticktockbent/rogue-ts";
|
|
91
|
+
|
|
92
|
+
// Implement the display interface
|
|
93
|
+
const backend: CursesBackend = {
|
|
94
|
+
getch: async () => { /* return keypress */ },
|
|
95
|
+
mvaddch: (y, x, ch) => { /* draw character at position */ },
|
|
96
|
+
mvaddstr: (y, x, str) => { /* draw string at position */ },
|
|
97
|
+
move: (y, x) => { /* move cursor */ },
|
|
98
|
+
refresh: () => { /* flush display */ },
|
|
99
|
+
clear: () => { /* clear screen */ },
|
|
100
|
+
// ... see CursesBackend interface for full API
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// Start the game
|
|
104
|
+
const result = await startRogue(backend, {
|
|
105
|
+
name: "Rodney",
|
|
106
|
+
seed: 42, // optional: deterministic RNG seed
|
|
107
|
+
tombstone: true, // optional: show ASCII tombstone on death
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
console.log(result);
|
|
111
|
+
// { outcome: "death", gold: 142, level: 3, killer: "hobgoblin" }
|
|
112
|
+
// { outcome: "victory", gold: 5832, level: 1 }
|
|
113
|
+
// { outcome: "quit", gold: 0, level: 1 }
|
|
114
|
+
// { outcome: "save", gold: 200, level: 5 }
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Save and Restore
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
import { startRogue, resumeRogue } from "@ticktockbent/rogue-ts";
|
|
121
|
+
|
|
122
|
+
// Game saves return the save data in the result
|
|
123
|
+
const result = await startRogue(backend, { name: "Rodney" });
|
|
124
|
+
if (result.outcome === "save") {
|
|
125
|
+
const saveData = result.saveData; // JSON string
|
|
126
|
+
// Store it however you like (localStorage, file, database)
|
|
127
|
+
|
|
128
|
+
// Later, resume:
|
|
129
|
+
const resumed = await resumeRogue(backend, saveData);
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Building
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
npm install
|
|
137
|
+
npm run build # compile to dist/
|
|
138
|
+
npm run typecheck # type-check without emitting
|
|
139
|
+
npx tsx test/smoke.ts # run 153 smoke tests
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Requires Node.js 18+ and TypeScript 5.x. Zero runtime dependencies.
|
|
143
|
+
|
|
144
|
+
## How faithful is this port?
|
|
145
|
+
|
|
146
|
+
Very. A systematic audit compared every function in all 30 source files against the original Rogue 5.4.4 C source. This produced [37 issues](https://github.com/TickTockBent/rogue-ts/issues?q=is%3Aissue+is%3Aclosed+label%3Ac-source-diff) tracking every discrepancy, all of which have been resolved. Specific areas of fidelity:
|
|
147
|
+
|
|
148
|
+
- **RNG**: Same linear congruential generator as the original (`seed * 11109 + 13849`, high-bit extraction)
|
|
149
|
+
- **Combat**: Exact `swing()` formula (`need = 20 - atLvl - opArm`), armor class from equipped items, protection ring bonuses, sleeping monster +4 hit bonus, launcher weapon bonuses
|
|
150
|
+
- **Monster AI**: 8 special attack types (Aquator rust, Vampire drain, Nymph steal, etc.), Flytrap stationary behavior, greedy monsters chase gold, no diagonal movement in passages
|
|
151
|
+
- **Items**: All 14 potions, 18 scrolls, 14 wands/staffs, 14 rings with correct formulas. Bolt spells bounce off walls. Scare monster scrolls crumble when picked up.
|
|
152
|
+
- **Dungeon generation**: Room placement, passage digging, trap placement, monster and item spawning rates matching the original
|
|
153
|
+
- **Hunger system**: Four-stage progression (hungry, weak, faint, starve) with ring food drain
|
|
154
|
+
- **Visibility**: Dark room lamp radius, hallucination display, see-invisible mechanics
|
|
155
|
+
- **Daemon/fuse system**: BEFORE and AFTER passes per turn, haste double-turns for both player and monsters
|
|
156
|
+
|
|
157
|
+
## What's different from the original?
|
|
158
|
+
|
|
159
|
+
- **Language**: TypeScript instead of C
|
|
160
|
+
- **I/O**: Async — `getch()` returns a `Promise`, allowing non-blocking frontends
|
|
161
|
+
- **Display**: Abstracted behind `CursesBackend` instead of hardcoded curses calls
|
|
162
|
+
- **Data structures**: Linked lists preserved from the original (not replaced with arrays)
|
|
163
|
+
- **State**: All mutable state lives in a single `state` object, making save/restore straightforward
|
|
164
|
+
- **Strings**: Internal characters are JavaScript strings, converted to char codes only at the curses boundary
|
|
165
|
+
- **Save format**: JSON instead of binary memory dump
|
|
166
|
+
|
|
167
|
+
## The Amulet of Yendor
|
|
168
|
+
|
|
169
|
+
Somewhere below level 26, the Amulet of Yendor waits. Find it, carry it back to the surface, and you win. Or die trying — that's more likely. Good luck.
|
|
170
|
+
|
|
171
|
+
## License
|
|
172
|
+
|
|
173
|
+
[MIT](LICENSE)
|
|
174
|
+
|
|
175
|
+
The original Rogue was created by Michael Toy, Glenn Wichman, and Ken Arnold at UC Berkeley, circa 1980. This is a clean-room port from the publicly available source code.
|
package/dist/armor.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Armor functions.
|
|
3
|
+
* Ported from armor.c
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* wear: The wear command — put on armor.
|
|
7
|
+
*/
|
|
8
|
+
export declare function wear(): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* take_off: The take-off command — remove armor.
|
|
11
|
+
*/
|
|
12
|
+
export declare function take_off(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* waste_time: Do nothing but let daemons/fuses advance.
|
|
15
|
+
* Called when putting on or removing armor.
|
|
16
|
+
*/
|
|
17
|
+
export declare function waste_time(): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=armor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"armor.d.ts","sourceRoot":"","sources":["../src/armor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA4B1C;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAsB9C;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAahD"}
|
package/dist/armor.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Armor functions.
|
|
3
|
+
* Ported from armor.c
|
|
4
|
+
*/
|
|
5
|
+
import { state, ARMOR, ISCURSED, ISKNOW, } from "./globals.js";
|
|
6
|
+
import { msg } from "./io.js";
|
|
7
|
+
import { get_item } from "./pack.js";
|
|
8
|
+
import { inv_name } from "./things.js";
|
|
9
|
+
/**
|
|
10
|
+
* wear: The wear command — put on armor.
|
|
11
|
+
*/
|
|
12
|
+
export async function wear() {
|
|
13
|
+
if (state.cur_armor !== null) {
|
|
14
|
+
if (!state.terse) {
|
|
15
|
+
await msg("you are already wearing some. You'll have to take it off first");
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
await msg("already wearing some");
|
|
19
|
+
}
|
|
20
|
+
state.after = false;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const obj = await get_item("wear", ARMOR.charCodeAt(0));
|
|
24
|
+
if (obj === null)
|
|
25
|
+
return;
|
|
26
|
+
if (obj.o_type !== ARMOR.charCodeAt(0)) {
|
|
27
|
+
await msg("you can't wear that");
|
|
28
|
+
state.after = false;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
await waste_time();
|
|
32
|
+
obj.o_flags |= ISKNOW;
|
|
33
|
+
state.cur_armor = obj;
|
|
34
|
+
if (!state.terse) {
|
|
35
|
+
await msg("you are now wearing %s", inv_name(obj, true));
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
await msg("wearing %s", inv_name(obj, true));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* take_off: The take-off command — remove armor.
|
|
43
|
+
*/
|
|
44
|
+
export async function take_off() {
|
|
45
|
+
if (state.cur_armor === null) {
|
|
46
|
+
state.after = false;
|
|
47
|
+
if (!state.terse) {
|
|
48
|
+
await msg("you aren't wearing any armor");
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
await msg("not wearing armor");
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (state.cur_armor._kind !== "object")
|
|
56
|
+
return;
|
|
57
|
+
if (state.cur_armor.o_flags & ISCURSED) {
|
|
58
|
+
await msg("you can't. It appears to be cursed");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
await waste_time();
|
|
62
|
+
const armor = state.cur_armor;
|
|
63
|
+
state.cur_armor = null;
|
|
64
|
+
await msg("you used to be wearing %s", inv_name(armor, true));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* waste_time: Do nothing but let daemons/fuses advance.
|
|
68
|
+
* Called when putting on or removing armor.
|
|
69
|
+
*/
|
|
70
|
+
export async function waste_time() {
|
|
71
|
+
const { do_daemons, do_fuses } = await import("./daemon.js");
|
|
72
|
+
const { look } = await import("./misc.js");
|
|
73
|
+
const { status } = await import("./io.js");
|
|
74
|
+
const { BEFORE: B, AFTER: A } = await import("./globals.js");
|
|
75
|
+
await do_daemons(B);
|
|
76
|
+
await do_fuses(B);
|
|
77
|
+
await do_daemons(A);
|
|
78
|
+
await do_fuses(A);
|
|
79
|
+
if (state.running)
|
|
80
|
+
state.after = false;
|
|
81
|
+
await look(false);
|
|
82
|
+
await status();
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=armor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"armor.js","sourceRoot":"","sources":["../src/armor.ts"],"names":[],"mappings":"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"}
|
package/dist/chase.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monster AI — chase and movement.
|
|
3
|
+
* Ported from chase.c
|
|
4
|
+
*/
|
|
5
|
+
import type { Monster } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* runners: Make all running monsters move.
|
|
8
|
+
* C original: haste monsters get a double turn.
|
|
9
|
+
*/
|
|
10
|
+
export declare function runners(): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* do_chase: Make one monster chase/move.
|
|
13
|
+
*/
|
|
14
|
+
export declare function do_chase(tp: Monster): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=chase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chase.d.ts","sourceRoot":"","sources":["../src/chase.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAgB,OAAO,EAAQ,MAAM,YAAY,CAAC;AAe9D;;;GAGG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CA0B7C;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA6EzD"}
|
package/dist/chase.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monster AI — chase and movement.
|
|
3
|
+
* Ported from chase.c
|
|
4
|
+
*/
|
|
5
|
+
import { state, NUMLINES, NUMCOLS, GOLD, ISRUN, ISHELD, ISSLOW, ISHASTE, ISGREED, ISGONE, ISDARK, F_PASS, chat, flat, moat, setMoat, winat, } from "./globals.js";
|
|
6
|
+
import { ce } from "./util.js";
|
|
7
|
+
import { step_ok, getBackend } from "./io.js";
|
|
8
|
+
import { diag_ok, see_monst } from "./misc.js";
|
|
9
|
+
import { attack } from "./fight.js";
|
|
10
|
+
import { roomin } from "./rooms.js";
|
|
11
|
+
/**
|
|
12
|
+
* runners: Make all running monsters move.
|
|
13
|
+
* C original: haste monsters get a double turn.
|
|
14
|
+
*/
|
|
15
|
+
export async function runners() {
|
|
16
|
+
let tp = state.mlist;
|
|
17
|
+
while (tp !== null) {
|
|
18
|
+
const next = tp.l_next; // save next before potential removal
|
|
19
|
+
if (tp._kind === "monster" && (tp.t_flags & ISRUN)) {
|
|
20
|
+
if (!(tp.t_flags & ISHELD)) {
|
|
21
|
+
// Slow monsters only move every other turn
|
|
22
|
+
if (tp.t_flags & ISSLOW) {
|
|
23
|
+
tp.t_turn = !tp.t_turn;
|
|
24
|
+
if (!tp.t_turn) {
|
|
25
|
+
tp = next;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// First move
|
|
30
|
+
await do_chase(tp);
|
|
31
|
+
// Haste: double move (C original: ntimes=2 for ISHASTE)
|
|
32
|
+
if (tp.t_flags & ISHASTE) {
|
|
33
|
+
await do_chase(tp);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
tp = next;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* do_chase: Make one monster chase/move.
|
|
42
|
+
*/
|
|
43
|
+
export async function do_chase(tp) {
|
|
44
|
+
const backend = getBackend();
|
|
45
|
+
const heroPos = state.player.t_pos;
|
|
46
|
+
// Flytrap (F): stationary — only attacks adjacent hero
|
|
47
|
+
if (tp.t_type === "F") {
|
|
48
|
+
if (Math.abs(tp.t_pos.y - heroPos.y) <= 1 &&
|
|
49
|
+
Math.abs(tp.t_pos.x - heroPos.x) <= 1) {
|
|
50
|
+
await attack(tp);
|
|
51
|
+
}
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Set destination
|
|
55
|
+
// ISGREED: chase nearest gold pile if not carrying gold
|
|
56
|
+
if ((tp.t_flags & ISGREED) && tp.t_reserved === 0) {
|
|
57
|
+
let bestGold = null;
|
|
58
|
+
let bestDist = Infinity;
|
|
59
|
+
let item = state.lvl_obj;
|
|
60
|
+
while (item !== null) {
|
|
61
|
+
if (item._kind === "object" && item.o_type === GOLD.charCodeAt(0)) {
|
|
62
|
+
const dist = (item.o_pos.x - tp.t_pos.x) ** 2 +
|
|
63
|
+
(item.o_pos.y - tp.t_pos.y) ** 2;
|
|
64
|
+
if (dist < bestDist) {
|
|
65
|
+
bestDist = dist;
|
|
66
|
+
bestGold = item.o_pos;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
item = item.l_next;
|
|
70
|
+
}
|
|
71
|
+
tp.t_dest = bestGold !== null ? bestGold : heroPos;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
tp.t_dest = heroPos;
|
|
75
|
+
}
|
|
76
|
+
const dest = tp.t_dest;
|
|
77
|
+
// Find direction to move
|
|
78
|
+
const newPos = chase(tp, dest);
|
|
79
|
+
if (newPos === null)
|
|
80
|
+
return;
|
|
81
|
+
// Check if monster reached the hero
|
|
82
|
+
if (ce(newPos, heroPos)) {
|
|
83
|
+
await attack(tp);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Move the monster
|
|
87
|
+
const oldPos = { y: tp.t_pos.y, x: tp.t_pos.x };
|
|
88
|
+
const oldRoom = tp.t_room;
|
|
89
|
+
const newRoom = roomin(newPos);
|
|
90
|
+
// Erase from old position if visible
|
|
91
|
+
if (see_monst(tp)) {
|
|
92
|
+
backend.mvaddch(oldPos.y, oldPos.x, tp.t_oldch.charCodeAt(0));
|
|
93
|
+
}
|
|
94
|
+
// Update moat
|
|
95
|
+
setMoat(oldPos.y, oldPos.x, null);
|
|
96
|
+
// Save character at new position before placing monster
|
|
97
|
+
tp.t_oldch = chat(newPos.y, newPos.x);
|
|
98
|
+
tp.t_pos = { y: newPos.y, x: newPos.x };
|
|
99
|
+
setMoat(newPos.y, newPos.x, tp);
|
|
100
|
+
tp.t_room = newRoom;
|
|
101
|
+
// If leaving a room to a passage in a dark room, erase the door area
|
|
102
|
+
if (oldRoom !== null && oldRoom !== newRoom &&
|
|
103
|
+
(oldRoom.r_flags & ISDARK) && !(oldRoom.r_flags & ISGONE)) {
|
|
104
|
+
// Monster left a dark room — it was visible at the door, now gone
|
|
105
|
+
}
|
|
106
|
+
// Draw monster at new position if visible
|
|
107
|
+
if (see_monst(tp)) {
|
|
108
|
+
backend.mvaddch(newPos.y, newPos.x, tp.t_disguise.charCodeAt(0));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* chase: Find best adjacent cell to move toward destination.
|
|
113
|
+
* C original: in passages, no diagonal movement.
|
|
114
|
+
*/
|
|
115
|
+
function chase(tp, dest) {
|
|
116
|
+
const curPos = tp.t_pos;
|
|
117
|
+
let bestDist = Infinity;
|
|
118
|
+
let bestPos = null;
|
|
119
|
+
// Check if monster is in a passage (no diagonal movement allowed)
|
|
120
|
+
const inPassage = (flat(curPos.y, curPos.x) & F_PASS) !== 0;
|
|
121
|
+
for (let dy = -1; dy <= 1; dy++) {
|
|
122
|
+
for (let dx = -1; dx <= 1; dx++) {
|
|
123
|
+
if (dy === 0 && dx === 0)
|
|
124
|
+
continue;
|
|
125
|
+
// C original: no diagonal movement in passages
|
|
126
|
+
if (inPassage && dy !== 0 && dx !== 0)
|
|
127
|
+
continue;
|
|
128
|
+
const ny = curPos.y + dy;
|
|
129
|
+
const nx = curPos.x + dx;
|
|
130
|
+
if (ny <= 0 || ny >= NUMLINES - 1 || nx < 0 || nx >= NUMCOLS)
|
|
131
|
+
continue;
|
|
132
|
+
if (!diag_ok(curPos, { y: ny, x: nx }))
|
|
133
|
+
continue;
|
|
134
|
+
const ch = winat(ny, nx);
|
|
135
|
+
// Can the monster step here?
|
|
136
|
+
if (!step_ok(ch) && (ny !== dest.y || nx !== dest.x))
|
|
137
|
+
continue;
|
|
138
|
+
// Don't step on other monsters (unless it's the hero's position)
|
|
139
|
+
if (moat(ny, nx) !== null &&
|
|
140
|
+
!(ny === state.player.t_pos.y && nx === state.player.t_pos.x))
|
|
141
|
+
continue;
|
|
142
|
+
const distance = (dest.x - nx) * (dest.x - nx) +
|
|
143
|
+
(dest.y - ny) * (dest.y - ny);
|
|
144
|
+
if (distance < bestDist) {
|
|
145
|
+
bestDist = distance;
|
|
146
|
+
bestPos = { y: ny, x: nx };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return bestPos;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=chase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chase.js","sourceRoot":"","sources":["../src/chase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command dispatcher.
|
|
3
|
+
* Ported from command.c
|
|
4
|
+
*
|
|
5
|
+
* Handles all key input during the main game loop.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* command: Read and execute a command.
|
|
9
|
+
* Returns true if the turn should end (monsters move).
|
|
10
|
+
*/
|
|
11
|
+
export declare function command(): Promise<boolean>;
|
|
12
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyDH;;;GAGG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAgahD"}
|