@maka/maka-cli 5.3.17 → 5.5.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/bundle/typescript/package.json +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/archetypes.d.ts +62 -0
- package/bundle/typescript/src/commands/game/sideQuest/archetypes.js +196 -0
- package/bundle/typescript/src/commands/game/sideQuest/archetypes.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/advance.d.ts +16 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/advance.js +65 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/advance.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/assense.d.ts +16 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/assense.js +122 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/assense.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/attack.d.ts +42 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/attack.js +243 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/attack.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.d.ts +16 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js +39 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/brandish.d.ts +21 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/brandish.js +82 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/brandish.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.d.ts +28 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js +101 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/call.d.ts +19 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/call.js +219 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/call.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/cast.d.ts +58 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js +397 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/command-registry.d.ts +11 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/command-registry.js +8 -3
- package/bundle/typescript/src/commands/game/sideQuest/commands/command-registry.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/command.d.ts +6 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/command.js +4 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/command.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/drone.d.ts +15 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/drone.js +72 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/drone.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/drop.js +3 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/drop.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/edge.d.ts +13 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/edge.js +31 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/edge.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/end-call.d.ts +6 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/end-call.js +27 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/end-call.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/equip.d.ts +4 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/equip.js +59 -2
- package/bundle/typescript/src/commands/game/sideQuest/commands/equip.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/equipment.d.ts +13 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/equipment.js +50 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/equipment.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/give.js +7 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/give.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/go.d.ts +13 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/go.js +147 -4
- package/bundle/typescript/src/commands/game/sideQuest/commands/go.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/hack.d.ts +25 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js +199 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/haggle.d.ts +15 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/haggle.js +75 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/haggle.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/inv.d.ts +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/inv.js +43 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/inv.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/jack.d.ts +17 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/jack.js +64 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/jack.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/kill.d.ts +10 -3
- package/bundle/typescript/src/commands/game/sideQuest/commands/kill.js +11 -33
- package/bundle/typescript/src/commands/game/sideQuest/commands/kill.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/look.js +47 -4
- package/bundle/typescript/src/commands/game/sideQuest/commands/look.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/map.d.ts +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/map.js +46 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/map.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/pan.d.ts +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/pan.js +55 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/pan.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/persuade.d.ts +18 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/persuade.js +100 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/persuade.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/pick.d.ts +10 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js +33 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/project.d.ts +19 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/project.js +54 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/project.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/read.js +6 -5
- package/bundle/typescript/src/commands/game/sideQuest/commands/read.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/reboot.d.ts +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/reboot.js +52 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/reboot.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/reload.d.ts +14 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/reload.js +40 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/reload.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/rest.d.ts +15 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js +59 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/say.js +31 -2
- package/bundle/typescript/src/commands/game/sideQuest/commands/say.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/search.js +71 -7
- package/bundle/typescript/src/commands/game/sideQuest/commands/search.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.d.ts +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js +58 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/silent.d.ts +13 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/silent.js +50 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/silent.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/sneak.d.ts +15 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/sneak.js +35 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/sneak.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/solve.js +32 -11
- package/bundle/typescript/src/commands/game/sideQuest/commands/solve.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/spells.d.ts +14 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/spells.js +86 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/spells.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/stance.d.ts +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/stance.js +41 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/stance.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/subdue.d.ts +21 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/subdue.js +43 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/subdue.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/surrender.d.ts +20 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/surrender.js +45 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/surrender.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/take.d.ts +8 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/take.js +138 -2
- package/bundle/typescript/src/commands/game/sideQuest/commands/take.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/talk.js +8 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/talk.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/unequip.js +6 -3
- package/bundle/typescript/src/commands/game/sideQuest/commands/unequip.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/unlock.js +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/unlock.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/use.d.ts +24 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/use.js +102 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/use.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/item-factory.js +2 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/item-factory.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/npc-factory.js +7 -2
- package/bundle/typescript/src/commands/game/sideQuest/factories/npc-factory.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/puzzle-factory.js +2 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/puzzle-factory.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/room-factory.js +3 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/room-factory.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.d.ts +175 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +673 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.d.ts +8 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js +139 -21
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.d.ts +174 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js +647 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +138 -9
- package/bundle/typescript/src/commands/game/sideQuest/game.js +757 -197
- package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/minigames/hack-minigame.d.ts +16 -0
- package/bundle/typescript/src/commands/game/sideQuest/minigames/hack-minigame.js +101 -0
- package/bundle/typescript/src/commands/game/sideQuest/minigames/hack-minigame.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/minigames/lockpick-minigame.d.ts +15 -0
- package/bundle/typescript/src/commands/game/sideQuest/minigames/lockpick-minigame.js +95 -0
- package/bundle/typescript/src/commands/game/sideQuest/minigames/lockpick-minigame.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/door.d.ts +10 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/door.js +15 -2
- package/bundle/typescript/src/commands/game/sideQuest/models/door.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/inventory.d.ts +10 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/inventory.js +54 -4
- package/bundle/typescript/src/commands/game/sideQuest/models/inventory.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/item.d.ts +41 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/item.js +106 -3
- package/bundle/typescript/src/commands/game/sideQuest/models/item.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.d.ts +27 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +312 -50
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +278 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js +661 -9
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.d.ts +75 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js +199 -6
- package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/room.d.ts +24 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/room.js +53 -18
- package/bundle/typescript/src/commands/game/sideQuest/models/room.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/scene.d.ts +73 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/scene.js +208 -3
- package/bundle/typescript/src/commands/game/sideQuest/models/scene.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/scenes/scene1.json +319 -70
- package/bundle/typescript/src/commands/game/sideQuest/scenes/scene2.json +661 -227
- package/bundle/typescript/src/commands/game/sideQuest/types/player-equipment.d.ts +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/exit-seed.d.ts +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/item-seed.d.ts +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/npc-seed.d.ts +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/player-seed.d.ts +42 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/puzzle-seed.d.ts +15 -1
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/room-seed.d.ts +4 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/scene-seed.d.ts +8 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/win-condition-seed.d.ts +15 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/win-condition-seed.js +2 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/win-condition-seed.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/shared/abstracts.d.ts +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/shared/abstracts.js +5 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/shared/abstracts.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/types/shared/item-enum.d.ts +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/shared/item-enum.js +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/shared/item-enum.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/ui.d.ts +3 -0
- package/bundle/typescript/src/commands/game/sideQuest/ui.js +95 -6
- package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/auto-fight.d.ts +60 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/auto-fight.js +138 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/auto-fight.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.d.ts +145 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js +354 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/comm-style.d.ts +2 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/comm-style.js +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/comm-style.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/dice.d.ts +22 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/dice.js +34 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/dice.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.d.ts +36 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.js +92 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.d.ts +77 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.js +265 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/planes.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/pursuit.d.ts +16 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/pursuit.js +36 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/pursuit.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +78 -7
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
- package/bundle/typescript/src/commands/set/global.sub.cmd.js +59 -5
- package/bundle/typescript/src/commands/set/global.sub.cmd.js.map +1 -1
- package/bundle/typescript/src/tools/ai/ai.class.d.ts +42 -0
- package/bundle/typescript/src/tools/ai/ai.class.js +117 -0
- package/bundle/typescript/src/tools/ai/ai.class.js.map +1 -0
- package/bundle/typescript/src/tools/fsi/fsi.interfaces.d.ts +1 -0
- package/bundle/typescript/src/tools/fsi/fsi.interfaces.js.map +1 -1
- package/bundle/typescript/src/tools/https/https.class.d.ts +3 -2
- package/bundle/typescript/src/tools/https/https.class.js +51 -2
- package/bundle/typescript/src/tools/https/https.class.js.map +1 -1
- package/bundle/typescript/src/tools/https/https.interface.d.ts +10 -0
- package/package.json +1 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Command } from './command.js';
|
|
2
|
+
import { rollPool, formatRoll } from '../utilities/dice.js';
|
|
3
|
+
/**
|
|
4
|
+
* The free road to STUN recovery (stim patches are the fast, risky one --
|
|
5
|
+
* see use.ts): catch your breath somewhere safe. "Safe" means a
|
|
6
|
+
* Residence-type room (your Hideout qualifies) or a room with no one else
|
|
7
|
+
* in it -- nobody naps in front of an audience in the sprawl. Each rest
|
|
8
|
+
* rolls Body and recovers hits + 1 stun; repeat as needed. Rest never
|
|
9
|
+
* touches the physical track (bullet holes take medkits or a heal spell),
|
|
10
|
+
* and you can't rest mid-combat-exchange.
|
|
11
|
+
*/
|
|
12
|
+
export class RestCommand extends Command {
|
|
13
|
+
static verb = 'rest';
|
|
14
|
+
static description = 'Catch your breath somewhere safe to recover Stun (spell drain, stim crashes). Physical wounds need a medkit or a heal spell.';
|
|
15
|
+
async execute(_args = []) {
|
|
16
|
+
const actor = this.actor;
|
|
17
|
+
const room = actor.currentLocation;
|
|
18
|
+
if (actor.isIncapacitated()) {
|
|
19
|
+
return `You're past resting.`;
|
|
20
|
+
}
|
|
21
|
+
if (actor === this.scene.getPlayer() && this.scene.isPlayerExchangeActive()) {
|
|
22
|
+
return `Rest? Lead is flying. Survive first.`;
|
|
23
|
+
}
|
|
24
|
+
// Downtime also covers bench work: any damaged cyberdeck carried gets
|
|
25
|
+
// repaired alongside the nap (Logic roll -- soldering is brainwork).
|
|
26
|
+
const damagedDecks = actor.inventory.getAllItems().filter(i => i.isCyberdeck() && i.deckDamage > 0);
|
|
27
|
+
if (actor.stunTaken === 0 && damagedDecks.length === 0) {
|
|
28
|
+
return `Your head's already clear -- nothing to sleep off.`;
|
|
29
|
+
}
|
|
30
|
+
const othersHere = this.scene.getActorsInRoom(room).filter(a => a !== actor);
|
|
31
|
+
const isResidence = room.roomType?.toLowerCase() === 'residence';
|
|
32
|
+
if (!isResidence && othersHere.length > 0) {
|
|
33
|
+
return `Too exposed to rest here with ${othersHere.map(a => a.name).join(', ')} around. Find your hideout, or an empty room.`;
|
|
34
|
+
}
|
|
35
|
+
const lines = [`You find a corner, close your eyes, and let the static drain out.`];
|
|
36
|
+
if (actor.stunTaken > 0) {
|
|
37
|
+
const roll = rollPool(actor.body);
|
|
38
|
+
const recovered = actor.healStun(roll.hits + 1);
|
|
39
|
+
this.logger.write(`RestCommand: ${actor.name} rested and recovered ${recovered} stun (${actor.stunTaken}/${actor.maxStunBoxes}).`);
|
|
40
|
+
lines.push(` Rest: ${formatRoll(roll)}`);
|
|
41
|
+
lines.push(` ${recovered} stun recovered: ${actor.stunSummary()}`);
|
|
42
|
+
}
|
|
43
|
+
for (const deck of damagedDecks) {
|
|
44
|
+
const wasBricked = deck.isBricked;
|
|
45
|
+
const repairRoll = rollPool(actor.logic);
|
|
46
|
+
const repaired = deck.repairDeck(repairRoll.hits + 1);
|
|
47
|
+
this.logger.write(`RestCommand: ${actor.name} repaired ${repaired} boxes on ${deck.name} (${deck.deckDamage}/${deck.maxDeckBoxes}).`);
|
|
48
|
+
lines.push(` Bench work on the ${deck.name}: ${formatRoll(repairRoll)}`);
|
|
49
|
+
lines.push(` ${repaired} box${repaired === 1 ? '' : 'es'} repaired: ${deck.deckSummary()}${wasBricked && !deck.isBricked ? ' -- it boots again.' : ''}`);
|
|
50
|
+
}
|
|
51
|
+
lines.push(actor.stunTaken === 0 && !damagedDecks.some(d => d.deckDamage > 0)
|
|
52
|
+
? ` Head clear, gear humming. Back to work.`
|
|
53
|
+
: ` (Rest again to keep recovering.)`);
|
|
54
|
+
this.actor.performAction('rests', '');
|
|
55
|
+
this.scene.updateStatus();
|
|
56
|
+
return lines.join('\n');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=rest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/rest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Command } from './command.js';
|
|
2
2
|
import { NPC } from '../models/npc.js';
|
|
3
|
+
import { CALL_ICON, CALL_COLOR } from '../utilities/comm-style.js';
|
|
3
4
|
export class SayCommand extends Command {
|
|
4
5
|
static verb = "say";
|
|
5
6
|
static description = "Broadcast a message to everyone in the current room.";
|
|
@@ -15,16 +16,44 @@ export class SayCommand extends Command {
|
|
|
15
16
|
const message = args?.join(' ');
|
|
16
17
|
const currentPlayer = this.actor;
|
|
17
18
|
const scene = this.context.scene;
|
|
19
|
+
// Speaking out loud ends a sneak (see sneak.ts).
|
|
20
|
+
currentPlayer.sneaking = false;
|
|
18
21
|
if (!scene) {
|
|
19
22
|
this.logger.log("Scene is missing from context.");
|
|
20
23
|
return "An error occurred.";
|
|
21
24
|
}
|
|
22
25
|
if (!(this.actor instanceof NPC)) {
|
|
23
|
-
// this.actor is *not* an instance of NPC
|
|
24
|
-
|
|
26
|
+
// this.actor is *not* an instance of NPC. While on a call, tag this
|
|
27
|
+
// the same way as call.ts's own confirmation, so a conversation over
|
|
28
|
+
// comms visually reads as a different "space" than in-person speech.
|
|
29
|
+
const inCall = !!currentPlayer.activeCallPartner;
|
|
30
|
+
const prefix = inCall ? `${CALL_ICON} ` : '';
|
|
31
|
+
this.logger.logWithColor(`${prefix}${message}`, inCall ? CALL_COLOR : 'yellow');
|
|
25
32
|
}
|
|
26
33
|
// Only the current actor says something in their room
|
|
27
34
|
currentPlayer.currentLocation.say(currentPlayer, message);
|
|
35
|
+
// "say" and "call" are deliberately similar -- once a call connects
|
|
36
|
+
// (see call.ts), the two ends keep talking with the same "say" command
|
|
37
|
+
// they already know, but it also reaches whoever they're on the line
|
|
38
|
+
// with, regardless of room. Guarded against double delivery for the
|
|
39
|
+
// (unusual) case where the call partner is actually in the same room.
|
|
40
|
+
// Deliberately NOT awaited (same as call.ts): the partner's reply is
|
|
41
|
+
// an AI round trip that announces itself when it arrives -- awaiting
|
|
42
|
+
// it here held the whole command (and the input box's clear) hostage
|
|
43
|
+
// for seconds, found via a real session where typed text visibly
|
|
44
|
+
// lingered while on a call.
|
|
45
|
+
const partner = currentPlayer.activeCallPartner;
|
|
46
|
+
if (partner && partner.currentLocation !== currentPlayer.currentLocation) {
|
|
47
|
+
void Promise.resolve(partner.hear(currentPlayer, message)).catch(err => {
|
|
48
|
+
this.logger.error(`${partner.name} failed to hear ${currentPlayer.name} over the call: ${err}`);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// An astral voice never reaches meat ears (hear() drops it silently on
|
|
52
|
+
// their end -- see Player.canPerceive), so without this note a
|
|
53
|
+
// projecting player gets no hint their words went nowhere.
|
|
54
|
+
if (currentPlayer.plane === 'astral' && !(this.actor instanceof NPC)) {
|
|
55
|
+
return `Your words ripple out astral -- spirits and projections hear them; the meat world hears nothing.`;
|
|
56
|
+
}
|
|
28
57
|
return "";
|
|
29
58
|
}
|
|
30
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"say.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/say.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"say.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/say.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,OAAO,UAAW,SAAQ,OAAO;IAC3B,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,MAAM,CAAC,WAAW,GAAG,sDAAsD,CAAC;IAC5E,OAAO,CAAsB;IAEvC,YAAY,OAA4B;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAc;QAC1B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,0BAA0B,CAAC;QACpC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAEjC,iDAAiD;QACjD,aAAa,CAAC,QAAQ,GAAG,KAAK,CAAC;QAE/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAClD,OAAO,oBAAoB,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC;YACjC,oEAAoE;YACpE,qEAAqE;YACrE,qEAAqE;YACrE,MAAM,MAAM,GAAG,CAAC,CAAC,aAAa,CAAC,iBAAiB,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,GAAG,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClF,CAAC;QAED,sDAAsD;QACtD,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE1D,oEAAoE;QACpE,uEAAuE;QACvE,qEAAqE;QACrE,oEAAoE;QACpE,sEAAsE;QACtE,qEAAqE;QACrE,qEAAqE;QACrE,qEAAqE;QACrE,iEAAiE;QACjE,4BAA4B;QAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,iBAAiB,CAAC;QAChD,IAAI,OAAO,IAAI,OAAO,CAAC,eAAe,KAAK,aAAa,CAAC,eAAe,EAAE,CAAC;YACzE,KAAK,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACrE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,mBAAmB,aAAa,CAAC,IAAI,mBAAmB,GAAG,EAAE,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;QACL,CAAC;QAED,uEAAuE;QACvE,+DAA+D;QAC/D,2DAA2D;QAC3D,IAAI,aAAa,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC;YACrE,OAAO,kGAAkG,CAAC;QAC5G,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC"}
|
|
@@ -1,22 +1,86 @@
|
|
|
1
1
|
import { Command } from './command.js';
|
|
2
|
+
import { planeTintItemName, canReachHost } from '../utilities/planes.js';
|
|
3
|
+
import { rollPool, formatRoll } from '../utilities/dice.js';
|
|
2
4
|
export class SearchCommand extends Command {
|
|
3
5
|
static verb = 'search';
|
|
4
6
|
static description = 'Search for items in your area';
|
|
5
7
|
async execute(_args) {
|
|
6
8
|
const room = this.actor.currentLocation;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
// Searching is a PERCEPTION test now (Intuition + perception skill;
|
|
10
|
+
// unskilled defaults to Intuition - 1): no hits means the room keeps
|
|
11
|
+
// its secrets this pass -- retry freely, but until a roll lands the
|
|
12
|
+
// room stays uncased ("take all" stays gated). Barriers (puzzles) are
|
|
13
|
+
// in plain sight and show regardless -- you can't fail to notice the
|
|
14
|
+
// maglock you're staring at.
|
|
15
|
+
const perception = this.actor.skillRating('perception');
|
|
16
|
+
const pool = Math.max(1, this.actor.intuition + (perception > 0 ? perception : -1) + this.actor.woundModifier - this.actor.sustainingPenalty);
|
|
17
|
+
const roll = rollPool(pool);
|
|
18
|
+
if (roll.hits === 0) {
|
|
19
|
+
let missed = `Perception: ${formatRoll(roll)}\nYou sweep the room and come up empty... you think.`;
|
|
20
|
+
for (const target of room.getPuzzleTargets()) {
|
|
21
|
+
const directionNote = target.direction ? ` (blocking the way ${target.direction})` : '';
|
|
22
|
+
missed += `\n\n${target.puzzle.riddle}${directionNote}`;
|
|
23
|
+
}
|
|
24
|
+
return missed;
|
|
25
|
+
}
|
|
26
|
+
// Casing the room is what unlocks "take all" here (see take.ts).
|
|
27
|
+
room.searchedBy.add(this.actor.name);
|
|
28
|
+
// A search finds what your plane can touch or see: meat finds meat,
|
|
29
|
+
// a Matrix persona finds files and paydata, the astral sees the meat
|
|
30
|
+
// world's objects (dimly -- taking them is another matter, see take.ts).
|
|
31
|
+
// An AIR-GAPPED host's files aren't on the wireless grid at all -- a
|
|
32
|
+
// persona that rode in remotely doesn't even see them (canReachHost).
|
|
33
|
+
const hostReachable = canReachHost(this.actor, room);
|
|
34
|
+
const found = room.inventory.getAllItems()
|
|
35
|
+
.filter(i => i.plane === this.actor.plane || (this.actor.plane === 'astral' && i.plane === 'meat'))
|
|
36
|
+
.filter(i => !(i.plane === 'matrix' && room.hasNode && !hostReachable));
|
|
37
|
+
let description = `Perception: ${formatRoll(roll)}\n`;
|
|
38
|
+
if (found.length === 0) {
|
|
10
39
|
description += "You search the area thoroughly, but don't find any items.";
|
|
11
40
|
}
|
|
12
41
|
else {
|
|
13
|
-
|
|
42
|
+
// Plain lowercase for the log/AI history; the SCREEN list is tinted
|
|
43
|
+
// per plane (see planeTintItemName) so paydata reads as data.
|
|
44
|
+
const itemsList = found.map(i => i.name.toLowerCase()).join(', ');
|
|
45
|
+
const displayList = found.map(i => planeTintItemName(i, this.actor.plane)).join(', ');
|
|
14
46
|
this.logger.write(`SearchCommand: ${this.actor.name} found the following items: ${itemsList}`);
|
|
15
47
|
this.actor.performAction('search', itemsList);
|
|
16
|
-
description += `You search the area and find: ${
|
|
48
|
+
description += `You search the area and find: ${displayList}`;
|
|
49
|
+
}
|
|
50
|
+
// Data is LOOT -- say so while the persona is standing on it, with the
|
|
51
|
+
// vault state attached: sealed files need the host cracked first. A
|
|
52
|
+
// real session's decker found the paydata jacked-in, didn't realize it
|
|
53
|
+
// was takeable from the grid, and went hunting for it in the meat.
|
|
54
|
+
if (this.actor.plane === 'matrix' && found.some(i => i.plane === 'matrix')) {
|
|
55
|
+
description += room.hasNode && !room.hostCracked
|
|
56
|
+
? `\n{cyan-fg}(the files sit sealed in the host's data vault -- "hack" the node to unseal them){/cyan-fg}`
|
|
57
|
+
: `\n{cyan-fg}(data files are loot -- "take" them right here on the grid; they ride out on your deck){/cyan-fg}`;
|
|
58
|
+
}
|
|
59
|
+
// A remote persona at an air-gapped host: the files exist, but this
|
|
60
|
+
// grid can't see them -- say why the room reads empty.
|
|
61
|
+
if (this.actor.plane === 'matrix' && room.hasNode && !hostReachable
|
|
62
|
+
&& room.inventory.getAllItems().some(i => i.plane === 'matrix')) {
|
|
63
|
+
description += `\n{cyan-fg}The host here is dark -- AIR-GAPPED, nothing broadcast. Whatever it holds only opens to a hard line: jack in from INSIDE this room.{/cyan-fg}`;
|
|
64
|
+
}
|
|
65
|
+
// The mirror hint: a meat-side search can't see matrix files, but it
|
|
66
|
+
// shouldn't pretend the room is empty when the good stuff is one
|
|
67
|
+
// "jack in" away.
|
|
68
|
+
if (this.actor.plane === 'meat' && room.inventory.getAllItems().some(i => i.plane === 'matrix')) {
|
|
69
|
+
description += room.nodeAccess === 'wired'
|
|
70
|
+
? `\n{cyan-fg}The node here is air-gapped -- hard lines only. "jack in" right here to touch its files.{/cyan-fg}`
|
|
71
|
+
: `\n{cyan-fg}The node here hums with locked files -- whatever's worth taking lives on the grid. "jack in" and search again.{/cyan-fg}`;
|
|
17
72
|
}
|
|
18
|
-
|
|
19
|
-
|
|
73
|
+
for (const target of room.getPuzzleTargets()) {
|
|
74
|
+
const locked = target.puzzle.requiresPuzzle && !target.puzzle.requiresPuzzle.isSolved();
|
|
75
|
+
const directionNote = target.direction ? ` (blocking the way ${target.direction})` : '';
|
|
76
|
+
description += `\n\n${target.puzzle.riddle}${directionNote}`;
|
|
77
|
+
const bypassHint = target.puzzle.getBypassHint();
|
|
78
|
+
if (bypassHint) {
|
|
79
|
+
description += `\n${bypassHint}`;
|
|
80
|
+
}
|
|
81
|
+
if (locked) {
|
|
82
|
+
description += `\n(This seems locked -- something else needs to happen first.)`;
|
|
83
|
+
}
|
|
20
84
|
}
|
|
21
85
|
return description;
|
|
22
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Command, ICommand } from './command.js';
|
|
2
|
+
/**
|
|
3
|
+
* The character sheet: every attribute and the derived numbers they feed,
|
|
4
|
+
* in the same on-demand panel style as spells/inv/equipment. What each
|
|
5
|
+
* stat actually does is spelled out inline, so the sheet doubles as the
|
|
6
|
+
* rules reference.
|
|
7
|
+
*/
|
|
8
|
+
export declare class SheetCommand extends Command implements ICommand {
|
|
9
|
+
protected static verb: string;
|
|
10
|
+
protected static description: string;
|
|
11
|
+
execute(_args?: string[]): Promise<string>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Command } from './command.js';
|
|
2
|
+
import { SKILL_NAMES } from '../models/player.js';
|
|
3
|
+
/**
|
|
4
|
+
* The character sheet: every attribute and the derived numbers they feed,
|
|
5
|
+
* in the same on-demand panel style as spells/inv/equipment. What each
|
|
6
|
+
* stat actually does is spelled out inline, so the sheet doubles as the
|
|
7
|
+
* rules reference.
|
|
8
|
+
*/
|
|
9
|
+
export class SheetCommand extends Command {
|
|
10
|
+
static verb = 'sheet';
|
|
11
|
+
static description = 'Your character sheet: attributes, derived pools, tracks, and edge.';
|
|
12
|
+
async execute(_args = []) {
|
|
13
|
+
const a = this.actor;
|
|
14
|
+
const attr = (label, value, does) => ` ${label.padEnd(10)} ${String(value).padStart(2)} -- ${does}`;
|
|
15
|
+
const lines = [
|
|
16
|
+
`=== ${a.name.toUpperCase()} ===`,
|
|
17
|
+
'',
|
|
18
|
+
'Attributes:',
|
|
19
|
+
attr('Body', a.body, 'soak, physical track, rest recovery'),
|
|
20
|
+
attr('Agility', a.agility, 'attack pool'),
|
|
21
|
+
attr('Reaction', a.reaction, 'defense pool'),
|
|
22
|
+
attr('Strength', a.strength, `melee/unarmed damage, carry cap (${a.maxCarryingWeight} kg)`),
|
|
23
|
+
attr('Willpower', a.willpower, 'stun track, drain resistance'),
|
|
24
|
+
attr('Logic', a.logic, 'first aid, hacking'),
|
|
25
|
+
attr('Intuition', a.intuition, 'defense (half), perception'),
|
|
26
|
+
attr('Charisma', a.charisma, 'presence -- the talking stats are coming'),
|
|
27
|
+
attr('Magic', a.magic, a.adept
|
|
28
|
+
? 'ADEPT -- body-magic: half rides every meat attack/defense; no spells, no projection'
|
|
29
|
+
: a.isAwakened() ? 'AWAKENED -- innate casting (see "spells")' : 'mundane'),
|
|
30
|
+
...(a.isTechnomancer() ? [attr('Resonance', a.resonance, 'TECHNOMANCER -- the Matrix without a deck; all Matrix damage is REAL stun')] : []),
|
|
31
|
+
attr('Edge', a.edge, `luck -- ${a.edgeRemaining}/${a.edge} left this job${a.edgeBoostArmed ? ', a boost is BURNING now' : ''} ("edge" to burn one)`),
|
|
32
|
+
'',
|
|
33
|
+
// Rated skills only -- fifteen zero lines is noise; "advance" shows
|
|
34
|
+
// the full trainable list. The old generic Skill attribute is gone
|
|
35
|
+
// from the sheet: pools now roll the SPECIFIC skill (firearms /
|
|
36
|
+
// blades / unarmed by armament; hacking on the grid).
|
|
37
|
+
`Skills (karma: ${a.karma} -- "advance" to train):`,
|
|
38
|
+
...(SKILL_NAMES.filter(s => a.skillRating(s) > 0).length > 0
|
|
39
|
+
? SKILL_NAMES.filter(s => a.skillRating(s) > 0).map(s => ` ${s.padEnd(12)} ${a.skillRating(s)}`)
|
|
40
|
+
: [' (no rated skills -- rolling on raw attributes)']),
|
|
41
|
+
'',
|
|
42
|
+
'Derived:',
|
|
43
|
+
...(a.plane !== 'meat' ? [` Plane: ${a.plane.toUpperCase()}${a.plane === 'matrix' ? ` (${a.simMode}-sim)` : ''} -- pools below are your ${a.plane} pools; body at ${a.bodyRoom?.name ?? '???'}`] : []),
|
|
44
|
+
` Attack pool: ${a.getAttackPool()}d6 (${a.getWeaponProfile().name}, damage ${a.getWeaponProfile().damage}${a.plane === 'meat' && a.getCarriedWeapon() && !a.weaponDrawn ? ` -- ${a.getCarriedWeapon().name} holstered, "brandish" to draw` : ''})`,
|
|
45
|
+
` Defense pool: ${a.getDefensePool()}d6`,
|
|
46
|
+
` Initiative: ${a.getInitiativePool()}d6${a.plane === 'meat' ? ' (Reaction + Intuition + live commlink AR)' : ''}`,
|
|
47
|
+
` Soak pool: ${a.getSoakPool()}d6`,
|
|
48
|
+
...(a.isCaster() ? [` Casting pool: ${a.getMagicPool()}d6`] : []),
|
|
49
|
+
` Physical: ${a.conditionSummary()}`,
|
|
50
|
+
` Stun: ${a.stunSummary()}`,
|
|
51
|
+
...(a.getAnyCyberdeck() ? [` Deck: ${a.getAnyCyberdeck().name} ${a.matrixSummary()}${a.getAnyCyberdeck().isBricked ? ' -- BRICKED (rest to repair)' : ''}`] : []),
|
|
52
|
+
...(a.woundModifier < 0 ? [` Wounds: ${a.woundModifier} dice on everything`] : []),
|
|
53
|
+
...(a.sustainedArmor > 0 ? [` Sustained: armor +${a.sustainedArmor} soak (-2 dice)`] : []),
|
|
54
|
+
];
|
|
55
|
+
return lines.join('\n');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=sheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/sheet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command, ICommand } from './command.js';
|
|
2
|
+
/**
|
|
3
|
+
* Running silent, the Shadowrun way: your commlink stays on you but stops
|
|
4
|
+
* broadcasting. While silent, you can't place calls and NOBODY can raise
|
|
5
|
+
* you -- including the fixer, so a job callback will not find you until
|
|
6
|
+
* you go loud again. Toggling silent drops any call you're on. The HUD's
|
|
7
|
+
* Link line tracks the state (see game.ts updateStatus).
|
|
8
|
+
*/
|
|
9
|
+
export declare class SilentCommand extends Command implements ICommand {
|
|
10
|
+
protected static verb: string;
|
|
11
|
+
protected static description: string;
|
|
12
|
+
execute(_args?: string[]): Promise<string>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Command } from './command.js';
|
|
2
|
+
import { Category } from '../types/shared/item-enum.js';
|
|
3
|
+
import { CALL_ICON, CALL_COLOR } from '../utilities/comm-style.js';
|
|
4
|
+
/**
|
|
5
|
+
* Running silent, the Shadowrun way: your commlink stays on you but stops
|
|
6
|
+
* broadcasting. While silent, you can't place calls and NOBODY can raise
|
|
7
|
+
* you -- including the fixer, so a job callback will not find you until
|
|
8
|
+
* you go loud again. Toggling silent drops any call you're on. The HUD's
|
|
9
|
+
* Link line tracks the state (see game.ts updateStatus).
|
|
10
|
+
*/
|
|
11
|
+
export class SilentCommand extends Command {
|
|
12
|
+
static verb = 'silent';
|
|
13
|
+
static description = 'Toggle your commlink broadcast: running silent means no calls in OR out (nobody can reach you -- not even the fixer) until you go loud again.';
|
|
14
|
+
async execute(_args = []) {
|
|
15
|
+
const actor = this.actor;
|
|
16
|
+
// Your link's broadcast IS the Matrix connection -- killing it while
|
|
17
|
+
// jacked in would be dumping yourself. Make it explicit instead.
|
|
18
|
+
if (actor.plane === 'matrix') {
|
|
19
|
+
return `Your link is the thread your mind is hanging from right now. "jack out" first, then go dark.`;
|
|
20
|
+
}
|
|
21
|
+
const hasAnyLink = actor.equipment.head?.commlink != null ||
|
|
22
|
+
actor.inventory.getAllItems().some(i => i.category === Category.Commlink);
|
|
23
|
+
if (!hasAnyLink) {
|
|
24
|
+
return `You have no commlink to silence.`;
|
|
25
|
+
}
|
|
26
|
+
// Going loud again.
|
|
27
|
+
if (actor.runningSilent) {
|
|
28
|
+
actor.runningSilent = false;
|
|
29
|
+
actor.performAction('goes loud', 'commlink broadcasting');
|
|
30
|
+
this.logger.write(`${actor.name} stops running silent.`);
|
|
31
|
+
this.scene.updateStatus();
|
|
32
|
+
return `{${CALL_COLOR}-fg}${CALL_ICON} Your link comes back up -- broadcasting again. Calls can reach you now.{/${CALL_COLOR}-fg}`;
|
|
33
|
+
}
|
|
34
|
+
// Going silent: drop any active call first, both sides.
|
|
35
|
+
let hangupNote = '';
|
|
36
|
+
const partner = actor.activeCallPartner;
|
|
37
|
+
if (partner) {
|
|
38
|
+
actor.activeCallPartner = undefined;
|
|
39
|
+
partner.activeCallPartner = undefined;
|
|
40
|
+
this.logger.write(`${actor.name} dropped the call with ${partner.name} by going silent.`);
|
|
41
|
+
hangupNote = ` The call with ${partner.name} drops mid-word.`;
|
|
42
|
+
}
|
|
43
|
+
actor.runningSilent = true;
|
|
44
|
+
actor.performAction('goes silent', 'commlink dark');
|
|
45
|
+
this.logger.write(`${actor.name} is now running silent.`);
|
|
46
|
+
this.scene.updateStatus();
|
|
47
|
+
return `{gray-fg}${CALL_ICON} You kill your link's broadcast.${hangupNote} Running silent -- no calls in or out, and your AR overlay dies with it (no commlink initiative bonus) until you go loud ("silent" again).{/gray-fg}`;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=silent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"silent.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/silent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,OAAO;IAC9B,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;IACvB,MAAM,CAAC,WAAW,GAAG,+IAA+I,CAAC;IAE/K,KAAK,CAAC,OAAO,CAAC,QAAkB,EAAE;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzB,qEAAqE;QACrE,iEAAiE;QACjE,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,8FAA8F,CAAC;QACxG,CAAC;QAED,MAAM,UAAU,GACd,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI;YACtC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5E,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,kCAAkC,CAAC;QAC5C,CAAC;QAED,oBAAoB;QACpB,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACxB,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;YAC5B,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,wBAAwB,CAAC,CAAC;YACzD,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YAC1B,OAAO,IAAI,UAAU,OAAO,SAAS,6EAA6E,UAAU,MAAM,CAAC;QACrI,CAAC;QAED,wDAAwD;QACxD,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,KAAK,CAAC,iBAAiB,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACpC,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,0BAA0B,OAAO,CAAC,IAAI,mBAAmB,CAAC,CAAC;YAC1F,UAAU,GAAG,kBAAkB,OAAO,CAAC,IAAI,kBAAkB,CAAC;QAChE,CAAC;QAED,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QAC3B,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,yBAAyB,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,YAAY,SAAS,mCAAmC,UAAU,sJAAsJ,CAAC;IAClO,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Command, ICommand } from './command.js';
|
|
2
|
+
/**
|
|
3
|
+
* The SNEAKING skill's verb: a movement mode. While sneaking, every room
|
|
4
|
+
* entry is an opposed test per witness -- your Agility + sneaking against
|
|
5
|
+
* their Intuition + perception (see NPC.see) -- and any NPC you beat
|
|
6
|
+
* simply never registers you arriving: no greeting, no alarm, no AI
|
|
7
|
+
* reaction until you act. Loud acts (attacking, casting, speaking,
|
|
8
|
+
* brandishing, calling) drop the mode instantly (see Player.breakSneak
|
|
9
|
+
* call sites). Toggle off with "sneak" again.
|
|
10
|
+
*/
|
|
11
|
+
export declare class SneakCommand extends Command implements ICommand {
|
|
12
|
+
protected static verb: string;
|
|
13
|
+
protected static description: string;
|
|
14
|
+
execute(_args?: string[]): Promise<string>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Command } from './command.js';
|
|
2
|
+
/**
|
|
3
|
+
* The SNEAKING skill's verb: a movement mode. While sneaking, every room
|
|
4
|
+
* entry is an opposed test per witness -- your Agility + sneaking against
|
|
5
|
+
* their Intuition + perception (see NPC.see) -- and any NPC you beat
|
|
6
|
+
* simply never registers you arriving: no greeting, no alarm, no AI
|
|
7
|
+
* reaction until you act. Loud acts (attacking, casting, speaking,
|
|
8
|
+
* brandishing, calling) drop the mode instantly (see Player.breakSneak
|
|
9
|
+
* call sites). Toggle off with "sneak" again.
|
|
10
|
+
*/
|
|
11
|
+
export class SneakCommand extends Command {
|
|
12
|
+
static verb = 'sneak';
|
|
13
|
+
static description = 'Toggle sneak-walking: room entries become opposed Sneaking-vs-Perception tests -- NPCs you beat never notice you arrive. Loud acts break it.';
|
|
14
|
+
async execute(_args = []) {
|
|
15
|
+
const actor = this.actor;
|
|
16
|
+
if (actor.plane !== 'meat') {
|
|
17
|
+
return actor.plane === 'matrix'
|
|
18
|
+
? `Personas don't tiptoe -- run silent ("silent") if you want to be hard to find on the grid.`
|
|
19
|
+
: `The astral doesn't care how softly you drift.`;
|
|
20
|
+
}
|
|
21
|
+
if (actor.inExchange) {
|
|
22
|
+
return `They can see you. Sneaking is for BEFORE the shooting starts.`;
|
|
23
|
+
}
|
|
24
|
+
if (actor.sneaking) {
|
|
25
|
+
actor.sneaking = false;
|
|
26
|
+
this.scene.updateStatus();
|
|
27
|
+
return `You straighten up and walk like a citizen again.`;
|
|
28
|
+
}
|
|
29
|
+
actor.sneaking = true;
|
|
30
|
+
this.logger.write(`${actor.name} starts sneaking.`);
|
|
31
|
+
this.scene.updateStatus();
|
|
32
|
+
return `You drop into a ghost's walk -- low, quiet, out of the light. Each room you enter is an opposed test against whoever's inside; anything loud gives you away.`;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=sneak.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sneak.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/sneak.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,OAAO,YAAa,SAAQ,OAAO;IAC7B,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;IACtB,MAAM,CAAC,WAAW,GAAG,8IAA8I,CAAC;IAE9K,KAAK,CAAC,OAAO,CAAC,QAAkB,EAAE;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzB,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;gBAC7B,CAAC,CAAC,4FAA4F;gBAC9F,CAAC,CAAC,+CAA+C,CAAC;QACtD,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,+DAA+D,CAAC;QACzE,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YAC1B,OAAO,kDAAkD,CAAC;QAC5D,CAAC;QAED,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,mBAAmB,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,8JAA8J,CAAC;IACxK,CAAC"}
|
|
@@ -1,23 +1,44 @@
|
|
|
1
1
|
import { Command } from './command.js';
|
|
2
2
|
export class SolveCommand extends Command {
|
|
3
3
|
static verb = 'solve';
|
|
4
|
-
static description = 'Attempt to solve a puzzle.';
|
|
4
|
+
static description = 'Attempt to solve a puzzle (or a locked door\'s lock/scanner/ward).';
|
|
5
5
|
async execute(args) {
|
|
6
6
|
const answer = args.join(' ').toLowerCase();
|
|
7
7
|
const room = this.actor.currentLocation;
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
const targets = room?.getPuzzleTargets() ?? [];
|
|
9
|
+
if (targets.length === 0) {
|
|
10
|
+
this.logger.write(`SolveCommand: ${this.actor.name} attempted to solve a riddle in a room with no puzzle.`);
|
|
10
11
|
return 'There doesn\'t seem to be a riddle here to solve.';
|
|
11
12
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
// The typed answer alone identifies which target it's for -- no need to
|
|
14
|
+
// ask the player to also name it (unlike pick/hack/cast, where there's
|
|
15
|
+
// no answer to disambiguate with -- see bypass-command.ts).
|
|
16
|
+
let firstResult;
|
|
17
|
+
for (const target of targets) {
|
|
18
|
+
const result = target.puzzle.solve(answer, this.actor.inventory);
|
|
19
|
+
firstResult ??= result;
|
|
20
|
+
if (result.success) {
|
|
21
|
+
this.logger.write(`${this.actor.name} attempted to solve ${target.puzzle.name} with result ${result.success}`);
|
|
22
|
+
this.logger.write(`${this.actor.name} has solved ${target.puzzle.name}`);
|
|
23
|
+
if (target.door) {
|
|
24
|
+
target.door.isLocked = false;
|
|
25
|
+
this.scene.updateExits(room);
|
|
26
|
+
this.scene.addWorldEvent(`${this.actor.name} unlocked the way ${target.direction} in ${room.name} by solving "${target.puzzle.name}".`);
|
|
27
|
+
}
|
|
28
|
+
else if (target.puzzle.rewardItem) {
|
|
29
|
+
this.actor.inventory.addItem(target.puzzle.rewardItem);
|
|
30
|
+
this.scene.addWorldEvent(`${this.actor.name} solved "${target.puzzle.name}" in ${room.name}.`);
|
|
31
|
+
this.scene.updateInventory(this.scene.getPlayer().inventory);
|
|
32
|
+
}
|
|
33
|
+
this.logger.write(`SolveCommand: ${result.message}`);
|
|
34
|
+
this.actor.performAction('solve', result.message);
|
|
35
|
+
return result.message;
|
|
36
|
+
}
|
|
17
37
|
}
|
|
18
|
-
this.logger.write(
|
|
19
|
-
this.
|
|
20
|
-
|
|
38
|
+
this.logger.write(`${this.actor.name} attempted to solve ${targets[0].puzzle.name} with result false`);
|
|
39
|
+
this.logger.write(`SolveCommand: ${firstResult.message}`);
|
|
40
|
+
this.actor.performAction('solve', firstResult.message);
|
|
41
|
+
return firstResult.message;
|
|
21
42
|
}
|
|
22
43
|
}
|
|
23
44
|
//# sourceMappingURL=solve.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/solve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,cAAc,CAAC;AAEjD,MAAM,OAAO,YAAa,SAAQ,OAAO;IAC7B,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;IACtB,MAAM,CAAC,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"solve.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/solve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command, ICommand } from './command.js';
|
|
2
|
+
/**
|
|
3
|
+
* The spellbook: how a player actually discovers what they can cast and
|
|
4
|
+
* why. Especially load-bearing for INNATE casting -- an Awakened character
|
|
5
|
+
* has no formula item in their pack to stumble over, so without this
|
|
6
|
+
* command there'd be no way to learn you have the talent at all. Also
|
|
7
|
+
* breaks down the casting pool and shows sustained-spell state, so magic
|
|
8
|
+
* is never invisible bookkeeping.
|
|
9
|
+
*/
|
|
10
|
+
export declare class SpellsCommand extends Command implements ICommand {
|
|
11
|
+
protected static verb: string;
|
|
12
|
+
protected static description: string;
|
|
13
|
+
execute(_args?: string[]): Promise<string>;
|
|
14
|
+
}
|