STUDY.fegyvergenerator_pelda - kaktusztea/szilankrpg GitHub Wiki
Fegyvergenerátor összefoglaló
- Teljes tervezési doksi: STUDY.fegyvergenerator_v2
- Adatfájlok itt találhatóak
Mi ez?
Egy determinisztikus, paraméter-alapú generátor, ami minden közelharci fegyver harcértékét (TÉ, VÉ, SP, Átütés, Sebesség, stb.) kiszámolja néhány bemenő paraméterből:
- nem kell kézzel kitalálni/egyeztetni minden fegyver számait
- a fegyverek garantáltan konzisztensek egymással
- a generátor a mérvadó forrás
Jelenleg tervezői eszköz, nincs bekötve a webapp build pipeline-jába — a webapp ma a régi data/tables/fegyverek.json-t használja.
1. lépés: a bemenő adat (fegyverek.yaml)
Egy fegyver a fegyverek.yaml-ban egy sor. Minta: Tőrkard (2 sebzési mód + 3 extra képesség).
- {név: "Tőrkard", kategória: kardvívó, megjegyzés: "",
extrak: [pontos, lefegyverezhetobb, zuzo_ellen_rosszabb],
fegyver: {hossz: 3, aktorok: [pengehegy-kard, vágóél-egyenes-átlagos], fejdarab: 1, pengés: 1, erőbónusz_limit: 1}}
A rekord tartalma:
- fegyverhossz:
3 - két Aktora van: egy pengehegy és egy vágóél
- fejdarab:
1→ a penge egyetlen fizikai darab (ahogy egy buzogánynak is 1 fejdarabja van) - van éle (
pengés:1) - az Erőbónusz csak
+1-ig hasznosul rá (erőbónusz_limit:1) - 3 egyedi extra képessége van
- egy darab harcérték sincs beírva — minden szám (TÉ/VÉ/SP/stb.) a
konstansok.yaml-ból származik le
2. lépés: a bemenő paraméterek feloldása (konstansok.yaml)
A generátor minden paramétert egy központi táblából old fel:
fegyverhossz:
3: {TÉ: 3, VÉ: 3, SP: 3, sebesség: 6, forgatás: egykezes}
aktorok:
pengehegy-kard: {sebzésjelleg: szúró, SP: 2, átütés: 1, TÉ: 0, VÉ: 0, sebesség: 0}
vágóél-egyenes-átlagos: {sebzésjelleg: vágó-egyenes, SP: 1, átütés: 0, TÉ: 2, VÉ: 2, sebesség: 0}
fejdarab:
1: {sebesség: 1, TÉ: 0}
pengés:
1: {TÉ: 1, VÉ: 1, SP: 1}
A fejdarab és a pengés a fegyver két külön, saját bemenő paramétere:
fejdarab fizikai darabszám a fegyver fején (kontroll/Sebesség büntetés, minél több
darab, annál nagyobb) — minden aktoros fegyver saját, explicit értéket kap
(egy pengés fegyvernek, pl. kard/tőr, is fejdarab:1 kell, mint a buzogánynak)
pengés van-e éle → harcérték-bónusz: TÉ/VÉ/SP:+1
Egy fegyveren mindkét hatás önmagában adódik hozzá:
Alabárd: fejdarab:2, pengés:1
A fegyvernek két Aktora van, ez két külön sebzési módot eredményez:
- pengehegy → szúrás, elsődleges (a lista első eleme, nincs büntetés)
- vágóél → vágás, másodlagos (Sebzésdobáson Hátrány-1, ha ezt választja a karakter)
3. lépés: a modell összeadja (fegyvergenerator_balansz.py → modok())
A Fegyver.modok() metódus fegyvermódonként (Aktoronként) összeadja a bázisokat:
pengehegy-kard mód:
TÉ = fegyverhossz.TÉ(3) + aktor.TÉ(0) + pengés.TÉ(1) = 4
VÉ = fegyverhossz.VÉ(3) + aktor.VÉ(0) + pengés.VÉ(1) = 4
SP = fegyverhossz.SP(3) + aktor.SP(2) + pengés.SP(1) + Erőbónusz = 6 (Erő=0-nál)
Átütés = aktor.átütés(1) = 1
Sebesség = fegyverhossz.sebesség(6) + aktor.sebesség(0) + fejdarab(1) = 7
Erőlimit = 1 (a fegyver saját bemenő paramétere, passthrough)
vágóél-egyenes-átlagos mód:
TÉ = 3 + aktor.TÉ(2) + pengés.TÉ(1) = 6
VÉ = 3 + aktor.VÉ(2) + pengés.VÉ(1) = 6
SP = 3 + aktor.SP(1) + pengés.SP(1) = 5 (Erő=0-nál)
Átütés = 0
Sebesség = fegyverhossz.sebesség(6) + aktor.sebesség(0) + fejdarab(1) = 7
Erőlimit = 1
(A modell alapesetben Erő=2-vel teszteli önmagát a self-testben, a Tőrkard az export viszont Erő=0 bázist ad ki — az Erőbónusz a játékban adódik hozzá utólag.)
4. lépés: az extrák — feltételes, szituációs hatások (extrak.yaml)
A Tőrkard 3 extrája a bázisértékektől független, szituációs {feltétel → hatás} pár:
- id: pontos
feltétel:
- {típus: aktor, érték: pengehegy}
- {típus: forgatás, érték: egykezes}
- {típus: manőver_állapot, érték: aktív}
hatás:
- {cél: manőver_ellenpróba, mód: flat, érték: 2, feltétel: "manőver:precíz_támadás"}
# → csak pengehegy-móddal, egykezes forgatással: Precíz támadás manőver Ellenpróbára +2
- id: lefegyverezhetobb
hatás:
- {cél: manőver_ellenpróba, mód: flat, érték: -2, feltétel: "manőver:lefegyverzés"}
- {cél: manőver_ellenpróba, mód: flat, érték: -2, feltétel: "manőver:fegyvertörés"}
# → könnyebben kiütik a kezünkből / eltörik
- id: zuzo_ellen_rosszabb
feltétel:
- {típus: ellenfél_fegyver_sebzésjelleg, érték: Z}
hatás:
- {cél: vé_veszteség, mód: szorzó, érték: 2}
# → zúzó fegyverrel szemben a VÉ-csökkenésünk duplázódik
A fegyver "fonákja":
- pontosabb célzást ad (pengehegy-móddal)
- de gyengébb a fegyverkontroll-harcban (könnyebben elveszik/eltörik)
- és gyengébb a zúzó fegyverek ellen (dupla VÉ-veszteség)
Jelenlegi állapot: ezek a hatások dokumentáció szinten léteznek; a futásidejű kiértékelés a reactive engine jövőbeli feladata.
5. lépés: a kész eredmény (JSON export)
A fegyvergenerator_json.py mindent összefésül egy fegyver = egy JSON objektumba:
{
"név": "Tőrkard",
"kategória": "kardvívó",
"fegyverhossz": 3,
"övön_hordható": false,
"extrák": [
{"id": "pontos", "név": "Pontos"},
{"id": "lefegyverezhetobb", "név": "Lefegyverezhetőbb"},
{"id": "zuzo_ellen_rosszabb", "név": "Zúzó fegyver ellen rosszabb"}
],
"módok": [
{"aktor": "pengehegy-kard", "jelleg": "szúró", "sebzéstípus": "elsődleges",
"TÉ": 4, "VÉ": 4, "SP": 6, "Átütés": 1, "Sebesség": 7, "Forgatás": "egykezes", "Erőlimit": 1},
{"aktor": "vágóél-egyenes-átlagos", "jelleg": "vágó-egyenes", "sebzéstípus": "másodlagos",
"TÉ": 6, "VÉ": 6, "SP": 5, "Átütés": 0, "Sebesség": 7, "Forgatás": "egykezes", "Erőlimit": 1}
]
}
Ugyanez emberi olvasásra a generált markdown fegyvertáblában egy sorban jelenik meg, az extrák ;-vel elválasztva egy oszlopban.
Ami NEM fér bele ebbe a modellbe: fegyverek_fixed.json
Néhány fegyver (Garott, hárítófegyverek, lovas Kopja) mechanikája nem írható le a fenti paraméterekkel:
- kör-függő sebzés
- taktika-függő bónusz
- tisztán hárító mód (nincs támadó mód)
Ezeket kézzel írjuk a fegyverek_fixed.json-ba, ugyanabban a JSON struktúrában, mint a generátor kimenete — a mód-sor "aktor": "kivétel" jelzi, hogy nincs valós Aktor-tábla mögötte.