@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
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Combat functions.
3
+ * Ported from fight.c
4
+ */
5
+ import type { Coord, Thing, Monster } from "./types.js";
6
+ /**
7
+ * fight: The player attacks the monster.
8
+ */
9
+ export declare function fight(mp: Coord, weap: Thing | null, thrown: boolean): Promise<boolean>;
10
+ /**
11
+ * attack: The monster attacks the player.
12
+ */
13
+ export declare function attack(mp: Monster): Promise<number>;
14
+ /**
15
+ * swing: Determine if an attack hits.
16
+ */
17
+ export declare function swing(atLvl: number, opArm: number, wplus: number): boolean;
18
+ /**
19
+ * roll_em: Roll to see if the attacker hits the defender.
20
+ * Returns true if hit, damages defender.
21
+ */
22
+ export declare function roll_em(thatt: Monster, thdef: Monster, weap: Thing | null, hurl: boolean): boolean;
23
+ /**
24
+ * hit: Print a hit message.
25
+ */
26
+ export declare function hit(er: string | null, ee: string | null, noend: boolean): Promise<void>;
27
+ /**
28
+ * miss: Print a miss message.
29
+ */
30
+ export declare function miss(er: string | null, ee: string | null, noend: boolean): Promise<void>;
31
+ /**
32
+ * thunk: Print a thrown weapon hit message.
33
+ */
34
+ export declare function thunk(weap: Thing | null, mname: string, noend: boolean): Promise<void>;
35
+ /**
36
+ * bounce: Print a thrown weapon miss message.
37
+ */
38
+ export declare function bounce(weap: Thing | null, mname: string, noend: boolean): Promise<void>;
39
+ /**
40
+ * killed: Called when a monster has been killed.
41
+ */
42
+ export declare function killed(tp: Monster, pr: boolean): Promise<void>;
43
+ /**
44
+ * remove_mon: Remove a monster from the level.
45
+ */
46
+ export declare function remove_mon(mp: Coord, tp: Monster, wasKill: boolean): Promise<void>;
47
+ /**
48
+ * save_throw: See if a save throw is successful.
49
+ * C original: need = 14 - tp->t_stats.s_lvl / 2; roll(1,20) >= need - which
50
+ */
51
+ export declare function save_throw(which: number, tp: Monster): boolean;
52
+ //# sourceMappingURL=fight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fight.d.ts","sourceRoot":"","sources":["../src/fight.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAW,MAAM,YAAY,CAAC;AAoDjE;;GAEG;AACH,wBAAsB,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAgD5F;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAqDzD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAG1E;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,KAAK,GAAG,IAAI,EAClB,IAAI,EAAE,OAAO,GACZ,OAAO,CAuGT;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7F;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9F;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5F;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7F;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BpE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCxF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,CAG9D"}
package/dist/fight.js ADDED
@@ -0,0 +1,508 @@
1
+ /**
2
+ * Combat functions.
3
+ * Ported from fight.c
4
+ */
5
+ import { state, monsters as monsterTemplates, ISHUH, ISRUN, ISTARGET, ISCANC, ISHELD, CANHUH, R_ADDHIT, R_ADDDAM, R_PROTECT, R_SUSTSTR, R_SUSTARM, ISWEARING, VS_POISON, VS_MAGIC, ISPROT, moat, setMoat, } from "./globals.js";
6
+ import { rnd } from "./util.js";
7
+ import { msg, addmsg, endmsg, getBackend } from "./io.js";
8
+ import { _detach } from "./list.js";
9
+ import { set_mname, see_monst, check_level, chg_str } from "./misc.js";
10
+ import { runto } from "./monsters.js";
11
+ // Hit/miss message strings
12
+ const h_names = [
13
+ " scored an excellent hit on ",
14
+ " hit ",
15
+ " have injured ",
16
+ " swing and hit ",
17
+ " scored an excellent hit on ",
18
+ " hit ",
19
+ " has injured ",
20
+ " swings and hits ",
21
+ ];
22
+ const m_names = [
23
+ " miss",
24
+ " swing and miss",
25
+ " barely miss",
26
+ " don't hit",
27
+ " misses",
28
+ " swings and misses",
29
+ " barely misses",
30
+ " doesn't hit",
31
+ ];
32
+ // Strength adjustments to hit
33
+ const str_plus = [
34
+ -7, -6, -5, -4, -3, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
35
+ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
36
+ ];
37
+ // Strength adjustments to damage
38
+ const add_dam = [
39
+ -7, -6, -5, -4, -3, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3,
40
+ 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
41
+ ];
42
+ /**
43
+ * fight: The player attacks the monster.
44
+ */
45
+ export async function fight(mp, weap, thrown) {
46
+ const tp = moat(mp.y, mp.x);
47
+ if (tp === null || tp._kind !== "monster")
48
+ return false;
49
+ state.count = 0;
50
+ state.quiet = 0;
51
+ runto(mp);
52
+ // Xeroc: reveal on first attack if disguised
53
+ if (tp.t_type === "X" && tp.t_disguise !== "X" && !thrown) {
54
+ tp.t_disguise = "X";
55
+ const backend = getBackend();
56
+ if (see_monst(tp)) {
57
+ backend.mvaddch(mp.y, mp.x, "X".charCodeAt(0));
58
+ }
59
+ }
60
+ const mname = set_mname(tp);
61
+ let didHit = false;
62
+ state.has_hit = state.terse && !state.to_death;
63
+ if (roll_em(state.player, tp, weap, thrown)) {
64
+ if (thrown) {
65
+ await thunk(weap, mname, state.terse);
66
+ }
67
+ else {
68
+ await hit(null, mname, state.terse);
69
+ }
70
+ // CANHUH confusion transfer: if player has CANHUH and hits, confuse the monster
71
+ if (!thrown && (state.player.t_flags & CANHUH) && !(tp.t_flags & ISCANC)) {
72
+ await msg("your hands stop glowing %s", "red");
73
+ state.player.t_flags &= ~CANHUH;
74
+ tp.t_flags |= ISHUH;
75
+ }
76
+ if (tp.t_stats.s_hpt <= 0) {
77
+ await killed(tp, true);
78
+ }
79
+ didHit = true;
80
+ }
81
+ else {
82
+ if (thrown) {
83
+ await bounce(weap, mname, state.terse);
84
+ }
85
+ else {
86
+ await miss(null, mname, state.terse);
87
+ }
88
+ }
89
+ return didHit;
90
+ }
91
+ /**
92
+ * attack: The monster attacks the player.
93
+ */
94
+ export async function attack(mp) {
95
+ state.running = false;
96
+ state.count = 0;
97
+ state.quiet = 0;
98
+ if (state.to_death && !(mp.t_flags & ISTARGET)) {
99
+ state.to_death = false;
100
+ state.kamikaze = false;
101
+ }
102
+ const mname = set_mname(mp);
103
+ const oldHp = state.player.t_stats.s_hpt;
104
+ if (roll_em(mp, state.player, null, false)) {
105
+ if (state.has_hit) {
106
+ addmsg(". ");
107
+ }
108
+ await hit(mname, null, false);
109
+ state.has_hit = false;
110
+ if (state.player.t_stats.s_hpt <= 0) {
111
+ // Player dies
112
+ const { death } = await import("./rip.js");
113
+ await death(mp.t_type);
114
+ return 0;
115
+ }
116
+ // Apply monster special attack effects
117
+ await special_hit(mp);
118
+ if (state.player.t_stats.s_hpt <= 0) {
119
+ const { death } = await import("./rip.js");
120
+ await death(mp.t_type);
121
+ return 0;
122
+ }
123
+ if (!state.kamikaze) {
124
+ const damage = oldHp - state.player.t_stats.s_hpt;
125
+ if (damage > state.max_hit) {
126
+ state.max_hit = damage;
127
+ }
128
+ if (state.player.t_stats.s_hpt <= state.max_hit) {
129
+ state.to_death = false;
130
+ }
131
+ }
132
+ }
133
+ else {
134
+ if (state.has_hit) {
135
+ addmsg(". ");
136
+ }
137
+ await miss(mname, null, false);
138
+ }
139
+ return 1;
140
+ }
141
+ /**
142
+ * swing: Determine if an attack hits.
143
+ */
144
+ export function swing(atLvl, opArm, wplus) {
145
+ const need = 20 - atLvl - opArm;
146
+ return rollDice(1, 20) >= need;
147
+ }
148
+ /**
149
+ * roll_em: Roll to see if the attacker hits the defender.
150
+ * Returns true if hit, damages defender.
151
+ */
152
+ export function roll_em(thatt, thdef, weap, hurl) {
153
+ const attStats = thatt.t_stats;
154
+ const defStats = thdef.t_stats;
155
+ // Parse damage string
156
+ let damageStr;
157
+ if (weap !== null && weap._kind === "object") {
158
+ damageStr = hurl ? weap.o_hurldmg : weap.o_damage;
159
+ }
160
+ else {
161
+ damageStr = attStats.s_dmg;
162
+ }
163
+ let didHit = false;
164
+ const isPlayerAttacking = thatt === state.player;
165
+ const isPlayerDefending = thdef === state.player;
166
+ // Each damage component (e.g., "1x8/1x8/2x6")
167
+ const parts = damageStr.split("/");
168
+ for (const part of parts) {
169
+ const match = part.match(/(\d+)x(\d+)/);
170
+ if (!match)
171
+ continue;
172
+ const ndice = parseInt(match[1], 10);
173
+ const nsides = parseInt(match[2], 10);
174
+ // Determine to-hit bonus
175
+ let hplus = 0;
176
+ let dplus = 0;
177
+ if (weap !== null && weap._kind === "object") {
178
+ hplus = weap.o_hplus;
179
+ dplus = weap.o_dplus;
180
+ }
181
+ if (isPlayerAttacking) {
182
+ const strIdx = Math.min(attStats.s_str, 31);
183
+ hplus += str_plus[strIdx];
184
+ dplus += add_dam[strIdx];
185
+ // Sleeping monster bonus: +4 to hit if monster isn't running
186
+ if (!isPlayerDefending && thdef !== state.player && !(thdef.t_flags & ISRUN)) {
187
+ hplus += 4;
188
+ }
189
+ // Launcher bonus: if hurling a missile with matching launcher
190
+ if (hurl && weap !== null && weap._kind === "object" && weap.o_launch >= 0) {
191
+ const curWeap = state.cur_weapon;
192
+ if (curWeap !== null && curWeap._kind === "object" && curWeap.o_which === weap.o_launch) {
193
+ hplus += curWeap.o_hplus;
194
+ dplus += curWeap.o_dplus;
195
+ }
196
+ }
197
+ // Ring bonuses
198
+ if (ISWEARING(R_ADDHIT)) {
199
+ const ring = state.cur_ring[0];
200
+ if (ring !== null && ring._kind === "object" && ring.o_which === R_ADDHIT) {
201
+ hplus += ring.o_arm;
202
+ }
203
+ const ring2 = state.cur_ring[1];
204
+ if (ring2 !== null && ring2._kind === "object" && ring2.o_which === R_ADDHIT) {
205
+ hplus += ring2.o_arm;
206
+ }
207
+ }
208
+ if (ISWEARING(R_ADDDAM)) {
209
+ const ring = state.cur_ring[0];
210
+ if (ring !== null && ring._kind === "object" && ring.o_which === R_ADDDAM) {
211
+ dplus += ring.o_arm;
212
+ }
213
+ const ring2 = state.cur_ring[1];
214
+ if (ring2 !== null && ring2._kind === "object" && ring2.o_which === R_ADDDAM) {
215
+ dplus += ring2.o_arm;
216
+ }
217
+ }
218
+ }
219
+ // Determine defender's armor class
220
+ let defArm = defStats.s_arm;
221
+ if (isPlayerDefending) {
222
+ if (state.cur_armor !== null && state.cur_armor._kind === "object") {
223
+ defArm = state.cur_armor.o_arm;
224
+ }
225
+ // R_PROTECT ring bonus
226
+ if (ISWEARING(R_PROTECT)) {
227
+ for (let hand = 0; hand < 2; hand++) {
228
+ const ring = state.cur_ring[hand];
229
+ if (ring !== null && ring._kind === "object" && ring.o_which === R_PROTECT) {
230
+ defArm -= ring.o_arm;
231
+ }
232
+ }
233
+ }
234
+ }
235
+ // Check if this attack hits
236
+ if (swing(attStats.s_lvl, defArm, hplus)) {
237
+ let damage = rollDice(ndice, nsides) + dplus;
238
+ if (damage < 0)
239
+ damage = 0;
240
+ defStats.s_hpt -= damage;
241
+ didHit = true;
242
+ }
243
+ }
244
+ return didHit;
245
+ }
246
+ /**
247
+ * hit: Print a hit message.
248
+ */
249
+ export async function hit(er, ee, noend) {
250
+ const attackerName = er === null ? "you" : er;
251
+ const defenderName = ee === null ? "you" : ee;
252
+ const idx = er === null ? rnd(4) : rnd(4) + 4;
253
+ addmsg(attackerName + h_names[idx] + defenderName);
254
+ if (!noend) {
255
+ await endmsg();
256
+ }
257
+ }
258
+ /**
259
+ * miss: Print a miss message.
260
+ */
261
+ export async function miss(er, ee, noend) {
262
+ const attackerName = er === null ? "you" : er;
263
+ const defenderName = ee === null ? " you" : " " + ee;
264
+ addmsg(attackerName + m_names[er === null ? rnd(4) : rnd(4) + 4] + defenderName);
265
+ if (!noend) {
266
+ await endmsg();
267
+ }
268
+ }
269
+ /**
270
+ * thunk: Print a thrown weapon hit message.
271
+ */
272
+ export async function thunk(weap, mname, noend) {
273
+ addmsg("the missile hit " + mname);
274
+ if (!noend) {
275
+ await endmsg();
276
+ }
277
+ }
278
+ /**
279
+ * bounce: Print a thrown weapon miss message.
280
+ */
281
+ export async function bounce(weap, mname, noend) {
282
+ addmsg("the missile misses " + mname);
283
+ if (!noend) {
284
+ await endmsg();
285
+ }
286
+ }
287
+ /**
288
+ * killed: Called when a monster has been killed.
289
+ */
290
+ export async function killed(tp, pr) {
291
+ const monsterIndex = tp.t_type.charCodeAt(0) - "A".charCodeAt(0);
292
+ const mname = monsterTemplates[monsterIndex].m_name;
293
+ if (pr) {
294
+ if (state.has_hit) {
295
+ addmsg(". ");
296
+ state.has_hit = false;
297
+ }
298
+ addmsg("you defeated ");
299
+ await msg("the %s", mname);
300
+ }
301
+ state.player.t_stats.s_exp += tp.t_stats.s_exp;
302
+ await check_level();
303
+ // Flytrap death: release the player
304
+ if (tp.t_type === "F") {
305
+ state.player.t_flags &= ~ISHELD;
306
+ state.vf_hit = 0;
307
+ }
308
+ // Leprechaun death: drop stolen gold
309
+ if (tp.t_type === "L" && tp.t_reserved > 0) {
310
+ state.purse += tp.t_reserved;
311
+ await msg("you find %d gold pieces", tp.t_reserved);
312
+ tp.t_reserved = 0;
313
+ }
314
+ // Remove monster from the map
315
+ await remove_mon(tp.t_pos, tp, true);
316
+ }
317
+ /**
318
+ * remove_mon: Remove a monster from the level.
319
+ */
320
+ export async function remove_mon(mp, tp, wasKill) {
321
+ const backend = getBackend();
322
+ // Detach from monster list
323
+ const mlistHead = { head: state.mlist };
324
+ _detach(mlistHead, tp);
325
+ state.mlist = mlistHead.head;
326
+ // Restore the character on the map
327
+ setMoat(mp.y, mp.x, null);
328
+ const oldCh = tp.t_oldch;
329
+ if (see_monst(tp)) {
330
+ backend.mvaddch(mp.y, mp.x, oldCh.charCodeAt(0));
331
+ }
332
+ // Drop any items the monster was carrying
333
+ if (tp.t_pack !== null) {
334
+ const { _attach: attachItem } = await import("./list.js");
335
+ const { setCh: setChAt, flat: flatAt, setFlat: setFlatAt, F_DROPPED: fDropped } = await import("./globals.js");
336
+ let item = tp.t_pack;
337
+ while (item !== null) {
338
+ const next = item.l_next;
339
+ item.l_next = null;
340
+ item.l_prev = null;
341
+ if (item._kind === "object") {
342
+ item.o_pos.y = mp.y;
343
+ item.o_pos.x = mp.x;
344
+ const typeCh = String.fromCharCode(item.o_type);
345
+ const listHead = { head: state.lvl_obj };
346
+ attachItem(listHead, item);
347
+ state.lvl_obj = listHead.head;
348
+ setChAt(mp.y, mp.x, typeCh);
349
+ setFlatAt(mp.y, mp.x, flatAt(mp.y, mp.x) | fDropped);
350
+ }
351
+ item = next;
352
+ }
353
+ tp.t_pack = null;
354
+ }
355
+ }
356
+ /**
357
+ * save_throw: See if a save throw is successful.
358
+ * C original: need = 14 - tp->t_stats.s_lvl / 2; roll(1,20) >= need - which
359
+ */
360
+ export function save_throw(which, tp) {
361
+ const need = 14 - Math.floor(tp.t_stats.s_lvl / 2);
362
+ return rollDice(1, 20) >= need - which;
363
+ }
364
+ /**
365
+ * special_hit: Handle monster special attack effects after a hit.
366
+ */
367
+ async function special_hit(mp) {
368
+ if (mp.t_flags & ISCANC)
369
+ return;
370
+ switch (mp.t_type) {
371
+ case "A": // Aquator — rust armor
372
+ await rust_armor(mp);
373
+ break;
374
+ case "I": // Ice Monster — freeze player
375
+ state.no_command += rnd(2) + 2;
376
+ if (state.no_command > 1) {
377
+ await msg("you are frozen");
378
+ }
379
+ break;
380
+ case "R": // Rattlesnake — poison
381
+ if (!save_throw(VS_POISON, state.player) && !ISWEARING(R_SUSTSTR)) {
382
+ chg_str(-1);
383
+ await msg("you feel a bite in your leg and now feel weaker");
384
+ }
385
+ break;
386
+ case "W": // Wraith — drain experience level
387
+ if (rnd(100) < 15) {
388
+ const playerStats = state.player.t_stats;
389
+ if (playerStats.s_exp === 0) {
390
+ // Already at minimum
391
+ const { death } = await import("./rip.js");
392
+ await death("W");
393
+ }
394
+ else {
395
+ playerStats.s_exp = Math.floor(playerStats.s_exp / 2);
396
+ if (playerStats.s_lvl > 1) {
397
+ playerStats.s_lvl--;
398
+ const lostHp = rollDice(1, 10);
399
+ playerStats.s_maxhp -= lostHp;
400
+ if (playerStats.s_maxhp < 2)
401
+ playerStats.s_maxhp = 2;
402
+ if (playerStats.s_hpt > playerStats.s_maxhp) {
403
+ playerStats.s_hpt = playerStats.s_maxhp;
404
+ }
405
+ }
406
+ await msg("you suddenly feel weaker");
407
+ }
408
+ }
409
+ break;
410
+ case "F": // Venus Flytrap — hold and digest
411
+ state.player.t_flags |= ISHELD;
412
+ state.vf_hit++;
413
+ if (state.vf_hit >= mp.t_stats.s_dmg.split("/").length) {
414
+ // Already got max hits, digest
415
+ const damage = (state.vf_hit + 1) * 2;
416
+ state.player.t_stats.s_hpt -= damage;
417
+ }
418
+ break;
419
+ case "L": // Leprechaun — steal gold
420
+ if (state.purse > 0) {
421
+ const stolen = rollDice(1, 10) * 50;
422
+ const actualStolen = Math.min(stolen, state.purse);
423
+ state.purse -= actualStolen;
424
+ mp.t_reserved = actualStolen; // store stolen gold for drop on death
425
+ await msg("your purse feels lighter");
426
+ }
427
+ break;
428
+ case "N": // Nymph — steal a random item
429
+ {
430
+ let count = 0;
431
+ let item = state.player.t_pack;
432
+ while (item !== null) {
433
+ count++;
434
+ item = item.l_next;
435
+ }
436
+ if (count > 0) {
437
+ let target = rnd(count);
438
+ item = state.player.t_pack;
439
+ while (item !== null && target > 0) {
440
+ target--;
441
+ item = item.l_next;
442
+ }
443
+ if (item !== null && item._kind === "object") {
444
+ if (item === state.cur_armor)
445
+ state.cur_armor = null;
446
+ if (item === state.cur_weapon)
447
+ state.cur_weapon = null;
448
+ if (item === state.cur_ring[0])
449
+ state.cur_ring[0] = null;
450
+ if (item === state.cur_ring[1])
451
+ state.cur_ring[1] = null;
452
+ const packIdx = item.o_packch.charCodeAt(0) - "a".charCodeAt(0);
453
+ if (packIdx >= 0 && packIdx < 26)
454
+ state.pack_used[packIdx] = false;
455
+ const packHead = { head: state.player.t_pack };
456
+ _detach(packHead, item);
457
+ state.player.t_pack = packHead.head;
458
+ state.inpack--;
459
+ const { inv_name: invName } = await import("./things.js");
460
+ await msg("she stole %s!", invName(item, false));
461
+ }
462
+ }
463
+ }
464
+ break;
465
+ case "V": // Vampire — drain max HP
466
+ if (!save_throw(VS_MAGIC, state.player)) {
467
+ const playerStats = state.player.t_stats;
468
+ playerStats.s_maxhp -= 1;
469
+ if (playerStats.s_hpt > playerStats.s_maxhp) {
470
+ playerStats.s_hpt = playerStats.s_maxhp;
471
+ }
472
+ if (playerStats.s_maxhp <= 0) {
473
+ const { death } = await import("./rip.js");
474
+ await death("V");
475
+ }
476
+ await msg("you feel weaker");
477
+ }
478
+ break;
479
+ }
480
+ }
481
+ /**
482
+ * rust_armor: Rust the player's armor (called by Aquator hit and rust trap).
483
+ */
484
+ async function rust_armor(mp) {
485
+ if (state.cur_armor === null || state.cur_armor._kind !== "object")
486
+ return;
487
+ if (ISWEARING(R_SUSTARM)) {
488
+ if (mp !== null) {
489
+ await msg("the %s's hit doesn't affect your armor", monsterTemplates[mp.t_type.charCodeAt(0) - "A".charCodeAt(0)].m_name);
490
+ }
491
+ return;
492
+ }
493
+ if (state.cur_armor.o_flags & ISPROT)
494
+ return;
495
+ const armor = state.cur_armor;
496
+ armor.o_arm++;
497
+ if (armor.o_arm > 9)
498
+ armor.o_arm = 9;
499
+ await msg("your armor appears to be weaker");
500
+ }
501
+ function rollDice(number, sides) {
502
+ let total = 0;
503
+ for (let i = 0; i < number; i++) {
504
+ total += rnd(sides) + 1;
505
+ }
506
+ return total;
507
+ }
508
+ //# sourceMappingURL=fight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fight.js","sourceRoot":"","sources":["../src/fight.ts"],"names":[],"mappings":"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"}