@maka/maka-cli 5.381.0 → 5.382.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/engine-version.js +17 -1
- package/bundle/typescript/src/commands/game/sideQuest/game.js +70 -13
- package/bundle/typescript/src/commands/game/sideQuest/types/repro.js +5 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/repro-boot.js +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/shared-run.js +4 -0
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maka/maka-cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.382.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"summary": "A command line tool for scaffolding Meteor 3.x applications using either React.",
|
|
6
6
|
"description": "A command line tool for scaffolding Meteor 3.x applications using React.",
|
|
@@ -3303,5 +3303,21 @@
|
|
|
3303
3303
|
// severity), Gremlins, Scorched, Uncouth, Uneducated and Weak Immune
|
|
3304
3304
|
// System add one, Blandness takes one off. Elf Poser, Ork Poser and
|
|
3305
3305
|
// Spirit Bane have no catalog row yet.
|
|
3306
|
-
|
|
3306
|
+
// 1.193.1 (2026-10-04): A REPUTATION BENCHES (rfJGmF42kdnRw5AMT). Repro
|
|
3307
|
+
// fixture 2.10.0 takes notoriety/awareness -- a record already earned
|
|
3308
|
+
// at boot -- and the reputation game over is awaited before the
|
|
3309
|
+
// command's reply, so the banner is that step's outcome on every
|
|
3310
|
+
// client and in a dry run's transcript.
|
|
3311
|
+
// 1.194.0 (2026-10-04): THE DISTRICT FOLLOWS THE TIER (nqRsvbN6gvKHFKfW9;
|
|
3312
|
+
// ruling: "a runner should end up in a district that fits their
|
|
3313
|
+
// lifestyle"). A Middle runner who slid to Low on unpaid rent woke in
|
|
3314
|
+
// Everett in a stitched-in hole named after Auburn's walk-up.
|
|
3315
|
+
// - A tier whose home is authored in ANOTHER district no longer builds a
|
|
3316
|
+
// hole here (rebindHomeForTier).
|
|
3317
|
+
// - Game.settleAddress moves the runner to hubIdForTier's district as
|
|
3318
|
+
// home, binding that district's own building, after the ride home, at
|
|
3319
|
+
// hub boot (reaching a save that already slid) and after a shared
|
|
3320
|
+
// run's homecoming. A move that cannot land now is retried next time;
|
|
3321
|
+
// a session with no districtSeedLoader never moves.
|
|
3322
|
+
export const ENGINE_VERSION = '1.194.0';
|
|
3307
3323
|
//# sourceMappingURL=engine-version.js.map
|
|
@@ -42,7 +42,7 @@ import { pickedUpLine } from './utilities/takeover.js';
|
|
|
42
42
|
import { presenceBeatAllowed, presenceProcessOnTheStreet } from './utilities/presence-gate.js';
|
|
43
43
|
import { pushSave, burnCloudSaveFor, enqueueBoundPush, flushPushQueue, writeSpill, takeLastMemorial, authToken, clearSpill, hasPendingPush, getCloudSessionId, setLeasedHandler, } from './utilities/cloud-saves.js';
|
|
44
44
|
import { DOCWAGON_TIERS, RESUSC_FEE, DEATH_COMP } from './utilities/docwagon.js';
|
|
45
|
-
import { isFence, knownDistricts, LIFESTYLE_TIERS, LIFESTYLE_OPTIONS, canonicalLifestyleTier, canonicalLifestyleOption, lifestyleOptionAllowed, lifestyleTierFor } from './utilities/commerce.js';
|
|
45
|
+
import { isFence, knownDistricts, LIFESTYLE_TIERS, LIFESTYLE_OPTIONS, canonicalLifestyleTier, canonicalLifestyleOption, lifestyleOptionAllowed, lifestyleTierFor, hubIdForTier } from './utilities/commerce.js';
|
|
46
46
|
import { reconcileGarage, findDumpster, DUMPSTER_NAME } from './models/home-containers.js';
|
|
47
47
|
import { ownedDrones } from './utilities/owned-drones.js';
|
|
48
48
|
import { attachBrandMark, attachBrandMarkBottomRight } from './utilities/brand-mark.js';
|
|
@@ -3645,6 +3645,15 @@ export default class Game {
|
|
|
3645
3645
|
// ordinary Street/Squatter case, and the only no-op worth naming.
|
|
3646
3646
|
if (authored === undefined && current.residenceTier === undefined)
|
|
3647
3647
|
return;
|
|
3648
|
+
// THE TIER'S ADDRESS IS IN ANOTHER DISTRICT (nqRsvbN6gvKHFKfW9: a Middle
|
|
3649
|
+
// runner slid to Low on unpaid rent and woke in Everett, in a stitched-in
|
|
3650
|
+
// hole named after Auburn's walk-up). An authored home with no authored
|
|
3651
|
+
// successor HERE means the runner is moving out, not down the hall:
|
|
3652
|
+
// settleAddress takes them to the district that fits, and that district's
|
|
3653
|
+
// own building is bound on arrival. Building a hole here would only leave
|
|
3654
|
+
// a counterfeit of somebody else's address standing on this street.
|
|
3655
|
+
if (authored === undefined)
|
|
3656
|
+
return;
|
|
3648
3657
|
const next = authored ?? this.buildRuntimeHome();
|
|
3649
3658
|
this.moveStash(current, next);
|
|
3650
3659
|
// THE OLD HOLE IS CODE-OWNED, so it leaves with the lease -- and
|
|
@@ -5751,6 +5760,44 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
|
|
|
5751
5760
|
}
|
|
5752
5761
|
return { ok: true, name: seed.name, firstVisit };
|
|
5753
5762
|
}
|
|
5763
|
+
/**
|
|
5764
|
+
* LIVE WHERE THE RENT SAYS (user ruling 2026-10-04, nqRsvbN6gvKHFKfW9: "a
|
|
5765
|
+
* runner should end up in a district that fits their lifestyle").
|
|
5766
|
+
*
|
|
5767
|
+
* The lifestyle desk moves house itself. A tier that SLID on unpaid rent
|
|
5768
|
+
* (settleLifestyleUpkeep) cannot: every homecoming is synchronous and a
|
|
5769
|
+
* district move is not. So each async door a runner comes home through --
|
|
5770
|
+
* the ride home, the hub boot, a shared run's write-back -- calls this
|
|
5771
|
+
* afterwards, and the boot call also reaches a save that slid before this
|
|
5772
|
+
* shipped.
|
|
5773
|
+
*
|
|
5774
|
+
* Never refuses loudly. A move that cannot happen now (no network, a job
|
|
5775
|
+
* standing open) leaves the runner where they are, logged, and the next
|
|
5776
|
+
* homecoming or boot tries again. A visit is left alone: the runner is not
|
|
5777
|
+
* at home, and home is what this is about.
|
|
5778
|
+
*/
|
|
5779
|
+
async settleAddress() {
|
|
5780
|
+
if (!this.hasHub || !this._hubScene || this.scene !== this._hubScene || this._crewSpace || this.isVisiting)
|
|
5781
|
+
return undefined;
|
|
5782
|
+
// NO LOADER, NOWHERE TO GO: a terminal and a site-hosted hub both say how
|
|
5783
|
+
// to fetch a district (districtSeedLoader). A harness that names none
|
|
5784
|
+
// booted exactly the one district it means to test, and must not be
|
|
5785
|
+
// carried off to a network fetch because its fixture's tier lives elsewhere.
|
|
5786
|
+
if (!this.districtSeedLoader)
|
|
5787
|
+
return undefined;
|
|
5788
|
+
const here = this.districtId;
|
|
5789
|
+
const want = hubIdForTier(this.lifestyleTier);
|
|
5790
|
+
if (here === undefined || want === undefined || here === want)
|
|
5791
|
+
return undefined;
|
|
5792
|
+
const leaving = this._hubSeed?.name ?? here;
|
|
5793
|
+
const moved = await this.moveToDistrict(want, { asHome: true });
|
|
5794
|
+
if (!moved.ok) {
|
|
5795
|
+
Logger.getInstance().write(`Address: ${this.lifestyleTier} lives in ${want}, runner still in ${here} -- move deferred (${moved.why}).`);
|
|
5796
|
+
return undefined;
|
|
5797
|
+
}
|
|
5798
|
+
this.requestSave('move');
|
|
5799
|
+
return `${leaving} is past what a ${this.lifestyleTier} lifestyle pays for. The landlord's drone has your things at the curb by morning, and a cab takes you to ${moved.name} -- ${this._homeRoom.name} is home now. The footlocker came with you; the neighbourhood did not.`;
|
|
5800
|
+
}
|
|
5754
5801
|
/**
|
|
5755
5802
|
* Wires a fresh, always-unlocked path between the persistent home base
|
|
5756
5803
|
* and wherever the player is starting the current job from. Clears the
|
|
@@ -6195,6 +6242,11 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
|
|
|
6195
6242
|
const owed = this.applyHostedHomecoming();
|
|
6196
6243
|
if (owed)
|
|
6197
6244
|
Logger.getInstance().logWithColor(owed, 'green');
|
|
6245
|
+
// A tier that slid -- at that homecoming, or in a session that ended
|
|
6246
|
+
// before the move could land -- moves house before the runner wakes.
|
|
6247
|
+
const moved = await this.settleAddress();
|
|
6248
|
+
if (moved)
|
|
6249
|
+
Logger.getInstance().logWithColor(moved, 'green');
|
|
6198
6250
|
this.requestSave('hub-arrival');
|
|
6199
6251
|
}
|
|
6200
6252
|
// A REGISTERED sprite from the save re-shells at the cot (the
|
|
@@ -6961,7 +7013,10 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
|
|
|
6961
7013
|
return `You're inside a loose end's host -- "exit" or "jack out" is what ends it.`;
|
|
6962
7014
|
}
|
|
6963
7015
|
if (this._hubScene && this.scene !== this._hubScene) {
|
|
6964
|
-
|
|
7016
|
+
const home = this.returnToHub();
|
|
7017
|
+
// A tier that slid at the door moves house (settleAddress).
|
|
7018
|
+
const moved = await this.settleAddress();
|
|
7019
|
+
return moved ? `${home}\n${moved}` : home;
|
|
6965
7020
|
}
|
|
6966
7021
|
const gate = this.canDraftNextScene();
|
|
6967
7022
|
if (!gate.allowed) {
|
|
@@ -7426,14 +7481,12 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
|
|
|
7426
7481
|
const lapse = dropped.length > 0
|
|
7427
7482
|
? ` The garage lease goes with it -- the shutter comes down${sealedIn.length > 0 ? ` with ${sealedIn.join(', ')} still inside` : ''}.`
|
|
7428
7483
|
: '';
|
|
7429
|
-
// THE ADDRESS
|
|
7430
|
-
//
|
|
7431
|
-
//
|
|
7432
|
-
// district move is async
|
|
7433
|
-
//
|
|
7434
|
-
|
|
7435
|
-
// does, with "lifestyle".
|
|
7436
|
-
rentLine = `The landlord's drone pings before the door even shuts: ${paid > 0 ? `${paid} paid, ` : ''}${this.rentDebt} nuyen still owed.${shedLine} Your ${tier.name} arrangement lapses -- you're living ${this.lifestyleTier} now.${lapse}${hint(` ("pay" the tab, "lifestyle" to move somewhere you can afford.)`)}`;
|
|
7484
|
+
// THE ADDRESS GOES WITH THE TIER (user ruling 2026-10-04, on
|
|
7485
|
+
// nqRsvbN6gvKHFKfW9: "a runner should end up in a district that fits
|
|
7486
|
+
// their lifestyle"). Not here, though: this is synchronous and a
|
|
7487
|
+
// district move is async, so every homecoming's async caller follows
|
|
7488
|
+
// up with settleAddress, which does the moving.
|
|
7489
|
+
rentLine = `The landlord's drone pings before the door even shuts: ${paid > 0 ? `${paid} paid, ` : ''}${this.rentDebt} nuyen still owed.${shedLine} Your ${tier.name} arrangement lapses -- you're living ${this.lifestyleTier} now.${lapse}${hint(` ("pay" the tab when you're flush.)`)}`;
|
|
7437
7490
|
}
|
|
7438
7491
|
else {
|
|
7439
7492
|
rentLine = `Even the doorway costs something: ${this.rentDebt} nuyen on the tab.${shedLine}${hint(` ("pay" when you're flush.)`)}`;
|
|
@@ -9861,7 +9914,7 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
|
|
|
9861
9914
|
this.gameMaster?.afterCommand();
|
|
9862
9915
|
// A quit (null) has already sealed the save; nothing ends after it.
|
|
9863
9916
|
if (res.text !== null)
|
|
9864
|
-
this.settleReputationEndings();
|
|
9917
|
+
await this.settleReputationEndings();
|
|
9865
9918
|
return res;
|
|
9866
9919
|
}
|
|
9867
9920
|
/**
|
|
@@ -9876,7 +9929,7 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
|
|
|
9876
9929
|
* the run goes on. Not a body on the floor, so no brink and no
|
|
9877
9930
|
* DocWagon -- neither one fixes a name.
|
|
9878
9931
|
*/
|
|
9879
|
-
settleReputationEndings() {
|
|
9932
|
+
async settleReputationEndings() {
|
|
9880
9933
|
const scene = this.scene;
|
|
9881
9934
|
if (!scene)
|
|
9882
9935
|
return;
|
|
@@ -9890,7 +9943,11 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
|
|
|
9890
9943
|
scene.addWorldEvent(`${p.name}'s reputation ended their career.`);
|
|
9891
9944
|
scene.markPlayerDead(p);
|
|
9892
9945
|
if (p === scene.getPlayer()) {
|
|
9893
|
-
|
|
9946
|
+
// Awaited, unlike the astral cord's sync site: the banner lands
|
|
9947
|
+
// before this command's reply, so a bench transcript and every
|
|
9948
|
+
// client read it as this step's outcome.
|
|
9949
|
+
await scene.endGame(line);
|
|
9950
|
+
announceGameOver(Logger.getInstance(), line, p.name);
|
|
9894
9951
|
}
|
|
9895
9952
|
else {
|
|
9896
9953
|
this.onPlayerDeath?.(p);
|
|
@@ -76,8 +76,12 @@ export function reproFixtureOf(repro) {
|
|
|
76
76
|
* IReproHost.owner (the room's owner, hence the host's spider,
|
|
77
77
|
* JnyuXsQCnCmn9erNL) and IReproHost.invite (hostInvite, the
|
|
78
78
|
* commlink rider's legal mark). All additive.
|
|
79
|
+
*
|
|
80
|
+
* 2.10.0 adds IReproFixture.notoriety / .awareness (a record already
|
|
81
|
+
* earned, so the game-over line at 5 benches -- rfJGmF42kdnRw5AMT).
|
|
82
|
+
* Additive.
|
|
79
83
|
*/
|
|
80
|
-
export const REPRO_SCHEMA_VERSION = '2.
|
|
84
|
+
export const REPRO_SCHEMA_VERSION = '2.10.0';
|
|
81
85
|
/** THE LIVE REASON, from the field or the card's own words.
|
|
82
86
|
*
|
|
83
87
|
* `repro.live` is authoritative -- but the server's validator must
|
|
@@ -43,6 +43,18 @@ export async function applyReproFixtureState(game, fixture, actorName = REPRO_AC
|
|
|
43
43
|
runner.takeStun(fixture.wounded.stun);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
+
// A RECORD ALREADY EARNED (fixture.notoriety / fixture.awareness): the
|
|
47
|
+
// stains go on before the first step; the reputation check then reads
|
|
48
|
+
// them after that step lands, like any other command.
|
|
49
|
+
if (fixture.notoriety || fixture.awareness) {
|
|
50
|
+
const runner = game.scene.getPlayerByName(actorName);
|
|
51
|
+
if (runner) {
|
|
52
|
+
for (let i = 0; i < (fixture.notoriety ?? 0); i++)
|
|
53
|
+
runner.addNotoriety(`a bench stain (${i + 1})`);
|
|
54
|
+
for (let i = 0; i < (fixture.awareness ?? 0); i++)
|
|
55
|
+
runner.addPublicAwareness(`a bench headline (${i + 1})`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
46
58
|
// NUYEN (fixture.nuyen): a credstick in the pack, because money lives
|
|
47
59
|
// on a carrier item (Player.currency sums them) and the pregen has none.
|
|
48
60
|
if (fixture.nuyen && fixture.nuyen > 0) {
|
|
@@ -1996,6 +1996,10 @@ export class SharedRunSession {
|
|
|
1996
1996
|
const lines = g.applyHostedHomecoming(owed);
|
|
1997
1997
|
if (lines)
|
|
1998
1998
|
Logger.getInstance().logWithColor(lines, 'green');
|
|
1999
|
+
// A tier that slid at that homecoming moves house (settleAddress).
|
|
2000
|
+
const moved = await g.settleAddress();
|
|
2001
|
+
if (moved)
|
|
2002
|
+
Logger.getInstance().logWithColor(moved, 'green');
|
|
1999
2003
|
}
|
|
2000
2004
|
}
|
|
2001
2005
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maka/maka-cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.382.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"summary": "A command line tool for scaffolding Meteor 3.x applications using either React.",
|
|
6
6
|
"description": "A command line tool for scaffolding Meteor 3.x applications using React.",
|