Skip to content

Commit 6477009

Browse files
committed
JackForge: WarMachine to Pathfinder 'Jack Converter
Desktop app with three conversion modes (PF1e, PF2e, and an APF1e hit-location box-out system), an embeddable single-file web version, and Foundry SBC / Bestiary Import export. Recalibrated to legal Pathfinder ranges and validated against sixteen reference jacks across all six factions.
0 parents  commit 6477009

31 files changed

Lines changed: 4285 additions & 0 deletions

.gitignore

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Build output
2+
bin/
3+
obj/
4+
dist/
5+
publish/
6+
*.user
7+
*.suo
8+
9+
# IDE
10+
.vs/
11+
.idea/
12+
*.DotSettings.user
13+
14+
# OS cruft
15+
Thumbs.db
16+
.DS_Store

DESIGN.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# JackForge — WarMachine to Pathfinder 'Jack Converter (reforged)
2+
3+
A cross-platform (Avalonia/.NET) reimagining of Victor's 2013 "'Jack Converter"
4+
(`Warmachine to Iron Kingdoms d20 'Jack Converter`, recovered by reverse-engineering the
5+
original ClickOnce .NET assembly). Gritty steampunk "schematic review tool" GUI.
6+
7+
## Tabs
8+
1. **PF1e** — Pathfinder 1st Edition. Faithful port of the recovered 3.5-era logic (PF1 was
9+
largely a 3.5 update). See `Conversion/Pf1Converter.cs`.
10+
2. **PF2e** — Pathfinder 2nd Edition. New system. Built by the **benchmark-via-CR** method
11+
(Victor's choice): PF1 CR -> clamped creature level -> read Paizo "Building Creatures"
12+
benchmark numbers by assigned High/Moderate/Low role. See `Conversion/Pf2Converter.cs`,
13+
`Conversion/Pf2Benchmarks.cs`.
14+
3. **APF1e** — Advanced PF1e. Victor's dream "box-out" system: HP spread across hit locations
15+
(Head, Torso, 2 Arms, 2 Legs) like a WarMachine damage grid. See `Conversion/BoxOut.cs`.
16+
17+
## Locked design decisions (from Victor)
18+
- **APF1e HP split:** fixed ruleset-wide percentages. Current constants (tunable in
19+
`BoxOutConverter`): Head 12%, Torso 34%, each Arm 15%, each Leg 12%. Torso absorbs rounding.
20+
- **Box-out consequences (formalized):**
21+
- Arm destroyed -> that arm's weapon unusable; both arms -> no melee.
22+
- Leg destroyed -> Speed halved; both -> immobilized/prone.
23+
- Head/Cortex destroyed -> 'jack inert (wrecked).
24+
- Torso/Boiler destroyed -> wrecked + boiler explosion (Reflex save, AoE fire).
25+
- Myrmidon Energy Field = temp HP, depleted before any location can be hit.
26+
- Colossals = two structures (Left/Right); wrecked when both Torsos (or both Heads) gone.
27+
- **PF2e method:** benchmark via CR.
28+
- **Exports:** PF1e -> Foundry **SBC** (Paizo DEFENSE/OFFENSE/STATISTICS text, `Con —`).
29+
PF2e -> Foundry **pf2e-bestiary-import** (bracketed action costs, blank-line separators,
30+
ability *modifiers*, construct immunities; `Mindless` only for cortex-less vectors).
31+
32+
## Tunable "house" numbers (defaults, flagged for Victor's review)
33+
- Box-out percentages (above).
34+
- Boiler explosion: Light 6d6/10ft, Heavy 10d6/15ft, Colossal 20d6/20ft; DC = 10 + HD/2 + size.
35+
- PF2e Hardness = clamp(ARM - 11, 3, 25).
36+
- PF2e stat-role thresholds (Str/AC/attack tiers off WM stats) in `Pf2Converter`.
37+
38+
## Calibration — RESOLVED (Victor: "recalibrate outright")
39+
The original formula is kept only as a displayed **raw score**. `Pf1Converter.Calibrate` derives the
40+
playable CR from clean threat signals - chassis base (L5/H8/Col16) + hit-box adjustment + armor bump,
41+
clamped to per-type bands (L 4-8, H 7-12, Col 15-21) - then draws AC/HP/attack/saves from Pathfinder's
42+
Monster-Statistics-by-CR table (`Pf1ByCr.cs`). PF2e level = calibrated CR.
43+
44+
Earlier attempt (`raw x 0.38`) was replaced after full-roster validation: it inherited the original's
45+
arc-node and Cyriss-vector inflation (Lancer CR10 vs identical Charger CR6; Prime Axiom CR22 > Stormwall).
46+
The clean formula is immune to that. **All 16 reference jacks validate** (`--validate`): lights CR4-6,
47+
heavies CR7-10, colossals CR16-17; Juggernaut==Destroyer; box-out HP sums exact.
48+
49+
### Open tuning (surfaced by validation)
50+
- Energy Field values (33 light / 55 heavy, from the original tool) are now oversized vs recalibrated
51+
HP (Griffon: 33 field on 40 HP). Consider rescaling to ~30-40% of body HP (real-WM proportion).
52+
- Field coverage: only Retribution jacks get one; Cyriss vectors (incl. colossal Prime Axiom) do not.
53+
Victor's vision mentioned "Myrmidon Colossals" having a field - decision pending.
54+
55+
## Status
56+
- [x] Reverse-engineer original (source saved to `Apps & Scripts/Jack/*.RECOVERED.cs`)
57+
- [x] Conversion engine: PF1e, PF2e, APF1e — verified via `JackForge.exe --selftest`
58+
- [x] Foundry exporters (SBC + bestiary-import)
59+
- [x] Steampunk GUI (3 icon tabs, shared input, IK logo header, Convert + Send-to-Foundry) — runs
60+
- [x] Recalibration to legal Pathfinder ranges (anchored to PF Monster-by-CR table)
61+
- [x] Box-out split retuned to real WM grid proportions (torso ~54%)
62+
- [x] Full-roster validation: all 16 real jacks pass (`--validate`); caught + fixed node/vector CR inflation
63+
- [x] Unique/character jacks: "Unique 'Jack?" toggle + manual CR adjustment (applies after band clamp, cascades to all tabs)
64+
- [x] Serric Steel = IK adamantine: export keeps clean `DR #/adamantine`; flavor shown only in app readout
65+
- [x] Energy Field: myrmidon-only, temp HP = jack HP rounded to nearest 10; per-myrmidon "Field Power"
66+
text field (special power active while the field holds), shown in the box-out
67+
- [x] Vector hover: per-vector dropdown (None / Clumsy / Average), shown for Cyriss vectors. Grants
68+
a low Fly speed = land Speed (ignores ground terrain) and +1 CR. Clumsy = light trimodal vectors;
69+
Average = purpose-built hovering vectors; heavy trimodal = None. Fly line flows to both exports.
70+
- [ ] (Optional) "Induction Trait" text field for vectors — offered, not yet built
71+
- [ ] Polish; self-contained publish per-OS
72+
- [ ] Optional: pull official Iron Kingdoms d20 warjack stats as a second cross-check
73+
74+
## Build / run
75+
```
76+
cd src/JackForge
77+
dotnet build
78+
dotnet run # launches the app
79+
dotnet run -- --selftest # headless engine check
80+
```
81+
Reference research (gitignored scratch): WarMachine test jacks, PF2e benchmarks, Foundry formats.

EVOLUTION.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# The 'Jack Converter: Twenty Years of Evolution
2+
3+
A history of one small program, from a middle-school project built off a d20 sourcebook to a
4+
cross-platform, three-system conversion bench. This is the lineage of what is now **JackForge**.
5+
6+
---
7+
8+
## Act I - Origins (circa 2005): the Liber Mechanika era
9+
10+
In 2005 Privateer Press published **Liber Mechanika** (PIP 403), a d20 3.5 supplement for the
11+
Iron Kingdoms setting. Among its rules was a system for expressing WarMachine WarJacks as d20 /
12+
Iron Kingdoms stat blocks: the conversion logic that would become the seed of this whole project.
13+
14+
Right around then, as he was **finishing high school**, Victor built the **first version of the
15+
'Jack Converter**. The language and the exact build are lost to history (this predates any surviving
16+
binary), but the intent was already the one that survives to today: type in a WarJack's WarMachine
17+
stat line, get back a playable d20 stat block. The core formulas, the MAT/RAT handling, the
18+
armor-to-DR relationship, and the hit-box-to-power scaling all trace back to that Liber-Mechanika
19+
reading of how a warjack should feel in a d20 game.
20+
21+
No artifact from this era survives. It lives on only as the conceptual and mathematical ancestor of
22+
everything below.
23+
24+
---
25+
26+
## Act II - The 2013 Rebuild: "JackCalculator"
27+
28+
The earliest surviving version is a **2013 rebuild**, recovered in 2026 by reverse-engineering an
29+
old installer. It is a **C# .NET Framework 4.0 Windows Forms application** named `JackCalculator.exe`,
30+
titled in-app **"Warmachine to Iron Kingdoms d20 'Jack Converter Ver. 1.0"**, self-signed
31+
`CN=Clarke\Victor` with a certificate valid from **2013-08-05**. The date on the files (2013) is
32+
when they were copied to a new machine; the certificate confirms the actual compile was 2013.
33+
34+
Why a rebuild in 2013 and not the original? A tell in the code: it supports **Colossals**, and
35+
WarMachine Colossals did not exist until the 2012 *WARMACHINE: Colossals* release. So the 2013
36+
build is a C# port of the older original, brought current with the game as it stood then.
37+
38+
### How it was packaged (and recovered)
39+
The program shipped as a Russian-doll installer, which is why recovering it in 2026 took some work:
40+
41+
```
42+
Jack Converter Setup.exe (ClickTeam Install Creator, "wwgT" PackData overlay)
43+
-> UPX-compressed PE stub
44+
-> bzip2 / zlib members
45+
-> a Visual Studio ClickOnce deployment
46+
-> JackCalculator.exe (357,376-byte .NET 4.0 assembly) <- the actual program
47+
```
48+
49+
The recovery: identify the ClickTeam container, walk the overlay, inflate every zlib member and
50+
bzip2-decompress the two large ones, pick out the 357 KB .NET assembly, then decompile it back to
51+
C# with ILSpy. The recovered source is preserved in `Apps & Scripts/Jack/*.RECOVERED.cs`.
52+
53+
### What the 2013 version did
54+
A single WinForms window, two columns (WarMachine in, Iron Kingdoms d20 out), a Convert button.
55+
Inputs: SPD, STR, MAT, RAT, DEF, ARM, hit boxes, TYPE (Light/Heavy/Colossal), a 26-entry CLASS
56+
list of faction chassis, an arc-node option, and special attacks. Outputs: Speed, STR, DEX, melee
57+
and ranged attack strings, grapple, saves, DR, AC, HP, size, INT/WIS, and a CR. It even special-
58+
cased Cyriss Convergence vectors (relabeling MAT/RAT to caster stats).
59+
60+
It was, in Victor's own words, "likely terrible jank" - and it was, in the charming way of a
61+
self-taught first program: unbounded CR math, a BAB table that pinned at +20, a redundant
62+
copy-pasted branch, no input validation, and spellings frozen in amber ("Scryah", "Bezerker",
63+
"Chasis"). It also worked, and it was precious.
64+
65+
---
66+
67+
## Act III - The 2026 Reforge: "JackForge"
68+
69+
In 2026 the recovered logic was carried forward into a brand-new application: **JackForge**, a
70+
**cross-platform C# / .NET (Avalonia) desktop app** with a gritty steampunk "schematic bench" look.
71+
It keeps faith with the original's math where that math was sound, and rebuilds it where it wasn't.
72+
73+
### What changed, at a glance
74+
75+
| Dimension | 2013 JackCalculator | 2026 JackForge |
76+
|---|---|---|
77+
| Platform | Windows only (WinForms, .NET 4.0) | Windows / macOS / Linux (Avalonia, .NET 10) |
78+
| Systems | Iron Kingdoms d20 (3.5) only | PF1e, PF2e, and Advanced PF1e (box-out) |
79+
| UI | Two-column form | Themed 3-tab bench, IK-logo header, live example |
80+
| CR math | Unbounded (a Juggernaut hit CR 26+) | Recalibrated to legal Pathfinder ranges |
81+
| Export | None | Foundry SBC (PF1) and Bestiary Import (PF2) |
82+
| Damage | Single HP pool | Optional hit-location "box-out" system |
83+
| Character jacks | Not handled | "Unique 'Jack?" CR-adjust toggle |
84+
| Myrmidon fields | Fixed made-up values | Energy Field = HP rounded to nearest 10 + power text |
85+
| Vectors | Given fake fields as a stand-in | Mindless, caster-driven, optional hover (Fly) |
86+
| Input safety | Crashed on empty fields | Validated; chassis constrains valid weights |
87+
88+
### The three modes
89+
- **PF1e** - Pathfinder 1st Edition. A faithful port of the original 3.5-era logic (PF1 was largely
90+
a 3.5 update), then recalibrated: the original formula is kept as a displayed "raw score", while
91+
the playable CR is derived from clean threat signals (chassis, hit-boxes, armor) and the combat
92+
stats are drawn from Pathfinder's official Monster-Statistics-by-CR table.
93+
- **PF2e** - Pathfinder 2nd Edition. A new system entirely. Built by "benchmark via CR": the PF1 CR
94+
becomes a creature level, and every stat is read off Paizo's "Building Creatures" benchmark tables.
95+
- **APF1e** - Advanced PF1e. The feature Victor "always dreamed of but was never skilled enough to
96+
do": a WarMachine-style **box-out** damage system. HP spreads across Head, Torso, two Arms and two
97+
Legs; destroy an arm and its weapon is gone, destroy the head and the jack goes inert, destroy the
98+
torso and the boiler explodes. Myrmidons layer an Energy Field of temp HP on top; colossals get
99+
two independent structures.
100+
101+
### Validation
102+
All 16 reference jacks from the WarMachine faction books (Charger, Juggernaut, Stormwall, Prime
103+
Axiom and the rest) run clean through every mode. That validation pass is what caught and fixed a
104+
CR-inflation bug inherited from the original's node and vector math.
105+
106+
---
107+
108+
## The through-line
109+
110+
The math has a clear bloodline: **Liber Mechanika's d20 3.5 conversion rules (2005)** -> the lost
111+
original -> the **2013 C# formulas** -> **recalibrated against Pathfinder 1e's own monster tables**
112+
for PF1e, and **re-expressed through Pathfinder 2e's benchmark tables** for PF2e. Twenty years, one
113+
idea, three rule systems, and the same question every time: *what would this WarJack be, at the
114+
table?*
115+
116+
*Serric Steel is the Iron Kingdoms' adamantine. Some things never change.*

0 commit comments

Comments
 (0)