STUDY.refaktor_fegyver_v2 - kaktusztea/szilankrpg GitHub Wiki
STUDY: feat/fegyver_v2 branch átfogó refaktor (belépő-doksi)
Státusz: VÉGREHAJTVA (2026-09-30). A felmérés + a 3 fázis (holtkód / dedup / modularizáció) elkészült - l. §10 és a
web/karakter/refactorlog/2026-09-30.md(2. menet). Ez a doksi maradt a BELÉPŐ-doksi: olvasd be ELŐSZÖR, majd a refactorlog naplókat.
0. A feladat (user)
Átfogó, "clean code" refaktor a feat/fegyver_v2 branch teljes tartományára:
- Commit range:
0c39772c..feat/fegyver_v2(a kiágazás óta az egész branch). Ellenőrzött: 53 commit, 355 fájl, +7020/-3948 - nagy terep. - Fő célok:
- Konstansok kimozgatása a
data/sources/konstansok.yamlalá (data layer elsőbbség - AGENTS.md). - Erős modularizáció (nagy fájlok szétbontása, felelősség-tisztítás).
- Clean code (olvashatóság, konzisztencia).
- Dead code eltávolítás (elárvult fn-ek, kivezetett ágak maradványai).
- Konstansok kimozgatása a
1. Miért most / kontextus
A feat/fegyver_v2 branch a fegyver v2 migráció fő ága. A branchen sok inkrementális munka történt
(v2 adatmodell, idea_default, extrák, kétkezes, távharc v2, pajzs-kivezetés). A gyors iteráció után
most jön a konszolidáció: a felhalmozódott hardcode, duplikáció, halott kód és a túl nagy modulok
rendbetétele - MIELŐTT a branch mergelődik.
2. A terep (mérve, 2026-09-30)
konstansok.jsonmár 54 kulcsú (sok konstans MÁR itt van) - a refaktor a MARADÉK hardcode-ot keresi, nem nulláról épít.- FONTOS megkülönböztetés (különben zajos a keresés): a
?? 0/?? 1fallback-ok NEM hardcode-konstansok (védő default-ok) - ezeket NE mozgasd. A valódi cél: beégetett BALANSZ/KÜSZÖB számok (pl. egy* 2,> 16,=== 20a logikában), amelyek a data layerbe valók. - Két külön konstans-világ, NE keverd:
data/sources/konstansok.yaml→konstansok.json(webapp runtime).data/sources/fegyverek/konstansok.yaml(fegyvergenerátor belső - acode/balancehasználja, NEM megy át agenerate_tables.py-n; l. fegyvergenerátor-overview invariáns).
- Reactive engine: a kalkuláció nagy része
data/rules.json(53 szabály) - a formula-nyelv az elsődleges hely a számításra, a hardcode CSAK ott indokolt, ahol a reactive nem elég (2D lookup, per-fegyver override) - l. AGENTS.md "Data layer elsőbbség".
3. Korábbi refaktor-logok (KÖTELEZŐ olvasmány, tanulságok)
web/karakter/refactorlog/ - mind "AI ügynök célközönség", csapdákkal + detektáló scriptekkel:
2026-09-09.md(nagy, 14 szekció) - a legátfogóbb korábbi refaktor.2026-09-11.md,2026-09-15.md,2026-09-20.md- fortély-mods, effekt-modell, egyéb.2026-09-30.md(mai) - fegyver v2 idea_default + kétkezes + távharc v2 + extra-prefix. Csapdák: közös teszt-fixture (load-gamedata.ts), 0-index falsy, dist-postbuild, SP -99 sentinel.
Ezekben KÉSZ detektáló scriptek és rögzített konvenciók vannak - használd őket újra, ne írj újat.
4. Javasolt megközelítés (a nagy terep miatt fázisokban)
A 355 fájl miatt EGY menetben kockázatos. Javasolt: fázisokra bontva, mindegyik után
npm run build(18s, teljes: test + tsc + bundle) + git-commit, hogy a regresszió lokalizálható legyen.
- Felmérés (módosítás nélkül): a
0c39772c..HEADdiff átnézése, a hardcode / duplikáció / halott kód / túl nagy modulok listázása. Delegálható sub-agentnek (a fő context védelme). - Konstans-kimozgatás: a valódi beégetett balansz-számok →
konstansok.yaml(+ séma + a webapp olvassa). Fázisonként egy témakör (pl. harc, páncél, manőver). - Dead code: az elárvult fn-ek/ágak (pl.
process_fegyverek.pya pajzs+távharc kivezetés után - l. STUDY.tavharc_v2 "Hátra"; acode/libmásik fogyasztójagenerate.markdown.py, óvatosan). - Modularizáció: a túl nagy fájlok szétbontása felelősség szerint (a MAP.md a jelenlegi felelősség-térkép - frissítsd, ahogy bontasz).
- Clean code: konzisztencia (naming, komment-nyelv angol, magyar UI), a workaround-regiszter (gui_spec) átnézése.
Minden fázis végén: build zöld + refactorlog-bejegyzés (mit, miért, milyen csapda).
5. Veszélyek / csapdák (a mai + korábbi tanulságokból)
- Közös teszt-fixture:
src/__tests__/load-gamedata.tsa VALÓS JSON-okat tölti - egy tábla átnevezése látszólag nem kapcsolódó teszteket bukhat (ENOENT). Refaktornál erre figyelj. ?? fallback≠ hardcode: ne mozgasd a védő default-okat konstansba (zaj).- A generátor a mérvadó (fegyvergenerátor-overview): a
code/balance/*.py-ban a balansz-számok adata/sources/fegyverek/konstansok.yaml-ból jönnek - ott NE tegyél a webappkonstansok.yaml-ba valót (két külön world). - naming-lint csak yaml-ra fut (
data/gen/naming_lint.py), a JSON source-okra (fixed) nem. - Séma strict: új konstans-kulcs → a
konstansok.yamlséma + minden érintett source frissítendő. - Backward-compat NEM kell (localStorage invalidálható) - de a golden tesztek (TÉ/VÉ/SP/CÉ) NE változzanak érték szerint (a refaktor viselkedés-megőrző).
6. Gyors belépő parancsok (friss session)
# 1. A range áttekintése
git -C /repo/github/szilank.code log --oneline 0c39772c..feat/fegyver_v2
git -C /repo/github/szilank.code diff --stat 0c39772c..feat/fegyver_v2 | tail -30
# 2. Kötelező olvasmány
web/karakter/refactorlog/*.md (különösen 2026-09-09 és 2026-09-30)
data/docs/AGENTS.md, MAP.md, DEVSTATE.md
# 3. Build (verifikáció, ~18s)
cd web/karakter && npm run build
7. Kapcsolódó, még nyitott tételek (a refaktorral érintkezhetnek)
process_fegyverek.pyteljes kivezetése (STUDY.tavharc_v2 "Hátra") - a dead-code fázis része lehet.- Egységes effekt-modell §42 3. fázis (a
calcFortelyMods+ hatás-operátorok beolvasztása) - NAGY, külön; a modularizáció érintheti, de a big-bang effekt-motor NEM ennek a refaktornak a célja.
8. Emlékeztető a munkamódra
- Tervet SOHA ne hajts végre automatikusan - mutasd be, kérj jóváhagyást (AGENTS.md workflow).
- Nagy/kockázatos lépés előtt kérdezz. A 355 fájl miatt a fázisos, commit-onkénti haladás a biztonságos.
- A refaktor VISELKEDÉS-MEGŐRZŐ: a build (496 teszt jelenleg) végig zöld maradjon.
9. Felmérés eredménye (2026-09-30, sub-agentekkel)
Módszer: a
0c39772c..feat/fegyver_v2diff (355 fájl, ebből 121 TS/TSX kód + 27 py + 26 yaml) 4 párhuzamos, olvasás-only sub-agenten átvizsgálva (a fő context védelme, STUDY 4/1). Kategóriánként egy agent: konstans / duplikáció / holtkód / modularizáció. MÓDOSÍTÁS NEM történt. A találatok fázisonkénti végrehajtásra várnak (jóváhagyás után).Fontos módszertani lelet: a naplók halott-export detektora
grep -w-t használ, ami az ÉKEZETES magyar azonosítókat rosszul kezeli → HAMIS "EXPORT-ONLY" találatok. A duplikáció-agent ezt ékezet-biztosgrep -F-fel újramérte. A jövőbeli detektor-futtatásnál erre figyelni kell.
9.1 Konstans-kimozgatás (2. fázis) - kevés valódi találat
A konstansok.json már 54 kulcsú; a branch keveset égetett be. A valódi (nem-fallback) jelöltek:
| Rang | Hely | Érték | Teendő |
|---|---|---|---|
| MAGAS | harc/fegyver-calc.ts:28 |
return 1 (Természetes fegyver SP override) |
konstansok.yaml VAGY a fortély effekt-adatába (override 1, §42-konform) |
| KÖZEPES | harc/fegyver-calc.ts:80,91 + ketkezes.ts |
Sebesség ?? 6 (alap fegyver-sebesség, DUPLIKÁLT) |
fegyver_alap_sebesség: 6 - a dedup is indokolja |
| KÖZEPES | tavharc/helpers.ts:17 |
fok >= 2 ? 2 : 1 (Alkalmi tárgy hajítás Osztó-váltás) |
fortély effekt-adatba vagy konstansba |
| KÖZEPES | tavharc/helpers.ts:210-217 |
Osztó→lövéskitérés kategória switch (1..4,>=5) |
osztó_lövéskitérés_kategória map a lövéskitérés blokk mellé (megj.: e sorok nem a diffben változtak) |
| ALACSONY | dice.ts:38 |
EH_SZINT_MAX = 2 |
opcionális; kocka-motor invariáns, elfogadható a kódban |
| ZAJ | harc-reszletek-calc.ts:162 ?? 99, tavharc/helpers.ts:223 -99 |
Erőlimit-fallback / SP-sentinel | NEM mozgatni (védő fallback / adat-sentinel) |
Konklúzió: a konstans-fázis KIS terjedelmű - lényegében 1 MAGAS + 3 KÖZEPES. A "Sebesség ?? 6" a legjobb, mert egyszerre old duplikációt (fegyver-calc + ketkezes) és hardcode-ot.
9.2 Duplikáció (a legnagyobb ROI) - közös lookup-helperek hiányoznak
| Rang | Minta | Előfordulás | Javasolt közös helyszín |
|---|---|---|---|
| MAGAS | képzettségek.find(k => k.név === X)?.szint ?? 0 |
18×, 12+ fájl | engine/-be képzettségSzint(karakter, név): number (a lookupFegyver mintájára) |
| MAGAS | fortélyok.find(f => f.név === X)?.fok ?? 0 |
10× | fortélyFok(karakter, név): number (pl. Kétkezes harc fok szó szerint dup: harc-reszletek-calc.ts:54 = ketkezes.ts:42) |
| KÖZEPES | harcmodor-összeg reduce (a fenti fölé épül) | 4× | harcmodorÖsszeg(...) a B1 helperre építve |
| KÖZEPES | kézi Math.max(a, Math.min(b, x)) |
5× (eltérő határok) | engine/utils.ts → clamp(x,min,max), a clampEHSzint erre épüljön |
| ALACSONY | ${v>=0?'+':''}${v} előjel-formázás |
3× | előjellel(n): string |
| ALACSONY | generikus .find(d => d.név === X) def-lookup |
~90× (eltérő kollekciók/típusok) | byNév<T>(arr, név) - gyenge ROI, sok call-site |
Un-exportálás: 2 MEGBÍZHATÓ value-jelölt (hatásBadgeLabel HatasokInfo.tsx, rollElőnyHátrányDie
dice.ts - utóbbi viszont a MAP.md-ben dokumentált publikus API, óvatosan). 12 típus BIZONYTALAN
(TS4023-kockázat - exportált szignatúra hivatkozza) → csak tsc --noEmit után. Test-only exportok:
elfogadhatók (tesztelhetőség).
Konklúzió: a képzettségSzint + fortélyFok (+ harcmodorÖsszeg) helper-hármas a refaktor
LEGNAGYOBB egyszeri megtérülése - 30+ call-site egységesítése.
9.3 Holtkód - a Python-pipeline maradványai a fő terep, TS tiszta
- TS: NINCS holtkód. A detektor 0 valódi találat; a 20 "kívülről nem hivatkozott" export mind
modul-belső vagy
engine/types.tsadatmodell-típus (a naplók 7. csapdája: ezek élők). Orphan-fájl: 0. - Python - VALÓSZÍNŰ halott, együtt kivezethető (zárt lánc, üres input, nem hívott, kimenet kivezetve):
code/process_fegyverek.py+code/lib/MdToJsonConverter.py+code/lib/util.py. - Python - ÓVATOS, MEGTARTANDÓ:
code/lib/JinjaHandler.py+code/generate.markdown.py- KÜLÖN (Jinja) fogyasztói ág, NEM esik a fentivel (fontos pontosítás: agenerate.markdown.pycsak aJinjaHandler-t importálja, aMdToJsonConverter/util-t NEM → acode/lib/nem monolit). - Adat - BIZTOS HALOTT:
archive/data_fegyverek_v1/{pajzsok.json, tavfegyver_pattern.json, pajzs_pattern.json}+ üresdata/patterns/ág + üresdata/gen/tables/placeholder. - Adat - NEM halott:
archive/data_fegyverek_v1/fegyverek.json- acode/balance/v1↔v2 összehasonlítás AKTÍVAN olvassa (harcszimulacio_selftest.py,fegyverek_regi_uj_osszehasonlitas.py). - Külön hiba (nem holtkód, de érdemes jelezni):
.github/workflows/update_fegyvertablazat.ymlegy NEM létező scriptet hív (sync_fegyvertablazat_kozelharci.py); a valódi névsync_fegyvertablazatok.py. Eltört CI-hivatkozás.
Biztonságos kivezetési sorrend: előbb process_fegyverek.py + lib/MdToJsonConverter.py +
lib/util.py (+ archív pattern JSON-ok, üres data/patterns/); a JinjaHandler.py/generate.markdown.py
és az archive/.../fegyverek.json MARAD.
9.4 Modularizáció - a v2 a pure logikát jellemzően helyesen *-calc.ts-be tette
- JÓ JELÖLT (pure kiemelhető, render-teszt NEM kell): 3
tavharc/helpers.ts(263) - kitchen-sink 19 fn →mesterfegyver-calc.ts+tavfegyver-resolve.tsloveskiteres-calc.ts; a CÉ/VÉ/szorzó mag maradhat.
aktiv/taktika-helpers.ts(181) - 3 külön felelősség →taktika-megkotes.ts(isTaktikaAllowed)taktika-format.ts;interpolateFokDefgenerikus util →engine//shared.
tavharc/TavharcLoveskiteres.tsx(157) -buildOpciókpure lista-építő →loveskiteres-calc.ts.
- ÓVATOS (JSX-monolit, @testing-library kell - NEM jóváhagyott függőség, naplókban tudatosan hagyva):
KepzettsegProbaPopup.tsx(518),ManoverDobasPopup.tsx(453),TulajdonsagProbaPopup.tsx(308),SebzesPopup.tsx(295, kissebzes-popup-calc.tskiemelhető),TamadoDobasPopup.tsx(228). - RENDBEN (nagy de kohézív):
HarcScreen.tsx(kompozíciós gyökér),TavharcScreen.tsx,engine/types.ts,engine/data-types.ts, a*-calc.tspure modulok.data/gen/validators.py(162,validate_aktiv_fulfigyelendő, ha tovább nő → al-fn-ek).
Konklúzió: a modularizáció szűk és kockázatmentes - a 3 JÓ JELÖLT mind pure (tesztelhető render nélkül), és mind a fegyver v2 által hízlalt/kevert modul.
9.5 Javasolt végrehajtási sorrend (a naplók bevált sorrendje: holtkód → data/dedup → modul)
A naplók sorrendje (halott kód → típus/data → duplikáció → monolit bontás), a jelen felmérésre szabva:
- Holtkód-kivezetés (9.3): Python zárt lánc + archív pattern JSON-ok + üres dir-ek. Külön a
code/libóvatosság miatt. (Mellé: a CI-workflow eltört scriptnév javítása - kicsi, önálló.) - Duplikáció + konstans EGYÜTT (9.2 + 9.1): a
képzettségSzint/fortélyFok/harmodorÖsszeghelperek + aSebesség ?? 6konstans-kimozgatás egy menetben (aclamputil opcionálisan). Ez a legnagyobb ROI, viselkedés-megőrző, tesztelhető. - Modularizáció (9.4): a 3 JÓ JELÖLT (tavharc/helpers, taktika-helpers, TavharcLoveskiteres). A MAP.md felelősség-térkép frissítendő, ahogy bontunk.
Minden fázis végén: npm run build (496 teszt) zöld + git-commit + refactorlog-bejegyzés.
A "MAGAS" konstans (Természetes fegyver SP) és a ?? 99/-99 sentinelek a §42 effekt-modell
irányába mutatnak - ha oda kerülnek, az a 2. fázis része, nem külön effekt-motor.
10. Végrehajtás eredménye (2026-09-30)
A 9.5 sorrend szerint, 3 commit, mindegyik npm run build zöld. Részletes napló:
web/karakter/refactorlog/2026-09-30.md (2. menet).
| Fázis | Commit | Eredmény |
|---|---|---|
| 1. Holtkód | c9bbc579 (+ utólagos revert) |
Régi md→json pipeline kivezetve a code/-ból. User-döntés: a Python-lánc NEM törölve, hanem archive/data_fegyverek_v1/ alá mozgatva; az archive/ alatti pattern JSON-ok is maradnak. Üres dir-ek törölve. archive/ mostantól érinthetetlen (AGENTS.md). |
| 2. Dedup + helper | d24910b3 |
engine/utils.ts: képzettségSzint/fortélyFok/harcmodorÖsszeg/clamp. ~20 call-site egységesítve. +6 teszt. |
| 3. Modularizáció | 25ae906d |
tavharc/mesterfegyver-calc.ts + loveskiteres-calc.ts (+buildOpciók) + aktiv/taktika-megkotes.ts. MAP.md frissítve. +3 teszt. |
Teszt: 496 → 505, végig zöld, viselkedés-megőrző.
Szándékosan kihagyva (indokkal - l. refactorlog csapdák)
- Konstans-kimozgatás (9.1): nincs biztonságos, in-scope célpont. A
?? 6(Sebesség) latens védő default (0 hiányzó a 117 módból), aTermészetes fegyver SP (1)§42-függő. Aclampaz egyetlen általánosan hasznos kimenet. - B4 kézi clamp dedup: 9 eltérő-határú call-site, gyenge ROI; a
clamphelper elérhető jövőre. - JSX-monolitok: render-teszt (nem jóváhagyott
@testing-library) nélkül nem bonthatók. - 12 bizonytalan un-exportálás (TS4023): külön, célzott
tsc-ellenőrzéssel.