From 89a45732d3aba742f8dd50176b46372402974ff4 Mon Sep 17 00:00:00 2001 From: Tim Evans Date: Wed, 15 Jul 2026 22:24:54 +0100 Subject: [PATCH] Add Field Agents compendium: 8 pregen agents Eight ready-to-play agents spanning the combat spectrum, each with stats, skills, a bio, employer/education, two bonds, and appropriate firearms: - SITKA (Special Operator, elite) ... MERCER (Forensic Scientist, support). All are combat-capable (firearms 40-80). Registered as packs/field-agents. Portraits: agents use a neutral placeholder token; build/gen-field-agents.mjs auto-wires per-agent pencil portraits from assets/tokens/.webp once present (see assets/tokens/README.md for filenames). Build script committed for reproducibility. Co-Authored-By: Claude Fable 5 --- assets/tokens/README.md | 24 ++ build/gen-field-agents.mjs | 218 ++++++++++++++++++ packs/field-agents/000005.ldb | Bin 0 -> 15899 bytes .../000004.log => field-agents/000007.log} | 0 packs/field-agents/CURRENT | 1 + .../000004.log => field-agents/LOCK} | 0 packs/field-agents/LOG | 3 + packs/field-agents/LOG.old | 5 + packs/field-agents/MANIFEST-000006 | Bin 0 -> 144 bytes .../000004.log => field-equipment/000007.log} | 0 packs/field-equipment/CURRENT | 2 +- packs/field-equipment/LOG | 8 +- packs/field-equipment/LOG.old | 5 + packs/field-equipment/MANIFEST-000002 | Bin 134 -> 0 bytes packs/field-equipment/MANIFEST-000006 | Bin 0 -> 119 bytes packs/firearms/000011.log | 0 packs/firearms/CURRENT | 2 +- packs/firearms/LOG | 8 +- packs/firearms/LOG.old | 3 + packs/firearms/MANIFEST-000002 | Bin 134 -> 0 bytes packs/firearms/MANIFEST-000010 | Bin 0 -> 119 bytes packs/pregens/000007.log | 0 packs/pregens/CURRENT | 2 +- packs/pregens/LOG | 8 +- packs/pregens/LOG.old | 5 + packs/pregens/MANIFEST-000002 | Bin 140 -> 0 bytes packs/pregens/MANIFEST-000006 | Bin 0 -> 125 bytes system.json | 13 ++ 28 files changed, 289 insertions(+), 18 deletions(-) create mode 100644 assets/tokens/README.md create mode 100644 build/gen-field-agents.mjs create mode 100644 packs/field-agents/000005.ldb rename packs/{field-equipment/000004.log => field-agents/000007.log} (100%) create mode 100644 packs/field-agents/CURRENT rename packs/{firearms/000004.log => field-agents/LOCK} (100%) create mode 100644 packs/field-agents/LOG create mode 100644 packs/field-agents/LOG.old create mode 100644 packs/field-agents/MANIFEST-000006 rename packs/{pregens/000004.log => field-equipment/000007.log} (100%) create mode 100644 packs/field-equipment/LOG.old delete mode 100644 packs/field-equipment/MANIFEST-000002 create mode 100644 packs/field-equipment/MANIFEST-000006 create mode 100644 packs/firearms/000011.log create mode 100644 packs/firearms/LOG.old delete mode 100644 packs/firearms/MANIFEST-000002 create mode 100644 packs/firearms/MANIFEST-000010 create mode 100644 packs/pregens/000007.log create mode 100644 packs/pregens/LOG.old delete mode 100644 packs/pregens/MANIFEST-000002 create mode 100644 packs/pregens/MANIFEST-000006 diff --git a/assets/tokens/README.md b/assets/tokens/README.md new file mode 100644 index 0000000..8b7623c --- /dev/null +++ b/assets/tokens/README.md @@ -0,0 +1,24 @@ +# Field Agent portraits + +Drop the eight agent portraits here as **512×512 (or larger square) WebP or PNG**, +named exactly as below, then rebuild the pack: + + node build/gen-field-agents.mjs + +The build auto-detects each file and wires it to the matching agent as both the +character-sheet portrait and the token image. Until a file is present, that agent +uses the neutral placeholder. + +| File | Agent | Profession | +|-------------------------|--------------------|---------------------------| +| agent-operator.webp | SITKA, MARCUS | Special Operator | +| agent-marine.webp | HOLLOWAY, DIANA | Force Recon Marine | +| agent-fed.webp | VANCE, THEODORE | FBI Special Agent | +| agent-detective.webp | ROURKE, BERNADETTE | Homicide Detective | +| agent-medic.webp | ELLARD, JONAH | Emergency Physician | +| agent-intel.webp | KAPLAN, SIMONE | Intelligence Case Officer | +| agent-scientist.webp | MERCER, ELLIOT | Forensic Scientist | +| agent-pilot.webp | CALLOWAY, REGINA | Contract Pilot | + +WebP is preferred (smaller). PNG also works — if you use PNG, change the +extension in `build/gen-field-agents.mjs` (`assets/tokens/${a.token}.webp`). diff --git a/build/gen-field-agents.mjs b/build/gen-field-agents.mjs new file mode 100644 index 0000000..9534e78 --- /dev/null +++ b/build/gen-field-agents.mjs @@ -0,0 +1,218 @@ +import { extractPack, compilePack } from "/Users/timevans/Git/VRPG/foundry/vanity/node_modules/@foundryvtt/foundryvtt-cli/index.mjs"; +import fs from "fs"; +import path from "path"; + +const REPO = "/Users/timevans/Git/deltagreen2"; +const OUT_SRC = "/private/tmp/claude-501/-Users-timevans-Library-Application-Support-FoundryVTT/0078d6e6-126b-4f13-b7f4-86feaf7bfbbc/scratchpad/agentsrc"; +const PACK = `${REPO}/packs/field-agents`; +const PLACEHOLDER = "systems/deltagreen2/assets/icons/person-black-bg.svg"; + +// Deterministic id from seed. +function id(seed) { + let h = 0x811c9dc5; + for (let i = 0; i < seed.length; i++) { h ^= seed.charCodeAt(i); h = Math.imul(h, 0x01000193) >>> 0; } + let s = "", x = h; const chars = "abcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 16; i++) { x = Math.imul(x ^ (x >>> 15), 0x2c1b3c6d) >>> 0; s += chars[x % chars.length]; } + return s; +} + +// Load weapon templates from the firearms pack. +const wtmp = `${OUT_SRC}/_firearms`; +fs.rmSync(OUT_SRC, { recursive: true, force: true }); +fs.mkdirSync(wtmp, { recursive: true }); +await extractPack(`${REPO}/packs/firearms`, wtmp, { yaml: false }); +const firearms = fs.readdirSync(wtmp).filter(f => f.endsWith(".json")).map(f => JSON.parse(fs.readFileSync(`${wtmp}/${f}`, "utf8"))); +function weapon(name, ownerSeed) { + const w = firearms.find(x => x.name === name); + if (!w) throw new Error(`weapon not found: ${name}`); + const o = structuredClone(w); + delete o._key; + o._id = id(`${ownerSeed}-wpn-${name}`); + return o; +} +function unarmed(ownerSeed) { + return { + _id: id(`${ownerSeed}-unarmed`), name: "Unarmed Attack", type: "weapon", + img: "systems/deltagreen2/assets/icons/unarmed.svg", + system: { skill: "unarmed_combat", range: "0M", damage: "1D4", armorPiercing: 0, lethality: 0, isLethal: false, ammo: 0, ammoMax: 0, expense: "Standard", description: "" }, + }; +} +function bond(ownerSeed, name, relationship, score) { + return { + _id: id(`${ownerSeed}-bond-${name}`), name, type: "bond", + img: "systems/deltagreen2/assets/icons/person-black-bg.svg", + system: { score, relationship, description: "", hasBeenDamagedSinceLastHomeScene: false }, + }; +} + +// ---- The eight agents ---- +// combat tier noted for reference; all can fight (firearms >= 40). +const AGENTS = [ + { + name: "SITKA, MARCUS", token: "agent-operator", + profession: "Special Operator", employer: "U.S. Army (det.) / Delta Green", nationality: "American", sex: "Male", age: "38", education: "Ranger School; SFQC", + stats: { str: 15, con: 15, dex: 16, int: 11, pow: 13, cha: 10 }, + skills: { firearms: 80, unarmed_combat: 70, melee_weapons: 60, dodge: 60, athletics: 70, alertness: 60, demolitions: 40, heavy_weapons: 50, stealth: 55, survival: 55, first_aid: 45, navigate: 45, search: 40 }, + typed: [{ label: "Explosives", group: "Military Science", proficiency: 50 }], + weapons: ["Submachine Gun (SMG)", "Heavy Pistol"], + bonds: [["Ex-wife (Karen Sitka)", "Ex-spouse", 11], ["Ranger buddy (SFC Dale Voss)", "Brother-in-arms", 13]], + bio: "Twenty years in the Regiment and then Delta before a burn notice he never got the paperwork for. Sitka is the man the cell puts on point when the door has to come down hard. He talks little, watches everything, and has already run the worst-case in his head before anyone else has drawn a weapon. What he saw on his last sanctioned deployment is the reason a man from the Program bought him a coffee and told him the truth.", + combat: "Elite", + }, + { + name: "HOLLOWAY, DIANA", token: "agent-marine", + profession: "Force Recon Marine", employer: "USMC (Reserve)", nationality: "American", sex: "Female", age: "34", education: "Recon; MARSOC selection", + stats: { str: 16, con: 15, dex: 13, int: 11, pow: 12, cha: 11 }, + skills: { firearms: 70, unarmed_combat: 60, melee_weapons: 55, dodge: 45, athletics: 60, heavy_weapons: 50, alertness: 50, survival: 45, navigate: 45, swim: 60, first_aid: 40, search: 40 }, + typed: [{ label: "Air", group: "Military Science", proficiency: 40 }], + weapons: ["Rifle (Light)", "Medium Pistol"], + bonds: [["Father (Gunnery Sgt. Ray Holloway, ret.)", "Parent", 12], ["Fire team leader (Sgt. Ana Reyes)", "Comrade", 12]], + bio: "Holloway carries the load nobody else can and never mentions it. A career Marine from a Marine family, she reads terrain and threat by instinct and keeps her people moving when things come apart. She is the cell's spine in a firefight. Privately she keeps a running count of the things that walked away from wounds that should have stopped them, and the number is getting hard to explain.", + combat: "Heavy", + }, + { + name: "VANCE, THEODORE", token: "agent-fed", + profession: "FBI Special Agent", employer: "Federal Bureau of Investigation", nationality: "American", sex: "Male", age: "41", education: "J.D.; FBI Academy", + stats: { str: 13, con: 12, dex: 13, int: 13, pow: 12, cha: 13 }, + skills: { firearms: 60, unarmed_combat: 50, melee_weapons: 40, dodge: 40, alertness: 50, criminology: 60, law: 50, humint: 50, persuade: 50, search: 50, bureaucracy: 50, drive: 45, first_aid: 40 }, + typed: [], + weapons: ["Medium Pistol"], + bonds: [["Wife (Ellen Vance)", "Spouse", 13], ["Field office partner (SA Marcus Doyle)", "Partner", 12]], + bio: "Twelve years working violent crime and public corruption made Vance a patient, methodical investigator who can also put ten rounds center-mass under stress. He runs the cell's interviews and its paper trail, and he is the one who signs the reports that keep everyone out of a cell. He believes in the rule of law. He is beginning to suspect the law has no statutes for what he now investigates.", + combat: "Strong", + }, + { + name: "ROURKE, BERNADETTE", token: "agent-detective", + profession: "Homicide Detective", employer: "Metropolitan Police Dept.", nationality: "American", sex: "Female", age: "44", education: "B.A. Criminology; PD academy", + stats: { str: 12, con: 12, dex: 13, int: 12, pow: 13, cha: 12 }, + skills: { firearms: 55, unarmed_combat: 50, melee_weapons: 40, dodge: 40, alertness: 55, criminology: 50, humint: 45, persuade: 40, search: 55, drive: 50, first_aid: 40, occult: 20 }, + typed: [], + weapons: ["Medium Pistol"], + bonds: [["Son (Danny Rourke, 16)", "Child", 14], ["Old partner (Det. Sal Ferro, ret.)", "Mentor", 11]], + bio: "Twenty-two years and a wall of closed cases, Rourke has stood over more bodies than she can name and learned to read a room in a heartbeat. She is stubborn, sharp, and quietly furious about the ones that got away. Two of those cold cases share details she has never been able to file — details that Delta Green recognized the moment she said them aloud.", + combat: "Good", + }, + { + name: "ELLARD, JONAH", token: "agent-medic", + profession: "Emergency Physician", employer: "County Trauma Center", nationality: "American", sex: "Male", age: "36", education: "M.D.; combat casualty care", + stats: { str: 12, con: 13, dex: 13, int: 14, pow: 12, cha: 11 }, + skills: { firearms: 45, unarmed_combat: 40, dodge: 35, alertness: 45, first_aid: 70, medicine: 60, surgery: 50, pharmacy: 55, search: 40, science: 0, drive: 40 }, + typed: [{ label: "Biology", group: "Science", proficiency: 45 }], + weapons: ["Medium Pistol"], + bonds: [["Sister (Dr. Naomi Ellard)", "Sibling", 12], ["Charge nurse (Whitney Cole)", "Colleague", 11]], + bio: "Ellard has kept people alive in trauma bays and once in the back of a moving truck with a flashlight in his teeth. He is the reason wounded Agents come home. He can hold a pistol steady and will if he must, but his hands were trained to close wounds, not open them. Some of what has come through his ER lately did not match any pathology he was taught, and he kept the samples.", + combat: "Moderate", + }, + { + name: "KAPLAN, SIMONE", token: "agent-intel", + profession: "Intelligence Case Officer", employer: "Central Intelligence Agency (NOC)", nationality: "American", sex: "Female", age: "37", education: "M.A. International Relations; the Farm", + stats: { str: 11, con: 12, dex: 14, int: 14, pow: 13, cha: 14 }, + skills: { firearms: 50, unarmed_combat: 45, dodge: 45, alertness: 50, stealth: 60, humint: 60, persuade: 55, disguise: 45, sigint: 40, search: 40, bureaucracy: 40, drive: 45 }, + typed: [{ label: "Arabic", group: "Foreign Language", proficiency: 50 }, { label: "Russian", group: "Foreign Language", proficiency: 40 }], + weapons: ["Light Pistol"], + bonds: [["Handler (\"Mr. Okafor\")", "Handler", 11], ["Asset she couldn't save (memory)", "Guilt", 12]], + bio: "Kaplan has lived under three names on two continents and can walk into a hostile room and walk out with everyone's secrets. She recruits, she deceives, she disappears. She can shoot well enough to break contact and vanish, which is exactly the point. She was read into Delta Green because a network she ran started reporting things her analysts flatly refused to write down.", + combat: "Moderate", + }, + { + name: "MERCER, ELLIOT", token: "agent-scientist", + profession: "Forensic Scientist", employer: "State Crime Laboratory", nationality: "American", sex: "Male", age: "33", education: "Ph.D. Molecular Biology", + stats: { str: 10, con: 11, dex: 12, int: 16, pow: 13, cha: 11 }, + skills: { firearms: 40, unarmed_combat: 30, dodge: 35, alertness: 45, computer_science: 55, forensics: 60, first_aid: 30, search: 45, occult: 15, science: 0, pharmacy: 40 }, + typed: [{ label: "Biology", group: "Science", proficiency: 65 }, { label: "Chemistry", group: "Science", proficiency: 55 }], + weapons: ["Light Pistol"], + bonds: [["Husband (Peter Mercer)", "Spouse", 13], ["Lab mentor (Dr. Ito)", "Mentor", 11]], + bio: "Mercer sees the story a scene leaves behind — trace, spatter, sequence — and reads it cold. He is the least dangerous man in the cell with a weapon and the most dangerous with a microscope. He carries a pistol because the others insisted, and he practices, badly, because he has now seen what happens to the people who don't. A tissue sample he could not classify is the reason he stopped sleeping.", + combat: "Support", + }, + { + name: "CALLOWAY, REGINA", token: "agent-pilot", + profession: "Contract Pilot", employer: "Private aviation / former USAF", nationality: "American", sex: "Female", age: "39", education: "USAF flight school; ATP rating", + stats: { str: 12, con: 12, dex: 15, int: 13, pow: 12, cha: 12 }, + skills: { firearms: 50, unarmed_combat: 40, dodge: 45, alertness: 50, drive: 50, navigate: 60, heavy_machiner: 45, athletics: 40, first_aid: 40, search: 40, sigint: 30 }, + typed: [{ label: "Aircraft", group: "Pilot", proficiency: 65 }, { label: "Rotary Wing", group: "Pilot", proficiency: 50 }], + weapons: ["Medium Pistol"], + bonds: [["Daughter (Mia Calloway, 11)", "Child", 14], ["Wingman (Capt. Joe Brandt)", "Comrade", 11]], + bio: "Calloway can put an aircraft down on a road at night with the instruments dead, and she has. Cool, precise, and quietly reckless, she is the cell's way in and way out. On the ground she handles a pistol like the trained officer she was. She took a Program contract for the flight pay and the questions nobody would answer, and she is still deciding whether that was the worst mistake of her life.", + combat: "Moderate", + }, +]; + +if (AGENTS.length !== 8) { console.error("need 8"); process.exit(1); } + +// Base skill defaults so an agent's non-combat skills look like the pregens (partial override on top of schema defaults is fine). +fs.mkdirSync(OUT_SRC, { recursive: true }); + +let sort = 0; +for (const a of AGENTS) { + const seed = a.name; + const _id = id(`dg2-agent-${seed}`); + const { str, con, dex, int, pow, cha } = a.stats; + const hp = Math.ceil((str + con) / 2); + const san = pow * 5; + + // Build skills object (only overrides; DataModel fills the rest with defaults). + const skills = {}; + for (const [k, v] of Object.entries(a.skills)) { + if (v > 0) skills[k] = { proficiency: v }; + } + const typedSkills = {}; + a.typed.forEach((t, i) => { + typedSkills[`tskill_${String(i + 1).padStart(2, "0")}`] = { label: t.label, group: t.group, proficiency: t.proficiency, failure: false }; + }); + + const items = [ + ...a.weapons.map((w) => weapon(w, seed)), + unarmed(seed), + ...a.bonds.map(([n, r, s]) => bond(seed, n, r, s)), + ]; + // Embedded items need a hierarchical compile key: !actors.items!. + for (const it of items) { + it._key = `!actors.items!${_id}.${it._id}`; + } + + // Use the pencil portrait for both sheet image and token once it exists on disk; + // otherwise fall back to the neutral placeholder. + const tokenRel = `assets/tokens/${a.token}.webp`; + const tokenImg = fs.existsSync(`${REPO}/${tokenRel}`) + ? `systems/deltagreen2/${tokenRel}` + : PLACEHOLDER; + const doc = { + _id, _key: `!actors!${_id}`, name: a.name, type: "agent", + img: tokenImg, + system: { + statistics: { + str: { value: str }, con: { value: con }, dex: { value: dex }, + int: { value: int }, pow: { value: pow }, cha: { value: cha }, + }, + health: { value: hp, min: 0, max: hp }, + wp: { value: pow, min: 0, max: pow }, + sanity: { value: san, currentBreakingPoint: san - pow, breakingPointHit: false }, + skills, typedSkills, + biography: { + profession: a.profession, employer: a.employer, nationality: a.nationality, + sex: a.sex, age: a.age, education: a.education, + }, + physical: { description: `

${a.bio}

Combat rating: ${a.combat}.

` }, + }, + prototypeToken: { + name: a.name, + texture: { src: tokenImg, anchorX: 0.5, anchorY: 0.5, fit: "contain", scaleX: 1, scaleY: 1 }, + displayName: 20, actorLink: true, sight: { enabled: true }, + }, + items, + effects: [], + folder: null, + sort: (sort += 1000), + ownership: { default: 0 }, + flags: { deltagreen2: { plannedToken: tokenImg, combat: a.combat } }, + _stats: { systemId: "deltagreen2", systemVersion: "2.0.0" }, + }; + + fs.writeFileSync(path.join(OUT_SRC, `${seed.replace(/[^a-z0-9]+/gi, "_")}_${_id}.json`), JSON.stringify(doc, null, 2)); +} + +fs.rmSync(wtmp, { recursive: true, force: true }); +fs.rmSync(PACK, { recursive: true, force: true }); +await compilePack(OUT_SRC, PACK, { yaml: false }); +console.log(`Compiled ${AGENTS.length} agents into ${PACK}`); diff --git a/packs/field-agents/000005.ldb b/packs/field-agents/000005.ldb new file mode 100644 index 0000000000000000000000000000000000000000..4c389f97ccb6607ccc21f759b6b024d0f79d8d0f GIT binary patch literal 15899 zcmd6u3w#^Zo$u#38v7`*h3v?QNKA4h>|j$_kz`4hmEcBx#ZIi)v7Hy>!AKfOV~u8% znUN(q1d^2S>H_6;q2WJ^=D*BqtR$abI$Mo{r~=dy-BhRdF?z47uIA&wX|f_wpd*CCdZtaT&oa6 zib5v$+YPMDO{W|g=k56`;$`vXH=HnMJDL!cK{Yq=C!e0mKR<0TEA3dtC3 zq~=tOPpT^;yr^+8h36&LN={XIO*72oYH|BwW_63rniM3f-vRer*6L?9T_$C}kYQZy7cyw4N#!I#%Uy8Mpcl3X zrxgWGs6*kogdoKRW%hp>-9DQ&1Uv5P6*Q|q%84ouAD|`#QEV`pqXKNJB-zSrN|B>N zSm32_&gyr2V4JiAukevwVL2J%8W?Xq!#FIqN;wka(e19K4AX)>TgQpKqDj1Z=}w03 zOx1RAffdXiZ#%=ZqHSh)KkQWM+0HOtw9KTYl^CxyRJn2t<3SggQgQeQ4t>|ZjXuBA zsKUX78*Xv=8T}8iB8>GYjLz+_JQuiM7a8`fVzh=HyvyN4XW}9k;zhV-9fB;%u^e2( zm?EcBux7Yn2=i8(Ut;P#Hfxj<#I(XY?`niI3JG#d;ZpJ1pH%XyDg^E~S-X?G60_WW zj10zeDjX^&!LImZN|bZF0(ZaA+i+K zn@?|z^CSd=lgLrRk)%8Zqkw2i8rEb4Ee`9VBB#bhAr{x@F5-epG@gf{MtWhN@C0@M zBLYS_$-tRM_y`HmIijLx%{+t(;AFS7*(6KI9%RXoZaN;9wH*A@nVidgb4dtcaqb>aAs1Dq&O|!J?x{Ooq;b+ zK zfvmtOcpMHmIyobO@Wo+h-c2HWluL{7(*Cbi!dQwOX?pF~sKE>;Bf&*&zW4c`4jC&L z&GM8^U3qd1(|n}eWY6%Sly&0Gqfar`jq@5lV0KL|Wz|#m%0AF(*Od%ot2!TV=9L?- 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

N=KmgyqEJ%ADC$}jy(~&pMK6omTA%Q; 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 G_5T1go30c9 literal 0 HcmV?d00001 diff --git a/packs/field-equipment/000004.log b/packs/field-agents/000007.log similarity index 100% rename from packs/field-equipment/000004.log rename to packs/field-agents/000007.log diff --git a/packs/field-agents/CURRENT b/packs/field-agents/CURRENT new file mode 100644 index 0000000..f7753e2 --- /dev/null +++ b/packs/field-agents/CURRENT @@ -0,0 +1 @@ +MANIFEST-000006 diff --git a/packs/firearms/000004.log b/packs/field-agents/LOCK similarity index 100% rename from packs/firearms/000004.log rename to packs/field-agents/LOCK diff --git a/packs/field-agents/LOG b/packs/field-agents/LOG new file mode 100644 index 0000000..f0d5b9a --- /dev/null +++ b/packs/field-agents/LOG @@ -0,0 +1,3 @@ +2026/07/15-22:23:04.934660 170de3000 Recovering log #4 +2026/07/15-22:23:04.935753 170de3000 Delete type=0 #4 +2026/07/15-22:23:04.935801 170de3000 Delete type=3 #2 diff --git a/packs/field-agents/LOG.old b/packs/field-agents/LOG.old new file mode 100644 index 0000000..2a80e6a --- /dev/null +++ b/packs/field-agents/LOG.old @@ -0,0 +1,5 @@ +2026/07/15-22:22:50.755440 171b2b000 Delete type=3 #1 +2026/07/15-22:22:50.756827 171bb7000 Level-0 table #5: started +2026/07/15-22:22:50.757226 171bb7000 Level-0 table #5: 15899 bytes OK +2026/07/15-22:22:50.757333 171bb7000 Delete type=0 #3 +2026/07/15-22:22:50.757432 171bb7000 Manual compaction at level-0 from '!actors!3xs9ghs6mv1wy7ig' @ 72057594037927935 : 1 .. '!actors.items!vq78xlw4wwkiw4u4.zh5tsusgjddror4q' @ 0 : 0; will stop at (end) diff --git a/packs/field-agents/MANIFEST-000006 b/packs/field-agents/MANIFEST-000006 new file mode 100644 index 0000000000000000000000000000000000000000..7f95c7141e17616cee21ec0b58842256adbf3159 GIT binary patch literal 144 zcmaFi_tUQEZl5W>{Wno|(?b#sCK9Pz8FKC8@c^ie-i778N<=CgtVXndK&>CVEvFrX|It h#pzioDMk53CWVZ$5PhvY(UUkB7@62P8JIa(v;e9{D^36a literal 0 HcmV?d00001 diff --git a/packs/pregens/000004.log b/packs/field-equipment/000007.log similarity index 100% rename from packs/pregens/000004.log rename to packs/field-equipment/000007.log diff --git a/packs/field-equipment/CURRENT b/packs/field-equipment/CURRENT index 1a84852..f7753e2 100644 --- a/packs/field-equipment/CURRENT +++ b/packs/field-equipment/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000006 diff --git a/packs/field-equipment/LOG b/packs/field-equipment/LOG index 29e5568..86c9cee 100644 --- a/packs/field-equipment/LOG +++ b/packs/field-equipment/LOG @@ -1,5 +1,3 @@ -2026/07/15-21:04:44.645310 17171b000 Delete type=3 #1 -2026/07/15-21:04:44.647621 1717a7000 Level-0 table #5: started -2026/07/15-21:04:44.648040 1717a7000 Level-0 table #5: 13451 bytes OK -2026/07/15-21:04:44.648151 1717a7000 Delete type=0 #3 -2026/07/15-21:04:44.648243 1717a7000 Manual compaction at level-0 from '!items!0ggfh90orzn6ldrf' @ 72057594037927935 : 1 .. '!items!zzorhwhnj04fox00' @ 0 : 0; will stop at (end) +2026/07/15-22:02:36.943600 172963000 Recovering log #4 +2026/07/15-22:02:36.944823 172963000 Delete type=0 #4 +2026/07/15-22:02:36.944861 172963000 Delete type=3 #2 diff --git a/packs/field-equipment/LOG.old b/packs/field-equipment/LOG.old new file mode 100644 index 0000000..efbc487 --- /dev/null +++ b/packs/field-equipment/LOG.old @@ -0,0 +1,5 @@ +2026/07/15-22:02:25.536804 17327b000 Delete type=3 #1 +2026/07/15-22:02:25.539278 173b13000 Level-0 table #5: started +2026/07/15-22:02:25.539775 173b13000 Level-0 table #5: 13451 bytes OK +2026/07/15-22:02:25.539885 173b13000 Delete type=0 #3 +2026/07/15-22:02:25.539970 173b13000 Manual compaction at level-0 from '!items!0ggfh90orzn6ldrf' @ 72057594037927935 : 1 .. '!items!zzorhwhnj04fox00' @ 0 : 0; will stop at (end) diff --git a/packs/field-equipment/MANIFEST-000002 b/packs/field-equipment/MANIFEST-000002 deleted file mode 100644 index e511d0a1c00ed956b08b7301a027f226cfcd0ad6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmWIhx#Ncn10$nUPHI_dPD+xVQ)NkNd1i5{bAE0?Vo_pAe$kRS-TOEg7@3$k8JJmE z80-%iDER`pEI=+Biw!#yYj>u+VrEHdZn2_4dU{%hr9pmCRi0T+N>Li42m=_vb|e@&JV}Bzyn> diff --git a/packs/field-equipment/MANIFEST-000006 b/packs/field-equipment/MANIFEST-000006 new file mode 100644 index 0000000000000000000000000000000000000000..fbcd59da9b0437ab07e802b20678c747540730a2 GIT binary patch literal 119 zcmXs1(w>mWz{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&PMD+MOw{m|2pVTdZi1 zo}QLrX^>x3m1mZdQk2Fh!T<&^`Kqe?qKxv4yetEgwEPMK14d(ryta8{AO`~@6FVmZ IGY5+e0O)KWpa1{> literal 0 HcmV?d00001 diff --git a/packs/firearms/000011.log b/packs/firearms/000011.log new file mode 100644 index 0000000..e69de29 diff --git a/packs/firearms/CURRENT b/packs/firearms/CURRENT index 1a84852..3051f81 100644 --- a/packs/firearms/CURRENT +++ b/packs/firearms/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000010 diff --git a/packs/firearms/LOG b/packs/firearms/LOG index 7e882a4..153d782 100644 --- a/packs/firearms/LOG +++ b/packs/firearms/LOG @@ -1,5 +1,3 @@ -2026/07/15-17:36:13.527610 1723af000 Delete type=3 #1 -2026/07/15-17:36:13.528598 17243b000 Level-0 table #5: started -2026/07/15-17:36:13.528807 17243b000 Level-0 table #5: 3054 bytes OK -2026/07/15-17:36:13.528916 17243b000 Delete type=0 #3 -2026/07/15-17:36:13.528992 17243b000 Manual compaction at level-0 from '!items!0Gz1jcY28Psezqrv' @ 72057594037927935 : 1 .. '!items!xb73X4SjsbuYs4D7' @ 0 : 0; will stop at (end) +2026/07/15-22:22:50.743988 170307000 Recovering log #9 +2026/07/15-22:22:50.744961 170307000 Delete type=3 #8 +2026/07/15-22:22:50.745008 170307000 Delete type=0 #9 diff --git a/packs/firearms/LOG.old b/packs/firearms/LOG.old new file mode 100644 index 0000000..b35bc57 --- /dev/null +++ b/packs/firearms/LOG.old @@ -0,0 +1,3 @@ +2026/07/15-22:22:15.799508 17060f000 Recovering log #7 +2026/07/15-22:22:15.800756 17060f000 Delete type=0 #7 +2026/07/15-22:22:15.800799 17060f000 Delete type=3 #6 diff --git a/packs/firearms/MANIFEST-000002 b/packs/firearms/MANIFEST-000002 deleted file mode 100644 index 38aebeaa9ac187a3d48b3a147e65d5c073b80710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmWIhx#Ncn10$nUPHI_dPD+xVQ)NkNd1i5{bAE0?Vo_pAe$kRS-TOEg7@3$k8JJmE z7%qC&fAj@%S%6$N7A|%s)_3CaikT&;xy6bG?p20a$&p4D0mZ3Rg+*nITnu0UldniJ WH;ym~&MHnSjVv~CF=u3k$O8bv@+V8L=W;MGGI4V< JF!Qi*0RZapArk-q literal 0 HcmV?d00001 diff --git a/packs/pregens/000007.log b/packs/pregens/000007.log new file mode 100644 index 0000000..e69de29 diff --git a/packs/pregens/CURRENT b/packs/pregens/CURRENT index 1a84852..f7753e2 100644 --- a/packs/pregens/CURRENT +++ b/packs/pregens/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000006 diff --git a/packs/pregens/LOG b/packs/pregens/LOG index f8dfe4a..adbf822 100644 --- a/packs/pregens/LOG +++ b/packs/pregens/LOG @@ -1,5 +1,3 @@ -2026/07/15-17:36:14.183161 171397000 Delete type=3 #1 -2026/07/15-17:36:14.206130 17243b000 Level-0 table #5: started -2026/07/15-17:36:14.226780 17243b000 Level-0 table #5: 3411818 bytes OK -2026/07/15-17:36:14.226999 17243b000 Delete type=0 #3 -2026/07/15-17:36:14.227636 17243b000 Manual compaction at level-0 from '!actors!02uQjuR9EWKHVnMm' @ 72057594037927935 : 1 .. '!folders!w3IlJRYnQRCVCyhK' @ 0 : 0; will stop at (end) +2026/07/15-22:14:12.714607 16ebf7000 Recovering log #4 +2026/07/15-22:14:12.716049 16ebf7000 Delete type=0 #4 +2026/07/15-22:14:12.716099 16ebf7000 Delete type=3 #2 diff --git a/packs/pregens/LOG.old b/packs/pregens/LOG.old new file mode 100644 index 0000000..f8dfe4a --- /dev/null +++ b/packs/pregens/LOG.old @@ -0,0 +1,5 @@ +2026/07/15-17:36:14.183161 171397000 Delete type=3 #1 +2026/07/15-17:36:14.206130 17243b000 Level-0 table #5: started +2026/07/15-17:36:14.226780 17243b000 Level-0 table #5: 3411818 bytes OK +2026/07/15-17:36:14.226999 17243b000 Delete type=0 #3 +2026/07/15-17:36:14.227636 17243b000 Manual compaction at level-0 from '!actors!02uQjuR9EWKHVnMm' @ 72057594037927935 : 1 .. '!folders!w3IlJRYnQRCVCyhK' @ 0 : 0; will stop at (end) diff --git a/packs/pregens/MANIFEST-000002 b/packs/pregens/MANIFEST-000002 deleted file mode 100644 index e75390a0ab47b301d1aaf3625e2a239230abbaaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmWIhx#Ncn10$nUPHI_dPD+xVQ)NkNd1i5{bAE0?Vo_pAe$kRS-TOEg7@3$k8JJmE z7&cG*I6WB1WdU;8SRSggGqJv!cY#qsF)`pgoS$2eSd>_jU&PMD`fA<1x4ls204d0S7vxK^74UI Vl$iD