From b40a8349f7c5fc0e981f8af5c1b856abecb027f7 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 6 Nov 2026 19:52:14 +0000 Subject: [PATCH 1/2] sheet-charge 1.2.2: compare an encounter's room by objid An encounter stores its room as objid(%l), but the join, add, leave and end notices compared it with %l or loc(), which answer with the bare dbref. The two never matched, so the "you are not in its room" notices went to people standing in it. Compare objid(%l) and objid(loc(...)). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Rqqt7UANHQ73A3Wsib6mkh --- README.md | 2 +- index.yaml | 2 +- sheet-charge/package.yaml | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b10c37b..741b3c3 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ constraints checked before anything is planned. | [`sheet-salvage-union-chargen/`](sheet-salvage-union-chargen/) | 1.0.0 | Bridge: sheet and mech edits follow the player's `+app` application; reviewers read the sheets they review | | [`duties-salvage-union/`](duties-salvage-union/) | 1.0.2 | Duties roll provider `salvage` on the Salvage Union sheet: abilities and mech parts as traits, Training Points and crawler scrap as rewards | | [`salvage-union-wiki/`](salvage-union-wiki/) | 1.0.3 | Salvage Union rules as wiki pages: the core rules, Pilot Bay, Mech Workshop, every chassis blueprint, the Union Crawler, salvaging, the denizens of the wasteland, and a page for every ability, system, module, piece of equipment and table. Unofficial, under the Salvage Union Open Game Licence 1.0b (see its NOTICE) | -| [`sheet-charge/`](sheet-charge/) | 1.2.0 | Charge character sheet: details, twelve actions in dots, momentum, a stress clock and condition, milestones and talents on a ledger, encounters with their own sheet copies, threats and consequences, and clocks; `+check` on a d6 pool against a risk, with assists, pushes, determination and fortune rolls. Charge SRD under CC BY 4.0 (see its NOTICE) | +| [`sheet-charge/`](sheet-charge/) | 1.2.2 | Charge character sheet: details, twelve actions in dots, momentum, a stress clock and condition, milestones and talents on a ledger, encounters with their own sheet copies, threats and consequences, and clocks; `+check` on a d6 pool against a risk, with assists, pushes, determination and fortune rolls. Charge SRD under CC BY 4.0 (see its NOTICE) | | [`sheet-charge-help/`](sheet-charge-help/) | 1.0.0 | Bridge: the Charge sheet's topics in `+help` | | [`sheet-charge-config/`](sheet-charge-config/) | 1.0.0 | Bridge: the Charge sheet's settings and lists in `+config` | | [`sheet-charge-chargen/`](sheet-charge-chargen/) | 1.0.0 | Bridge: giving out action dots follows the player's `+app` application; reviewers read the sheets they review | diff --git a/index.yaml b/index.yaml index 2e243b2..44eb2a6 100644 --- a/index.yaml +++ b/index.yaml @@ -325,7 +325,7 @@ packages: - path: sheet-charge/ name: Charge Sheet package: sheet-charge - version: 1.2.1 + version: 1.2.2 description: Charge character sheet (details, action dots, momentum, stress clock, milestones and talents) with +check action rolls, assists, determination and fortune rolls, encounters with threats and consequences, and clocks; Charge SRD under CC BY 4.0 - path: sheet-charge-help/ package: sheet-charge-help diff --git a/sheet-charge/package.yaml b/sheet-charge/package.yaml index 890d75e..15cbb80 100644 --- a/sheet-charge/package.yaml +++ b/sheet-charge/package.yaml @@ -1,7 +1,7 @@ format: "1.20" package: sheet-charge title: "Charge sheet" -version: 1.2.1 +version: 1.2.2 authors: [SharpMUSH] description: "A Charge character sheet: details, twelve actions rated in dots, momentum, a stress clock with a condition, milestones and talents built up on a ledger, encounters that keep their own copy of each sheet, with threats, danger clocks and consequences, plus progress clocks. +check rolls an action's dice against a risk for the room and gains momentum; push yourself, add tension, assist a friend, and make determination and fortune rolls. Based on the Charge SRD under CC BY 4.0 and Blades in the Dark under CC BY 3.0." license: MIT @@ -830,7 +830,7 @@ objects: # A character may be in several encounters, each with its own copy. INC`ENCOUNTER`JOIN: value: |- - @if isint(%q)={think setq(enc_n,%q)},{think setq(enc_n,if(eq(words(setr(enc_here,u(%!/FUN`ENCOUNTER`HERE,%l))),1),%q))}; @assert cor(strlen(%q),strlen(%q),not(words(%q)))=@pemit %#=notice(ENCOUNTER,Encounters [itemize(%q)] are running here. +encounter/join joins one.,warn); @assert cand(strlen(%q),hasattr({{store}},ENC`%q))=@pemit %#=notice(ENCOUNTER,[if(strlen(%q),There is no encounter '%q'.,There is no encounter here. +encounter/start starts one.)],warn); @assert not(member(u(%!/FUN`ENCOUNTER`JOINED,%#),%q))=@pemit %#=notice(ENCOUNTER,You are in encounter %q already.,warn); @include/args %!/INC`ENCOUNTER`COPYIN=who,%q; @remit get({{store}}/ENC`%q`ROOM)=notice(ENCOUNTER,tone(strong,name(%#)) joins encounter %q: [get({{store}}/ENC`%q)]. [tone(muted,Rolls and changes there use a copy of [poss(%#)] sheet.)]); @if comp(%l,get({{store}}/ENC`%q`ROOM))={@pemit %#=notice(ENCOUNTER,You join encounter %q. Your copy is used where it runs%, in [name(get({{store}}/ENC`%q`ROOM))].,ok)} + @if isint(%q)={think setq(enc_n,%q)},{think setq(enc_n,if(eq(words(setr(enc_here,u(%!/FUN`ENCOUNTER`HERE,%l))),1),%q))}; @assert cor(strlen(%q),strlen(%q),not(words(%q)))=@pemit %#=notice(ENCOUNTER,Encounters [itemize(%q)] are running here. +encounter/join joins one.,warn); @assert cand(strlen(%q),hasattr({{store}},ENC`%q))=@pemit %#=notice(ENCOUNTER,[if(strlen(%q),There is no encounter '%q'.,There is no encounter here. +encounter/start starts one.)],warn); @assert not(member(u(%!/FUN`ENCOUNTER`JOINED,%#),%q))=@pemit %#=notice(ENCOUNTER,You are in encounter %q already.,warn); @include/args %!/INC`ENCOUNTER`COPYIN=who,%q; @remit get({{store}}/ENC`%q`ROOM)=notice(ENCOUNTER,tone(strong,name(%#)) joins encounter %q: [get({{store}}/ENC`%q)]. [tone(muted,Rolls and changes there use a copy of [poss(%#)] sheet.)]); @if comp(objid(%l),get({{store}}/ENC`%q`ROOM))={@pemit %#=notice(ENCOUNTER,You join encounter %q. Your copy is used where it runs%, in [name(get({{store}}/ENC`%q`ROOM))].,ok)} flags: [cmdsyntax] # +encounter/use : when a room holds several of your encounters, picks the one your rolls and changes go to. INC`ENCOUNTER`USE: @@ -840,12 +840,12 @@ objects: # +encounter/add [=]: the GM or a keeper brings a character in. INC`ENCOUNTER`ADD: value: |- - @assert strlen(%q)=@pemit %#=notice(ENCOUNTER,+encounter/add [=] brings a character into your encounter.,warn); @include/args %!/INC`NEED`ENCOUNTER=number,%q; @include %!/INC`NEED`RUNS; @include/args %!/INC`NEED`TARGET=name,%q; @assert not(member(u(%!/FUN`ENCOUNTER`JOINED,%q),%q))=@pemit %#=notice(ENCOUNTER,[name(%q)] is in encounter %q already.,warn); @include/args %!/INC`ENCOUNTER`COPYIN=who,%q; @remit get({{store}}/ENC`%q`ROOM)=notice(ENCOUNTER,tone(strong,name(%#)) brings [name(%q)] into encounter %q: [get({{store}}/ENC`%q)]. [tone(muted,Rolls and changes there use a copy of [poss(%q)] sheet.)]); @if comp(loc(%q),get({{store}}/ENC`%q`ROOM))={@pemit %q=notice(ENCOUNTER,[name(%#)] brings you into encounter %q: [get({{store}}/ENC`%q)].)}; @if comp(%l,get({{store}}/ENC`%q`ROOM))={@pemit %#=notice(ENCOUNTER,[name(%q)] is in encounter %q.,ok)} + @assert strlen(%q)=@pemit %#=notice(ENCOUNTER,+encounter/add [=] brings a character into your encounter.,warn); @include/args %!/INC`NEED`ENCOUNTER=number,%q; @include %!/INC`NEED`RUNS; @include/args %!/INC`NEED`TARGET=name,%q; @assert not(member(u(%!/FUN`ENCOUNTER`JOINED,%q),%q))=@pemit %#=notice(ENCOUNTER,[name(%q)] is in encounter %q already.,warn); @include/args %!/INC`ENCOUNTER`COPYIN=who,%q; @remit get({{store}}/ENC`%q`ROOM)=notice(ENCOUNTER,tone(strong,name(%#)) brings [name(%q)] into encounter %q: [get({{store}}/ENC`%q)]. [tone(muted,Rolls and changes there use a copy of [poss(%q)] sheet.)]); @if comp(objid(loc(%q)),get({{store}}/ENC`%q`ROOM))={@pemit %q=notice(ENCOUNTER,[name(%#)] brings you into encounter %q: [get({{store}}/ENC`%q)].)}; @if comp(objid(%l),get({{store}}/ENC`%q`ROOM))={@pemit %#=notice(ENCOUNTER,[name(%q)] is in encounter %q.,ok)} flags: [cmdsyntax] # +encounter/leave []: drops your copy. Nothing goes back to your sheet. INC`ENCOUNTER`LEAVE: value: |- - think setq(enc_n,if(isint(%q),%q,u(%!/FUN`ENCOUNTER`OF,%#))); @assert member(u(%!/FUN`ENCOUNTER`JOINED,%#),%q)=@pemit %#=notice(ENCOUNTER,[if(strlen(%q),You are not in encounter '%q'.,You are not in an encounter here. +encounter/leave leaves one elsewhere.)],warn); @include/args %!/INC`ENCOUNTER`DROP=who,%q,number,%q; @remit get({{store}}/ENC`%q`ROOM)=notice(ENCOUNTER,tone(strong,name(%#)) leaves encounter %q. [tone(muted,Nothing from the encounter's copy goes back to [poss(%#)] sheet.)]); @if comp(%l,get({{store}}/ENC`%q`ROOM))={@pemit %#=notice(ENCOUNTER,You leave encounter %q.,ok)} + think setq(enc_n,if(isint(%q),%q,u(%!/FUN`ENCOUNTER`OF,%#))); @assert member(u(%!/FUN`ENCOUNTER`JOINED,%#),%q)=@pemit %#=notice(ENCOUNTER,[if(strlen(%q),You are not in encounter '%q'.,You are not in an encounter here. +encounter/leave leaves one elsewhere.)],warn); @include/args %!/INC`ENCOUNTER`DROP=who,%q,number,%q; @remit get({{store}}/ENC`%q`ROOM)=notice(ENCOUNTER,tone(strong,name(%#)) leaves encounter %q. [tone(muted,Nothing from the encounter's copy goes back to [poss(%#)] sheet.)]); @if comp(objid(%l),get({{store}}/ENC`%q`ROOM))={@pemit %#=notice(ENCOUNTER,You leave encounter %q.,ok)} flags: [cmdsyntax] # +encounter/remove [=]: the GM or a keeper drops a member's copy. INC`ENCOUNTER`REMOVE: @@ -861,7 +861,7 @@ objects: # +encounter/end []: the GM or a keeper ends an encounter and drops every copy. INC`ENCOUNTER`END: value: |- - @include/args %!/INC`NEED`ENCOUNTER=number,%q; @include %!/INC`NEED`RUNS; think setqm(enc_members,u(%!/FUN`ENCOUNTER`MEMBERS,%q),enc_room,get({{store}}/ENC`%q`ROOM),enc_title,get({{store}}/ENC`%q),enc_summary,u(%!/FUN`FOE`SUMMARY,%q)); @dolist/inline %q={think u(%!/FUN`ENCOUNTER`FORGET,##,%q)}; @wipe {{store}}/ENC`%q; &ENCOUNTER`OPEN {{store}}=[setdiff(get({{store}}/ENCOUNTER`OPEN),%q)]; @remit %q=notice(ENCOUNTER,tone(strong,name(%#)) ends encounter %q: %q. [if(strlen(%q),%q%b)][tone(muted,Its copies are gone%, and only what the GM kept is on anyone's sheet.)]); @if comp(%l,%q)={@pemit %#=notice(ENCOUNTER,Encounter %q is over: %q.,ok)}; @dolist/inline %q={@if comp(loc(##),%q)={@pemit ##=notice(ENCOUNTER,[name(%#)] ends encounter %q: %q.)}} + @include/args %!/INC`NEED`ENCOUNTER=number,%q; @include %!/INC`NEED`RUNS; think setqm(enc_members,u(%!/FUN`ENCOUNTER`MEMBERS,%q),enc_room,get({{store}}/ENC`%q`ROOM),enc_title,get({{store}}/ENC`%q),enc_summary,u(%!/FUN`FOE`SUMMARY,%q)); @dolist/inline %q={think u(%!/FUN`ENCOUNTER`FORGET,##,%q)}; @wipe {{store}}/ENC`%q; &ENCOUNTER`OPEN {{store}}=[setdiff(get({{store}}/ENCOUNTER`OPEN),%q)]; @remit %q=notice(ENCOUNTER,tone(strong,name(%#)) ends encounter %q: %q. [if(strlen(%q),%q%b)][tone(muted,Its copies are gone%, and only what the GM kept is on anyone's sheet.)]); @if comp(objid(%l),%q)={@pemit %#=notice(ENCOUNTER,Encounter %q is over: %q.,ok)}; @dolist/inline %q={@if comp(objid(loc(##)),%q)={@pemit ##=notice(ENCOUNTER,[name(%#)] ends encounter %q: %q.)}} flags: [cmdsyntax] # % a character, enc_n an encounter: copies their dots, talents, momentum, stress and condition into it and # adds it to the encounters on their sheet, last joined last. From 4bce77b646722ab7103c0e3904ad3b47cb898a2f Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 6 Nov 2026 21:18:16 +0000 Subject: [PATCH 2/2] sheet-charge 1.2.3: main already took 1.2.2 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Rqqt7UANHQ73A3Wsib6mkh --- README.md | 2 +- index.yaml | 2 +- sheet-charge/package.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6761c83..95df4ad 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ The table is generated from [`index.yaml`](index.yaml); edit that file, then run | [`sheet-salvage-union-chargen/`](sheet-salvage-union-chargen/) | 1.0.2 | Joins the Salvage Union sheet to +app character applications | | [`duties-salvage-union/`](duties-salvage-union/) | 1.0.3 | Duties roll provider "salvage" on the Salvage Union sheet | | [`salvage-union-wiki/`](salvage-union-wiki/) | 1.0.5 | Salvage Union rules as wiki pages (core rules, Pilot Bay, Mech Workshop, chassis, Union Crawler, salvaging, denizens, and every ability, system, module, equipment and table); Salvage Union Open Game Licence 1.0b, unofficial | -| [`sheet-charge/`](sheet-charge/) | 1.2.2 | Charge character sheet (details, action dots, momentum, stress clock, milestones and talents) with +check action rolls, assists, determination and fortune rolls, encounters with threats and consequences, and clocks; Charge SRD under CC BY 4.0 | +| [`sheet-charge/`](sheet-charge/) | 1.2.3 | Charge character sheet (details, action dots, momentum, stress clock, milestones and talents) with +check action rolls, assists, determination and fortune rolls, encounters with threats and consequences, and clocks; Charge SRD under CC BY 4.0 | | [`sheet-charge-help/`](sheet-charge-help/) | 1.0.2 | Puts the Charge sheet topics into +help | | [`sheet-charge-config/`](sheet-charge-config/) | 1.0.2 | Puts the Charge sheet settings and action and detail tables into +config | | [`sheet-charge-chargen/`](sheet-charge-chargen/) | 1.0.2 | Joins the Charge sheet to +app character applications | diff --git a/index.yaml b/index.yaml index 6b427c4..1f172ec 100644 --- a/index.yaml +++ b/index.yaml @@ -303,7 +303,7 @@ packages: - path: sheet-charge/ name: Charge Sheet package: sheet-charge - version: 1.2.2 + version: 1.2.3 description: Charge character sheet (details, action dots, momentum, stress clock, milestones and talents) with +check action rolls, assists, determination and fortune rolls, encounters with threats and consequences, and clocks; Charge SRD under CC BY 4.0 - path: sheet-charge-help/ package: sheet-charge-help diff --git a/sheet-charge/package.yaml b/sheet-charge/package.yaml index 17ef3e1..478b037 100644 --- a/sheet-charge/package.yaml +++ b/sheet-charge/package.yaml @@ -1,7 +1,7 @@ format: "1.20" package: sheet-charge title: "Charge sheet" -version: 1.2.2 +version: 1.2.3 authors: [SharpMUSH] description: "A Charge character sheet: details, twelve actions rated in dots, momentum, a stress clock with a condition, milestones and talents built up on a ledger, encounters that keep their own copy of each sheet, with threats, danger clocks and consequences, plus progress clocks. +check rolls an action's dice against a risk for the room and gains momentum; push yourself, add tension, assist a friend, and make determination and fortune rolls. Based on the Charge SRD under CC BY 4.0 and Blades in the Dark under CC BY 3.0." license: MIT