| Latest version | 0.3.2 |
|---|---|
| Minimum Core | |
| Compatible Core | |
| Last updated | 13 hours ago |
| Created | 13 hours ago |
| Authors | |
| Languages |
English Español |
| Systems |
Dnd5e |
| Project source | Project URL |
| Report bugs | Bug tracker URL |
| Read-me | Readme URL |
| Changelog | Changelog URL |
Party-aware encounter analysis for D&D 5e, straight from Foundry VTT
Mismatch briefing · round-by-round combat plan · contingencies for when the fight turns
English · Español
The briefing — not a difficulty score, a list of things that will actually go wrong:
The panel — pick who is at the table, load monsters from the canvas or the combat tracker:
The combat plan — what each monster does, against whom, and why:
Every encounter builder answers the same question: how hard is this, in XP? None of them answer the one a GM actually asks: how will this party fare against this monster?
Bula +3 → 65%). You can check the maths instead of taking the tool's word for it.aparicion finds Aparición), filter by folder, set how many of each. Plan a fight days before a single token touches the canvas.Alt+L), a button in the combat tracker that loads the fight in progress, and the picker itself.| # | Check | Question it answers |
|---|---|---|
| 1 | Damage matchup | Do their damage types collide with resistances or immunities? |
| 2 | Partial immunity | Is one character's main damage type dead against this monster? |
| 3 | Save matchup | Which save does the monster target, and who fails it? |
| 4 | Soft spot | Is one save targeted by several monsters at once? |
| 5 | Reach & mobility | Can anyone touch a flyer or a shooter? |
| 6 | Action economy & defensive read | Are they outnumbered? Who is the weak link, and how many hits until they drop? |
The defensive read measures a monster's full round, multiattack included — not one lonely claw.
A monster with ten eye rays produces four grouped findings, not ten. Consolidation by ability is the difference between signal and noise.
The XP/CR baseline appears as context only, never as a verdict.
In Foundry: Add-on Modules → Install Module and paste the manifest URL:
https://github.com/GegesVTT/gg-encounter-lens/releases/latest/download/module.json
Then enable GG Encounter Lens in Manage Modules of your dnd5e world. (Manual alternative: drop the gg-encounter-lens folder into Data/modules/.)
Two entry points, both GM-only:
Alt+L shortcut.In the panel: tick the characters who are at the table (the selection is remembered between sessions), then build the encounter — search the world's NPCs, pull them from selected tokens, or grab the combat tracker. Adjust quantities with + / −, save the encounter under a name to reload it later, pick how many rounds to plan, and read the omens.
Analysis runs on live actor data, so ability modifiers, AC and hit points come out exactly as the sheet shows them — active effects included.
const api = game.modules.get("gg-encounter-lens").api;
api.open(); // open the panel
api.open({ fromCombat: true }); // open it with the current fight loaded
// Analyse without touching the UI
const party = ["Rahegal", "Xanax", "Bula"].map(n => game.actors.getName(n));
const foes = [{ actor: game.actors.getName("Beholder"), count: 1 }];
const { report, plan } = api.analyze(party, foes, { rounds: 3 });
console.log(report.verdict, report.notes, plan.rounds, plan.contingencies);
// Straight to plain text, ready to paste into a journal
const text = api.toText(party, foes, { rounds: 4 });
character for the party, npc for the encounter.extract.mjs (system JSON → normalised IR) → analyze.mjs / tactics.mjs (IR → structured findings) → i18n.mjs + the panel (findings → text). The engines know nothing about Foundry or dnd5e and emit {key, data} notes, never finished strings, so they are testable outside Foundry and work in any language.bridge.mjs is the only file that touches Foundry documents. It feeds live actors through actor.toObject() — which returns the same shape as an exported JSON — and layers the runtime-derived values on top.ac:{flat:null}, hp.max:null, no save totals, no level); NPC JSON stores everything resolved. The extractor always prefers a derived value and only reconstructs one as a fallback, so inside Foundry there is no estimation at all — and any value that was estimated is flagged in the briefing rather than passed off as fact.activation.type separates actions, bonus actions, legendary actions, lair actions and passive traits. A lair action happens on initiative 20 and a passive trait is not a move at all — the plan would be nonsense without that split.two with its claws → 2); (2) if it does not — half-translated compendiums often mix Mordisco with Claw — the feature is still flagged and the monster's weapons are listed so the GM can build the round; (3) only a trait with no relation to its attacks is ignored. A round that hits harder than the tool shows is stated outright rather than quietly under-reported.uses.recovery, activity-level uses, and the legacy system.recharge written by third-party importers — so a dragon's breath weapon does not come back every round.range:{units:"self"} in structured data. The reach check under-reports for those. Documented rather than papered over.encounter builder · encounter balance · encounter analysis · combat planner · monster tactics · GM tools · session prep · party analysis · resistances · immunities · saving throws · action economy · D&D 5e · dnd5e · Foundry VTT
MIT — © Geges
Part of the GegesVTT family: GG Sheet Export · GG Nameforge · GG Calendar
Análisis de encuentros consciente del grupo para D&D 5e, directo desde Foundry VTT. Informe de desajustes · plan de combate ronda por ronda · contingencias para cuando la pelea se tuerce.
Todos los constructores de encuentros responden la misma pregunta: ¿cuán difícil es esto, en XP? Ninguno responde la que el DM realmente se hace: ¿cómo le va a ir a este grupo contra este monstruo?
Bula +3 → 65%). Podés verificar la cuenta en vez de creerle a la herramienta.aparicion encuentra Aparición), filtrá por carpeta y elegí cuántos de cada uno. Podés armar la pelea días antes de que un token toque el mapa.Alt+L), un botón en el rastreador de combate que carga la pelea en curso, y el propio selector.| # | Chequeo | Qué responde |
|---|---|---|
| 1 | Cruce de daño | ¿Sus tipos de daño chocan con resistencias o inmunidades? |
| 2 | Inmunidad parcial | ¿La vía de daño principal de un PJ muere contra este bicho? |
| 3 | Cruce de salvaciones | ¿A qué salvación apunta el monstruo y quién la falla? |
| 4 | Punto débil | ¿Hay una salvación castigada por varios monstruos a la vez? |
| 5 | Alcance y movilidad | ¿Alguien puede tocar a un volador o a un tirador? |
| 6 | Economía de acción y lectura defensiva | ¿Los superan en número? ¿Quién es el eslabón débil y en cuántos golpes cae? |
La lectura defensiva mide la ronda completa del monstruo, multiataque incluido — no una garra suelta.
Un monstruo con diez rayos oculares produce cuatro hallazgos agrupados, no diez. La consolidación por habilidad es la diferencia entre señal y ruido.
El baseline de VD/XP aparece solo como contexto, nunca como dictamen.
En Foundry: Módulos Complementarios → Instalar Módulo y pegá la URL de manifiesto:
https://github.com/GegesVTT/gg-encounter-lens/releases/latest/download/module.json
Después activá GG Encounter Lens en Gestionar Módulos de tu mundo dnd5e. (Alternativa manual: copiá la carpeta gg-encounter-lens dentro de Data/modules/.)
Dos vías de entrada, ambas solo para el DM:
Alt+L.En el panel: tildá los personajes que están en la mesa (la selección se recuerda entre sesiones) y armá el encuentro — buscando entre los PNJs del mundo, desde los tokens seleccionados o desde el combate. Ajustá cantidades con + / −, guardá el encuentro con un nombre para recuperarlo después, elegí cuántas rondas planificar, y leé los augurios.
El análisis corre sobre los datos vivos del actor: los modificadores, la CA y los PV salen exactamente como los muestra la ficha, efectos activos incluidos.
const api = game.modules.get("gg-encounter-lens").api;
api.open(); // abre el panel
api.open({ fromCombat: true }); // lo abre con el combate actual cargado
// Analizar sin tocar la interfaz
const grupo = ["Rahegal", "Xanax", "Bula"].map(n => game.actors.getName(n));
const bichos = [{ actor: game.actors.getName("Beholder"), count: 1 }];
const { report, plan } = api.analyze(grupo, bichos, { rounds: 3 });
console.log(report.verdict, report.notes, plan.rounds, plan.contingencies);
// Directo a texto plano, listo para pegar en un journal
const texto = api.toText(grupo, bichos, { rounds: 4 });
character para el grupo, npc para el encuentro.extract.mjs (JSON del sistema → IR normalizada) → analyze.mjs / tactics.mjs (IR → hallazgos estructurados) → i18n.mjs y el panel (hallazgos → texto). Los motores no saben nada de Foundry ni de dnd5e y emiten notas {key, data}, nunca cadenas armadas: son testeables fuera de Foundry y funcionan en cualquier idioma.bridge.mjs es el único archivo que toca documentos de Foundry. Pasa los actores vivos por actor.toObject() —que devuelve la misma forma que un JSON exportado— y le superpone los valores derivados en runtime.ac:{flat:null}, hp.max:null, sin totales de salvación ni nivel); el de un PNJ los guarda todos resueltos. El extractor siempre prefiere el valor derivado y solo reconstruye como fallback, así que dentro de Foundry no hay ninguna estimación — y si algún valor sí se estimó, el informe lo avisa en vez de disimularlo.activation.type separa acciones, acciones adicionales, legendarias, de guarida y rasgos pasivos. Una acción de guarida ocurre en iniciativa 20 y un rasgo pasivo no es una movida: sin esa distinción el plan sería un disparate.dos con sus garras → 2); (2) si no —los compendios a medio traducir mezclan Mordisco con Claw todo el tiempo—, el rasgo se marca igual y se listan las armas del bicho para que el DM arme la ronda; (3) solo se ignora un rasgo que no tenga relación con sus ataques. Que la ronda real pegue más de lo que muestra la herramienta se dice de frente, no se subestima callando.uses.recovery, usos a nivel de activity, y el system.recharge heredado que escriben los importadores de terceros — para que el aliento de un dragón no vuelva cada ronda.range:{units:"self"} en los datos estructurados. El chequeo de alcance sub-reporta en esos casos. Documentado, no tapado.constructor de encuentros · balance de encuentros · análisis de encuentros · planificador de combate · táctica de monstruos · herramientas de DM · preparación de sesión · análisis del grupo · resistencias · inmunidades · salvaciones · economía de acción · D&D 5e · dnd5e · Foundry VTT
MIT — © Geges
Parte de la familia GegesVTT: GG Sheet Export · GG Nameforge · GG Calendar
GG Encounter Lens · GegesVTT · Crónicas Bárdicas
To install this package, open your Foundry Setup screen and navigate to your Module tab and click the Install Module button.
From there, you can either search for the package unique name: gg-encounter-lens or copy its manifest URL:
And paste it to the input box at the bottom of your window.

You can install this package directly to your Forge account.