--- Date: 2026-02-03 Session_Name: Session 20 - Many Plot Threads Tags: - pf2e - session --- # Session 20 - Many Plot Threads > **Date:** `= this.Date` • **Name:** `= this.Session_Name` --- ## 📄 Session Summary (auto) *No summary yet — click “Generate Summary” below.* ```button name ✍️ Generate AI Summary type template action Templates/Generate AI Session Summary.md templater true ``` ## 🧭 Where / When - **Region / Location:** - **In-game Date / Time:** - **Weather / Conditions:** --- ## 👥 PCs Present / Absent - **Present:** - **Absent:** --- ## ⭐ Highlights (feed the auto-summary) > Add one or more `Highlight::` lines. The button will build a summary from these. - Highlight:: - Highlight:: - Highlight:: --- ## 🎯 Quests & Progress - **Active Objectives:** - **Progress / Resolutions:** --- ## 🗣️ NPCs Met / Factions - **NPCs:** [[ ]] [[ ]] [[ ]] - **Factions Touched:** [[ ]] [[ ]] --- ## ⚔️ Encounters - **Social / Exploration:** - The group heads to their meeting with the [[Thin Wisps]] in the South Drenches. We meet them at a significantly nicer warehouse than we've seen previously. No visible guard presence, but we do notice that there are a number of other people lurking in the roof and corners watching us. - Heading into the Warehouse: - Most containers are waterside, but without a ship it's unclear if those are to be loaded or are waiting for other transport. - There are four [[Thin Wisps]] on top of the crates, three are ashy, grey skinned, while the remainder is a mutton chopped human. - [[Freddie]] also inquires as to our individual allegiances. - [[Kite]] assures them that we do not hold them in any high esteem. - **Combat:** - **Outcome / Loot:** --- ## 🧠 Intel Captured (auto) ```dataviewjs const THIS = dv.current(); const sessName = THIS.file.name; const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? ""; const sessLC = sessName.toLowerCase(); const pages = dv.pages("#npc or #faction").where(p => p.Intel); function matchesSessionField(sessionField) { const list = Array.isArray(sessionField) ? sessionField : [sessionField]; for (const s of list) { if (!s) continue; if (typeof s === "object" && s.path) { const base = s.path.split("/").pop().replace(/\.md$/i,""); if (base.toLowerCase() === sessLC) return true; } else { const text = String(s); if (text.includes(`[[${sessName}]]`)) return true; if (text.toLowerCase() === sessLC) return true; } } return false; } const rows = []; for (const p of pages) { for (const it of p.Intel) { let ok = false; if (it.session) ok = matchesSessionField(it.session); if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback if (ok) { rows.push({ from: p.file.link, date: it.date ?? "", type: it.type ?? "", summary: String(it.summary ?? ""), source: it.source ?? "", rel: it.reliability ?? "", cred: it.credibility ?? "", tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "") }); } } } rows.sort((a,b)=> String(b.date).localeCompare(String(a.date))); if (!rows.length) { dv.paragraph("_No intel captured for this session yet._"); } else { dv.table( ["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"], rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags]) ); } ``` --- ## 📦 Treasure & Rewards - **Items:** - **Coin:** - **XP / Milestones:** --- ## 🔜 Next Hooks / To-Dos - [ ] - [ ] - [ ]