D&D 5e death-save state machine, undo/redo fixes, dev bulk delete #4
@@ -7,6 +7,7 @@ Backlog of bugs + long-term items. Milestones live in REWORK_PLAN.md.
|
||||
|
||||
|
||||
### dm list - keep active particpant in view (scroll)
|
||||
not sure good way to do this
|
||||
|
||||
### combat.js doesnt seem to actually exercise the add characters. there are no characters in the campaign. only in the encounter..
|
||||
|
||||
@@ -99,6 +100,9 @@ Backlog of bugs + long-term items. Milestones live in REWORK_PLAN.md.
|
||||
- Migration: keep old log entries readable; new format for new writes.
|
||||
|
||||
|
||||
### quality of life fix: 2. UI says "Campaign Characters", field is players --- naming mismatch (separate concern, flag for later)
|
||||
|
||||
|
||||
## FEAT - parallel campaigns
|
||||
|
||||
## FEAT - multi user
|
||||
|
||||
@@ -41,9 +41,9 @@ const pick = (arr) => arr[Math.floor(Math.random() * arr.length)];
|
||||
|
||||
function buildRoster() {
|
||||
return [
|
||||
{ name: 'Fighter', defaultMaxHp: 200, defaultInitMod: 2 },
|
||||
{ name: 'Cleric', defaultMaxHp: 180, defaultInitMod: 1 },
|
||||
{ name: 'Rogue', defaultMaxHp: 160, defaultInitMod: 3 },
|
||||
{ id: 'char-fighter', name: 'Fighter', defaultMaxHp: 200, defaultInitMod: 2 },
|
||||
{ id: 'char-cleric', name: 'Cleric', defaultMaxHp: 180, defaultInitMod: 1 },
|
||||
{ id: 'char-rogue', name: 'Rogue', defaultMaxHp: 160, defaultInitMod: 3 },
|
||||
];
|
||||
}
|
||||
function buildMonsters() {
|
||||
@@ -239,6 +239,7 @@ module.exports = async function replay(args) {
|
||||
await callStep('setup_campaign', { campaignId }, async () =>
|
||||
storage.setDoc(getPath.campaign(campaignId), {
|
||||
id: campaignId, name: `Replay Campaign ${runStamp}`, createdAt: Date.now(),
|
||||
players: buildRoster(),
|
||||
})
|
||||
);
|
||||
await callStep('setup_encounter', { encounterId }, async () =>
|
||||
|
||||
@@ -56,7 +56,7 @@ let display = {
|
||||
hideNpcHp: false,
|
||||
};
|
||||
const CAMPAIGN_ID = 'camp-1';
|
||||
const roster = [];
|
||||
const CAMPAIGN_PATH = `campaigns/${CAMPAIGN_ID}`;const roster = [];
|
||||
|
||||
let storage, ctx;
|
||||
const DISPLAY_PATH = 'activeDisplay/status';
|
||||
@@ -74,7 +74,16 @@ const any = (name) => enc.participants.find(p => p.name === name);
|
||||
const anyById = (id) => enc.participants.find(p => p.id === id);
|
||||
|
||||
function addCharacterViaUI(name, maxHp, initMod) {
|
||||
roster.push({ id: `char-${name}`, name, defaultMaxHp: maxHp, defaultInitMod: initMod });
|
||||
const character = { id: `char-${name}`, name, defaultMaxHp: maxHp, defaultInitMod: initMod };
|
||||
roster.push(character);
|
||||
// persist to campaign doc (mirrors app: players array)
|
||||
if (storage) {
|
||||
const existing = (storage.docs.get(CAMPAIGN_PATH) || {}).players || [];
|
||||
storage.setDoc(CAMPAIGN_PATH, {
|
||||
id: CAMPAIGN_ID, name: 'Scenario Campaign', createdAt: Date.now(),
|
||||
players: [...existing, character],
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async function addMonsterParticipant(name, maxHp, initMod, asNpc = false) {
|
||||
|
||||
Reference in New Issue
Block a user