11 — VESSEL FITTING UX (ekstraksi pola Pyfa → model ARCLUX)
Status: DESIGN REFERENCE — pola boleh, kode tidak. Tanggal: 2026-10-05. Induk:05-vessel-design-dashboard.md(Vessel Design Dashboard),decisions-mmo.md(K1, D-007),MMO-CONTRACT.md§4.2. Referensi: github.com/pyfa-org/Pyfa — Python Fitting Assistant for EVE Online (1.8k★, 466 fork, 9.788 commit, aktif 2026-10-05). Ekosistem referensi EVE lain (Pathfinder, EveVision, Z-S Overview Pack): lihat §9.
0. Apa yang sebenarnya ditemukan di repo itu
Pyfa = tool fitting kapal EVE Online paling lengkap yang ada: buat/eksperimen/simpan fitting kapal di luar game. Stack: Python + wxPython (desktop), SQLite (staticdata/),
engine kalkulasi eos/ (EVE Online Simulator), graph
graphs/, GUI gui/, service service/, test tests/.
Lisensi: GPL-3.0.
Kenapa ini “jackpot” untuk ARCLUX: ARCLUX ingin jadi
“EVE-grade” — dan Pyfa adalah referensi de-facto bagaimana
fitting tool harus bekerja (UX + engine calc). Seluruh pola
yang ARCLUX butuhkan untuk Vessel Design Dashboard (blueprint
05) sudah dipecahkan Pyfa selama 9.788 commit.
Tapi: Pyfa = GPL-3.0 + data CCP. ARCLUX = Apache-2.0 (engine
di npm) + MMO License. Kode Pyfa DILARANG di-copy (§4).
Yang diambil = pola desainnya saja, reimplementasi clean-room
di TS.
1. Arsitektur Pyfa (4 lapis — bersih, dipetakan ke ARCLUX)
2. Pola yang diekstrak (the jackpot)
- Slot model — kapal punya slot terstruktur (high/mid/ low/rig + drone bay + fighter + implant + booster). Setiap slot: tipe terbatas, constraint, satu module per slot.
- Stat projection real-time — pasang/lepas module → semua
stat dihitung ulang instan (
eos/effects.pypipeline attribute modification,modifiedAttributeDict.py). - Capacitor simulation (
eos/capSim.py) — simulasi konsumsi/regen kapasitor seiring waktu, bukan angka statis. - Damage patterns (
saveddata/damagePattern.py+gui/patternEditor.py) — profil damage (EM/thermal/kinetic /explosive) → resistensi kapal dihitung terhadap profil. - Target profiles (
saveddata/targetProfile.py) — lawan punya profil (ukuran, kecepatan) → akurasi/tracking dihitung. - Fit browser + tabs (
fitBrowserLite,multiSwitch,chrome_tabs) — banyak fitting dibandingkan berdampingan. - Gauges (
attribute_gauge,pyfa_gauge) — stat divisualisasikan gauge, bukan tabel mentah. - Fit code (
service/port/: EFT, DNA, MUTA, XML, multibuy) — fitting = string terkompresi yang bisa diekspor/diimpor/dibagikan. - ESI integration (
gui/esiFittings.py) — export fitting langsung ke game (in-game). - Mutator/override (
saveddata/mutator.py,override.py) — varian module (mutaplasmid) dengan stat berubah. - Prereq check (
service/prereqsCheck.py) — skill requirement sebelum module bisa dipakai. - Implant set / booster — buff set (implantSet) + booster dengan side-effect (boosterSideEffect.py).
- Citadel (
saveddata/citadel.py) — struktur pemain sebagai entitas fitting tersendiri.
3. Mapping 1:1 Pyfa → ARCLUX
4. Yang DILARANG (non-negotiable)
- DILARANG copy kode Pyfa — GPL-3.0. Turunan Pyfa wajib GPL-3.0 → menginfeksi engine ARCLUX (Apache-2.0, live di npm) dan game (MMO License). Clean-room reimplementasi saja: baca polanya, tulis kode sendiri di TS.
- DILARANG ship data EVE — seluruh
staticdata/Pyfa = dogma CCP (item name, attribute, effect). ARCLUX tidak boleh pakai data EVE; stat kapal ARCLUX di-derive dari analisis repo user (analyzeRepository→buildVesselModel), bukan dari dogma. - DILARANG pakai aset Pyfa (imgs/, logo) — bagian dari repo GPL + CCP copyright notice.
- Pola desain (UX, arsitektur, algoritma concept) = boleh, itu tujuan dokumen ini.
5. Rencana eksekusi
Tidak menabrak blueprint 01–10 (larangan duplikasi): desain visual vessel/dashboard = 05 (11 hanya referensi, tidak re-spec visual); aplikasi damage = 03/combat.ts(11 punya proyeksi murni saja, tidak mutate); capabilities = 07 (fitCalcsudah integrasi viarequiresCapability); client polish = 09 (fitting panel mengikuti penempatan client 09); validator = 03 (Fase 3 extendvalidator.ts, bukan duplikat).
Fase 1 — Engine calc (packages/universe, TS) ✅ SELESAI (PR #767)
-
fitCalc.ts— component-effect pipeline: pasang/lepasComponentBinding→ hitung ulangSystemState.healthVesselModelstats (deterministic, pure function).
-
capSim.ts— simulasi kapasitor per tick (konsumsi vs regen, depletion warning) — referensicapSim.py, implementasi sendiri. - Slot constraint engine — tiap subsystem punya slot capacity; validator menolak overflow.
- Damage profile — incoming damage type → resistensi
subsystem (referensi
damagePattern.py). - Regresi test: same input → same output (determinism law)
— 40 test (
tests/fit-calc.test.ts+tests/cap-sim.test.ts).
Fase 2 — Fitting panel IN-GAME (client) — D-027
UI fitting hidup di dalam game, bukan alat luar-game. Target final: UE5 (UMG, Fase 4). S/d UE5 ready:apps/game(Electron demo — penempatan client mengikuti blueprint 09: semua client work diapps/game/src/renderer/).apps/webBUKAN permukaan MMO (D-027) — tidak ada dashboard MMO di sana. Prioritas: setelah Fase 3 (fokus utama = game server); opsional sebagai demo.
- Slot grid UI (6 subsystem + component slots).
- Stat projection real-time (Fase 1 dipanggil per perubahan).
- Cap gauge + gauge widget (referensi
pyfa_gauge). - Fit browser + diff (bandingkan 2 vessel — pakai
packages/semantic-diff). - Export/import vessel definition (DSL
.arclux). - Prereq check UI (component requirement).
Fase 3 — Wire ke gameserver (PRIORITAS UTAMA — fokus game server) ✅ SELESAI (PR #772 + #773)
- Extend
validator.ts(bukan duplikat — validator existing = move/dock/attack; tambah fit intents: equip/unequip dengan slot constraint + component prerequisite). —fitting.ts::validateFitIntent -
capSimserver-side (authoritative — client hanya render proyeksi). —stepCapacitorper tick (formulacapStepdari universe) + gateactivate_capabilitysaat kapasitor 0 (PR #773) - Damage profile masuk
combat.ts. — resist daricomputeResists(fitted), capMAX_RESIST,impact.resisted(PR #773) - Persist vessel definition + verifikasi
fitHash(server rekomputasi, tolak mismatch — anti-cheat). —stateHash = fitHash, persist viaRegionSnapshot
Fase 4 — UE5 slice (eksekusi kode di UE5 dengan referensi ini)
- UMG Fitting Window: slot grid + stat projection + cap
gauge (kontrak UI baru, mirror
UE5Types.h:FUE5Component,FUE5Fit,FUE5CapState). - Import/export fit code (DSL) via
UUE5Transport. - Server tetap TS authoritative — UE5 hanya render + kirim intent (D-008). Tidak ada calc di UE5.
- Acceptance: screenshot parity dashboard TS vs UE5
(banded, per
04-graphics.md).
6. Acceptance criteria
fitCalcdeterministic: 2× run, hash identik (test CI).- Dashboard: pasang/lepas component → stat update <16ms (60fps interaction).
- Validator menolak slot overflow + prerequisite tidak terpenuhi.
- Export DSL →
arclux connect→ vessel termuat di region (e2e). - (Fase 4) Screenshot parity TS vs UE5 per tier.
7. Checklist verifikasi PR
8. Referensi
- Pyfa: https://github.com/pyfa-org/Pyfa (GPL-3.0)
eos/capSim.py,eos/effects.py,eos/saveddata/fit.py,service/port/eft.py,gui/builtinViews/fittingView.py- Blueprint ARCLUX:
05-vessel-design-dashboard.md,07-special-capabilities.md(V4),06-community-social-ownership.md - ARCLUX:
packages/universe/stats.ts,packages/gameserver/capability.ts
9. Referensi ekosistem EVE (tambahan — pola saja)
Subjek dokumen ini tetap Pyfa (fitting). Tiga repo lain = referensi silang untuk lapisan ARCLUX lain:
Aturan (non-negotiable):
- DILARANG copy kode/data keempat repo — GPL-3.0 menginfeksi lisensi ARCLUX, dan isi datanya = dogma CCP (typeID EVE, nama kapal, faction). Clean-room reimplementasi saja.
- DILARANG pakai teknik injection EveVision (minhook,
DX hook, DLL inject) — ARCLUX adalah gamenya sendiri
(
apps/gameElectron +apps/ue5render sendiri), bukan overlay di game orang lain. - Plugin system EveVision = vaporware — README
menjanjikannya sejak 2020, tidak ada di kode. Jangan
dijadikan acuan; ARCLUX sudah punya registry-driven
DSL (
packages/dsl) sebagai basis plugin masa depan. - Pathfinder & Z-S bukan subjek blueprint 11 — hanya referensi silang; fitting (subjek dokumen ini) tetap mengacu ke Pyfa.