Compare commits

..

1 Commits

Author SHA1 Message Date
morbalint 532a9651b9 explore the concept 2024-01-25 19:29:04 +01:00
16 changed files with 125 additions and 357 deletions
+4 -4
View File
@@ -11,14 +11,14 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Setup Node.js 18.x - name: Setup Node.js 18.x
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 18.x node-version: 18.x
- name: Cache NPM packages - name: Cache NPM packages
uses: actions/cache@v4 uses: actions/cache@v3
with: with:
key: npm-${{ hashFiles('./Kemkas.Web/frontend/yarn.lock') }} key: npm-${{ hashFiles('./Kemkas.Web/frontend/yarn.lock') }}
path: | path: |
@@ -40,7 +40,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- uses: docker/setup-buildx-action@v3 - uses: docker/setup-buildx-action@v3
- name: Install doctl - name: Install doctl
uses: digitalocean/action-doctl@v2 uses: digitalocean/action-doctl@v2
@@ -75,7 +75,7 @@ jobs:
- docker-build - docker-build
if: ${{ github.event_name == 'push' || ( github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged ) }} if: ${{ github.event_name == 'push' || ( github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged ) }}
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- name: Install doctl - name: Install doctl
uses: digitalocean/action-doctl@v2 uses: digitalocean/action-doctl@v2
with: with:
@@ -10,15 +10,16 @@ import {DrawMasodlagosErtekek} from './masodlagos_ertekek.pdf'
import {DrawOsztalySpecialsPage} from './osztaly_specials.pdf' import {DrawOsztalySpecialsPage} from './osztaly_specials.pdf'
import {DrawFegyverek} from "./fegyverek.pdf"; import {DrawFegyverek} from "./fegyverek.pdf";
function drawBaseInfo(karakter: KarakterPdfView, draw: (text: string, x : number ,y: number, scale: number) => void) { function drawBaseInfo(karakter: KarakterPdfView,
draw(karakter.Name, 60, 710, 1) draw: (name: string, text: string, x : number ,y: number, width: number, scale: number) => void) {
draw(karakter.Nem, 454, 710, 1) draw("nev", karakter.Name, 56, 704, 190, 1)
draw(karakter.Kor.toString(), 454, 690, 1) draw("nem", karakter.Nem, 449, 704, 90, 11/12)
draw(karakter.Isten, 454, 670, 1) draw("kor", karakter.Kor.toString(), 449, 687, 90, 11/12)
draw(karakter.Osztaly, 60, 672, 1) draw("isten", karakter.Isten, 449, 669, 90, 11/12)
draw(karakter.Szint, karakter.Szint.length > 1 ? 252 : 264, 682, 3) draw("osztaly", karakter.Osztaly, 56, 668, 190, 1)
draw(karakter.Faj, 302, 710, 1) draw("szint", karakter.Szint, 250, 669, 45, 3)
draw(karakter.Jellem, 302, 672, karakter.Jellem.length > 17 ? 11/12 : 1) draw("faj", karakter.Faj, 301, 704, 110, 1)
draw("jellem", karakter.Jellem, 301, 669, 110,karakter.Jellem.length > 17 ? 11/12 : 1)
} }
function DrawKepzettsegek(draw: (text: string, x: number, y: number) => void, kepzettsegek: KepzettsegPdfView[], startFrom: number) { function DrawKepzettsegek(draw: (text: string, x: number, y: number) => void, kepzettsegek: KepzettsegPdfView[], startFrom: number) {
@@ -44,11 +45,13 @@ export async function CreatePDF(karakter: KarakterPdfView) {
const pdfDoc = await PDFDocument.load(existingPdfBytes) const pdfDoc = await PDFDocument.load(existingPdfBytes)
pdfDoc.registerFontkit(fontkit) pdfDoc.registerFontkit(fontkit)
const fontBytes = await fetch('/Merienda-Regular.ttf').then(res => res.arrayBuffer()) const fontBytes = await fetch('/Merienda-Regular.ttf').then(res => res.arrayBuffer())
const pdfFont = await pdfDoc.embedFont(fontBytes) const pdfFont = await pdfDoc.embedFont(fontBytes)
// const pdfFont = await pdfDoc.embedFont(StandardFonts.TimesNewRoman) // const pdfFont = await pdfDoc.embedFont(StandardFonts.TimesNewRoman)
const fontSizeBase = 12 const fontSizeBase = 12
const form = pdfDoc.getForm()
const page = pdfDoc.getPage(0) const page = pdfDoc.getPage(0)
function drawText(text: string, x: number, y: number, fontScale = 1, shade = 0) { function drawText(text: string, x: number, y: number, fontScale = 1, shade = 0) {
@@ -61,7 +64,27 @@ export async function CreatePDF(karakter: KarakterPdfView) {
}) })
} }
drawBaseInfo(karakter, drawText); function drawInputField(name: string, text: string, x: number, y: number, width: number, fontScale = 1) {
let field = form.createTextField(`kemkas.1e.${name}`)
field.addToPage(page, {
x: x,
y: y,
font: pdfFont,
height: pdfFont.heightAtSize(fontSizeBase * fontScale),
width: width,
borderWidth: 0,
borderColor: rgb(0,0,0)
});
field.disablePassword();
field.disableMultiline();
field.disableRichFormatting();
field.disableFileSelection();
field.disableSpellChecking();
field.setFontSize(fontSizeBase * fontScale);
field.setText(text);
}
drawBaseInfo(karakter, drawInputField);
DrawTulajdonsagok(page, karakter.Tulajdonsagok, fontSizeBase, pdfFont); DrawTulajdonsagok(page, karakter.Tulajdonsagok, fontSizeBase, pdfFont);
@@ -3,8 +3,7 @@ import {Karakter2E} from "../domain-models/karakter2E";
import {SignedNumberToText} from "../../shared/components/Helpers"; import {SignedNumberToText} from "../../shared/components/Helpers";
import {Mentok, MentoTipus, MentoTipusLabel, MentokTotal} from "../domain-models/mentok"; import {Mentok, MentoTipus, MentoTipusLabel, MentokTotal} from "../domain-models/mentok";
import {BaseHP, HP} from "../domain-models/masodlagos_ertekek"; import {BaseHP, HP} from "../domain-models/masodlagos_ertekek";
import {MultiClassTamadasBonusz} from "../domain-models/tamadas_bonusz"; import {TamadasBonusz} from "../domain-models/tamadas_bonusz";
import {Osztaly2E} from "../domain-models/osztaly2E";
function MentoNovekedes(props : {tipus: MentoTipus, ujMentok: Mentok, regiMentok: Mentok}) { function MentoNovekedes(props : {tipus: MentoTipus, ujMentok: Mentok, regiMentok: Mentok}) {
const {tipus, ujMentok, regiMentok} = props const {tipus, ujMentok, regiMentok} = props
@@ -29,17 +28,16 @@ function UjMento(props : {tipus: MentoTipus, ujMentok: Mentok, regiMentok: Mento
} }
function BasicNewLevel(props: { function BasicNewLevel(props: {
karakter: Pick<Karakter2E, 'tulajdonsagok' | 'szintlepesek'> karakter: Pick<Karakter2E, 'osztaly' | 'tulajdonsagok' | 'szintlepesek'>
szint: number szint: number
osztaly: Osztaly2E
changeRolledHP: (hp: number) => void, changeRolledHP: (hp: number) => void,
}) { }) {
const {karakter, szint, osztaly, changeRolledHP} = props const {karakter, szint, changeRolledHP} = props
const regiMentok = MentokTotal({...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint - 1)}) const regiMentok = MentokTotal({...karakter, szint: szint - 1})
const ujMentok = MentokTotal({...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint)}) const ujMentok = MentokTotal({...karakter, szint: szint})
const regiTB = MultiClassTamadasBonusz(karakter.szintlepesek.slice(0, szint-1)) const regiTB = TamadasBonusz(karakter.osztaly, szint-1)
const ujTB = MultiClassTamadasBonusz(karakter.szintlepesek.slice(0, szint)) const ujTB = TamadasBonusz(karakter.osztaly, szint)
if (regiTB.length < ujTB.length) { if (regiTB.length < ujTB.length) {
regiTB.push(0) regiTB.push(0)
} }
@@ -50,7 +48,7 @@ function BasicNewLevel(props: {
<div className='row'> <div className='row'>
<div className='col-lg-6'> <div className='col-lg-6'>
<div className='row m-2'> <div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label'>Plusz dobott HP (d{BaseHP(osztaly)}){' '}</label> <label className='col-sm-6 col-8 col-form-label'>Plusz dobott HP (d{BaseHP(karakter.osztaly)}){' '}</label>
<div className='col-sm-2 col'> <div className='col-sm-2 col'>
<input <input
className='form-control' className='form-control'
@@ -73,7 +71,7 @@ function BasicNewLevel(props: {
<div className='col-lg-6'> <div className='col-lg-6'>
<div className='row m-2'> <div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label'>Új HP{' '}</label> <label className='col-sm-6 col-8 col-form-label'>Új HP{' '}</label>
<span className='col col-form-label'>{HP({...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint)})}</span> <span className='col col-form-label'>{HP({...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint-1)})}</span>
</div> </div>
{isTBincreased && <div className='row m-2'> {isTBincreased && <div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label'>Új Támadás bónusz{' '}</label> <label className='col-sm-6 col-8 col-form-label'>Új Támadás bónusz{' '}</label>
@@ -3,9 +3,6 @@ import {Fegyver} from "../domain-models/felszereles";
export function FegyverLabel(fegyver: Fegyver): string { export function FegyverLabel(fegyver: Fegyver): string {
const flags = [] as string[] const flags = [] as string[]
if (fegyver.Megterheltseg) {
flags.push("M")
}
if (fegyver.Harcos) { if (fegyver.Harcos) {
flags.push("H") flags.push("H")
} }
@@ -1,5 +1,5 @@
import React from "react"; import React from "react";
import {ChangeOsztalyAtSzint, Karakter2E} from "../domain-models/karakter2E"; import {Karakter2E} from "../domain-models/karakter2E";
import BasicNewLevel from "./BasicNewLevel"; import BasicNewLevel from "./BasicNewLevel";
import TulajdonsagNoveles from "./TulajdonsagNoveles"; import TulajdonsagNoveles from "./TulajdonsagNoveles";
import {Tulajdonsag2E, TulajdonsagokTotal} from "../domain-models/tulajdonsag2E"; import {Tulajdonsag2E, TulajdonsagokTotal} from "../domain-models/tulajdonsag2E";
@@ -8,34 +8,23 @@ import {Osztaly2E} from "../domain-models/osztaly2E";
import KalozKritikus from "./KalozKritikus"; import KalozKritikus from "./KalozKritikus";
import HarcosFegyverSpecializacio from "./HarcosFegyverSpec"; import HarcosFegyverSpecializacio from "./HarcosFegyverSpec";
import MultiClassOsztalySelector2E from "./MultiClassOsztalySelector2E";
import {getClassLevels} from "../domain-models/szintlepes";
function LevelUp(props: { function LevelUp(props: {
szint: number, szint: number,
osztaly: Osztaly2E,
karakter: Karakter2E, karakter: Karakter2E,
changeTulajdonsagNoveles: (t: Tulajdonsag2E) => void, changeTulajdonsagNoveles: (t: Tulajdonsag2E) => void,
changeRolledHP: (rolledHP: number) => void, changeRolledHP: (rolledHP: number) => void,
changeHarcosSpec: (spec: string) => void, changeHarcosSpec: (spec: string) => void,
changeKalozKritikus: (krit: string) => void, changeKalozKritikus: (krit: string) => void,
changeOsztaly: (osztaly: Osztaly2E) => void
}) { }) {
const { const {
szint, szint,
osztaly,
karakter, karakter,
changeTulajdonsagNoveles, changeTulajdonsagNoveles,
changeRolledHP, changeRolledHP,
changeHarcosSpec, changeHarcosSpec,
changeKalozKritikus, changeKalozKritikus,
changeOsztaly
} = props } = props
const classLevels = getClassLevels(karakter.szintlepesek)
const harcosSzint = classLevels[Osztaly2E.Harcos]
const kalozSzint = classLevels[Osztaly2E.Tengeresz]
const specialization = karakter.szintlepesek[szint-1].harcosFegyver const specialization = karakter.szintlepesek[szint-1].harcosFegyver
const krit = karakter.szintlepesek[szint-1].kalozKritikus const krit = karakter.szintlepesek[szint-1].kalozKritikus
@@ -43,15 +32,8 @@ function LevelUp(props: {
<div className='row mt-3'> <div className='row mt-3'>
<h5 className='col align-self-center'>{szint}. Szint</h5> <h5 className='col align-self-center'>{szint}. Szint</h5>
</div> </div>
{osztaly !== Osztaly2E.Druida && {szint % 4 === 0
<MultiClassOsztalySelector2E && <TulajdonsagNoveles
faj={karakter.faj}
osztaly={osztaly}
changeOsztaly={changeOsztaly}
osztalySzint={classLevels[osztaly]}
/> }
{szint % 4 === 0 &&
<TulajdonsagNoveles
tulajdonsagok={karakter.tulajdonsagok} tulajdonsagok={karakter.tulajdonsagok}
tulajdonsagNoveles={karakter.szintlepesek[szint-1].tulajdonsagNoveles!} tulajdonsagNoveles={karakter.szintlepesek[szint-1].tulajdonsagNoveles!}
changeTulajdonsagNoveles={changeTulajdonsagNoveles} changeTulajdonsagNoveles={changeTulajdonsagNoveles}
@@ -59,23 +41,22 @@ function LevelUp(props: {
<BasicNewLevel <BasicNewLevel
szint={szint} szint={szint}
karakter={karakter} karakter={karakter}
osztaly={osztaly}
changeRolledHP={changeRolledHP} changeRolledHP={changeRolledHP}
/> />
{osztaly === Osztaly2E.Harcos && harcosSzint % 2 === 1 && {karakter.osztaly === Osztaly2E.Harcos && szint % 2 === 1 &&
<HarcosFegyverSpecializacio <HarcosFegyverSpecializacio
specialization={specialization!} specialization={specialization!}
existingSpecializations={karakter.szintlepesek.map(x => x.harcosFegyver)} existingSpecializations={karakter.szintlepesek.map(x => x.harcosFegyver)}
changeSpecialization={changeHarcosSpec} changeSpecialization={changeHarcosSpec}
szint={harcosSzint} szint={szint}
/> />
} }
{osztaly === Osztaly2E.Tengeresz && kalozSzint % 3 === 0 && {karakter.osztaly === Osztaly2E.Tengeresz && szint % 3 === 0 && !!krit &&
<KalozKritikus <KalozKritikus
kritFegyverId={krit!} kritFegyverId={krit}
existingKrits={karakter.szintlepesek.map(x => x.kalozKritikus)} existingKrits={karakter.szintlepesek.map(x => x.kalozKritikus)}
changeKrit={changeKalozKritikus} changeKrit={changeKalozKritikus}
szint={kalozSzint} szint={szint}
/> />
} }
</div> </div>
@@ -84,10 +65,10 @@ function LevelUp(props: {
export function LevelUps(props: {karakter: Karakter2E, changeKarakter: (inputs: Karakter2E) => void}){ export function LevelUps(props: {karakter: Karakter2E, changeKarakter: (inputs: Karakter2E) => void}){
const {karakter, changeKarakter} = props; const {karakter, changeKarakter} = props;
const tulajdonsagokAtSzint = (szint: number) => TulajdonsagokTotal({...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint)}) const tulajdonsagokAtSzint = (szint: number) => TulajdonsagokTotal({...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint - 1)})
const changeRolledHPAtSzint = (szint: number) => (newHProll: number) => { const changeRolledHPAtSzint = (szint: number) => (newHProll: number) => {
changeKarakter({...karakter, szintlepesek: arraySetN(karakter.szintlepesek, szint-1, {...karakter.szintlepesek[szint-1], HProll: newHProll})}) changeKarakter({...karakter, szintlepesek: arraySetN(karakter.szintlepesek, szint-2, {...karakter.szintlepesek[szint-2], HProll: newHProll})})
console.log(karakter) console.log(karakter)
} }
const changeTulajdonsagNovelesAtSzint = (szint: number) => { const changeTulajdonsagNovelesAtSzint = (szint: number) => {
@@ -132,13 +113,11 @@ export function LevelUps(props: {karakter: Karakter2E, changeKarakter: (inputs:
<LevelUp <LevelUp
key={`level-up-${szint}`} key={`level-up-${szint}`}
szint={szint} szint={szint}
osztaly={karakter.szintlepesek[szint-1].osztaly} karakter={{...karakter, tulajdonsagok: tulajdonsagokAtSzint(szint)}}
karakter={{...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint) ,tulajdonsagok: tulajdonsagokAtSzint(szint)}}
changeTulajdonsagNoveles={changeTulajdonsagNovelesAtSzint(szint)} changeTulajdonsagNoveles={changeTulajdonsagNovelesAtSzint(szint)}
changeRolledHP={changeRolledHPAtSzint(szint)} changeRolledHP={changeRolledHPAtSzint(szint)}
changeHarcosSpec={changeHarcosSpecializacioAtSzint(szint)} changeHarcosSpec={changeHarcosSpecializacioAtSzint(szint)}
changeKalozKritikus={changeKalozKritikusAtSzint(szint)} changeKalozKritikus={changeKalozKritikusAtSzint(szint)}
changeOsztaly={(o) => changeKarakter(ChangeOsztalyAtSzint(karakter, o, szint))}
/> />
)} )}
</> </>
@@ -1,54 +0,0 @@
import {Faj2E, SzintKorlatokFajokra} from "../domain-models/faj2E";
import {Osztaly2E, OsztalyLabel} from "../domain-models/osztaly2E";
import React from "react";
function MultiClassOsztalySelector2E(props: {
faj: Faj2E,
osztaly: Osztaly2E,
changeOsztaly: (o: Osztaly2E) => void
osztalySzint: number
}) {
const {faj, osztaly, changeOsztaly, osztalySzint} = props
return <>
<div className='row'>
<div className="col-lg-6">
<div className="row m-md-2">
<label className='col-8 col-sm-6 col-form-label'>Osztály</label>
<div className="col">
<select className="col form-select" value={osztaly}
onChange={(e) => changeOsztaly(e.target.value as Osztaly2E)}>
<optgroup label='Harcos'>
<option value={Osztaly2E.Harcos}>{OsztalyLabel(Osztaly2E.Harcos)}</option>
{SzintKorlatokFajokra(faj)[Osztaly2E.Amazon] > 0 && (
<option value={Osztaly2E.Amazon}>{OsztalyLabel(Osztaly2E.Amazon)}</option>)}
<option value={Osztaly2E.Barbar}>{OsztalyLabel(Osztaly2E.Barbar)}</option>
<option value={Osztaly2E.Ijasz}>{OsztalyLabel(Osztaly2E.Ijasz)}</option>
<option value={Osztaly2E.Tengeresz}>{OsztalyLabel(Osztaly2E.Tengeresz)}</option>
</optgroup>
<option value={Osztaly2E.Pap}>{OsztalyLabel(Osztaly2E.Pap)}</option>
<option value={Osztaly2E.Tolvaj}>{OsztalyLabel(Osztaly2E.Tolvaj)}</option>
<optgroup label='Varázsló'>
<option value={Osztaly2E.Varazslo}>{OsztalyLabel(Osztaly2E.Varazslo)}</option>
<option value={Osztaly2E.Illuzionista}>{OsztalyLabel(Osztaly2E.Illuzionista)}</option>
</optgroup>
<optgroup label='Opcionális'>
<option value={Osztaly2E.Dalnok}>{OsztalyLabel(Osztaly2E.Dalnok)}</option>
{/* Druida nem lehet tobb osztalyu karakter! */}
<option value={Osztaly2E.Vandor}>{OsztalyLabel(Osztaly2E.Vandor)}</option>
</optgroup>
</select>
</div>
</div>
</div>
<div className="col-lg-6">
<div className="row m-2">
<label className='col-sm-6 col-8 col-form-label'>Új {OsztalyLabel(osztaly)} szint{' '}</label>
<span className='col col-form-label'>{osztalySzint}</span>
</div>
</div>
</div>
</>
}
export default MultiClassOsztalySelector2E
@@ -487,7 +487,7 @@
"Harcos": true, "Harcos": true,
"CsakNemHarcos": false, "CsakNemHarcos": false,
"Masfelkezes": false, "Masfelkezes": false,
"Ketkezes": true, "Ketkezes": false,
"KetkezesBonusz": false, "KetkezesBonusz": false,
"HarciManover": false, "HarciManover": false,
"Alakzat": false, "Alakzat": false,
@@ -17,6 +17,7 @@ export interface Karakter2E {
jellem: JellemID, jellem: JellemID,
tulajdonsagok: KarakterTulajdonsagok tulajdonsagok: KarakterTulajdonsagok
faj: Faj2E faj: Faj2E
osztaly: Osztaly2E
kepzettsegek: KepzettsegId[] kepzettsegek: KepzettsegId[]
tolvajKepzettsegek?: KepzettsegId[] tolvajKepzettsegek?: KepzettsegId[]
szint: number, szint: number,
@@ -30,6 +31,7 @@ export const DefaultKarakter: Karakter2E = {
jellem: 'S', jellem: 'S',
tulajdonsagok: TulajdonsagDefaults, tulajdonsagok: TulajdonsagDefaults,
faj: Faj2E.Ember, faj: Faj2E.Ember,
osztaly: Osztaly2E.Tengeresz,
kepzettsegek: [], kepzettsegek: [],
tolvajKepzettsegek: [], tolvajKepzettsegek: [],
szint: 1, szint: 1,
@@ -40,93 +42,34 @@ export const DefaultKarakter: Karakter2E = {
}] }]
} }
function setOsztalyForSzintLepes(szintlepesek: Szintlepes[], osztaly: Osztaly2E, szint: number): Szintlepes[] { function setOsztalyForSzintLepes(szintlepes: Szintlepes, osztaly: Osztaly2E, szint: number): Szintlepes {
const prev = szintlepesek.slice(0, szint-1) const base : Szintlepes = {
const current : Szintlepes = { ...szintlepes,
...szintlepesek[szint-1],
osztaly, osztaly,
harcosFegyver: undefined, harcosFegyver: undefined,
kalozKritikus: undefined kalozKritikus: undefined
} }
const tail = szintlepesek.slice(szint).map(x => {return {...x}})
let harcosSzint = prev.filter(x => x.osztaly === Osztaly2E.Harcos).length if (osztaly === Osztaly2E.Harcos && szint % 2 === 1) {
// TODO: only pick specializations from valid levels base.harcosFegyver = AllowedFegyver(Osztaly2E.Harcos)[szint].Id
const harcosSpecializaciok = szintlepesek
.map(x => x.harcosFegyver)
.filter(x => x != null)
const harcosSpecAtSzint = (hSzint: number): (string | undefined) => {
if (hSzint % 2 === 1) {
const specIndex = (hSzint+1)/2 -1
if (harcosSpecializaciok.length > specIndex ) {
return harcosSpecializaciok[specIndex]
} else {
return AllowedFegyver(Osztaly2E.Harcos)[specIndex].Id
} }
if (osztaly === Osztaly2E.Tengeresz && szint % 3 === 0) {
base.kalozKritikus = AllowedFegyver(Osztaly2E.Tengeresz)[szint].Id
} }
else {
return undefined
}
}
if (osztaly === Osztaly2E.Harcos) {
harcosSzint += 1
current.harcosFegyver = harcosSpecAtSzint(harcosSzint)
}
for (let i = 0; i < tail.length; i++) {
if (tail[i].osztaly === Osztaly2E.Harcos) {
harcosSzint++
tail[i].harcosFegyver = harcosSpecAtSzint(harcosSzint)
}
}
let kalozSzint = prev.filter(x => x.osztaly === Osztaly2E.Tengeresz).length
const existingKalozKrits = szintlepesek
.map(x => x.kalozKritikus)
.filter(x => x != null)
const kalozKritAtSzint = (kSzint: number): (string | undefined) => {
if (kSzint % 3 === 0) {
const specIndex = kSzint/3 -1
if (existingKalozKrits.length > specIndex ) {
return existingKalozKrits[specIndex]
} else {
return AllowedFegyver(Osztaly2E.Tengeresz)[specIndex].Id
}
}
else {
return undefined
}
}
if (osztaly === Osztaly2E.Tengeresz) {
kalozSzint++
current.kalozKritikus = kalozKritAtSzint(szint)
}
for (let i = 0; i < tail.length; i++) {
if (tail[i].osztaly === Osztaly2E.Tengeresz) {
kalozSzint++
tail[i].kalozKritikus = kalozKritAtSzint(kalozSzint)
}
}
const HD = BaseHP(osztaly) const HD = BaseHP(osztaly)
if (szint === 1) { if (szint === 1) {
current.HProll = HD base.HProll = HD
} else { } else {
current.HProll = dAny(HD) base.HProll = dAny(HD)
console.log(`Level ${szint} HP roll on d${HD} is: ${current.HProll} due to class change`) console.log(`Level ${szint} HP roll on d${HD} is: ${base.HProll} due to class change`)
} }
return [...prev, current, ...tail] return base
} }
export function ChangeLvl1Osztaly(karakter: Karakter2E, osztaly: Osztaly2E): Karakter2E { export function ChangeLvl1Osztaly(karakter: Karakter2E, osztaly: Osztaly2E): Karakter2E {
return { return {
...karakter, ...karakter,
szintlepesek: [{...karakter.szintlepesek[0], osztaly}, ...karakter.szintlepesek.slice(1)] osztaly,
} szintlepesek: karakter.szintlepesek.map((l, idx) => setOsztalyForSzintLepes(l, osztaly, idx +1))
}
export function ChangeOsztalyAtSzint(karakter: Karakter2E, osztaly: Osztaly2E, szint: number): Karakter2E {
return {
...karakter,
szintlepesek: setOsztalyForSzintLepes(karakter.szintlepesek, osztaly, szint)
} }
} }
@@ -209,12 +209,12 @@ export const Kepzettsegek: Record<KepzettsegId, Kepzettseg> =
(acc: Record<KepzettsegId, Kepzettseg>, k) => { acc[k.Id] = k; return acc; }, (acc: Record<KepzettsegId, Kepzettseg>, k) => { acc[k.Id] = k; return acc; },
{} as Record<KepzettsegId, Kepzettseg>); {} as Record<KepzettsegId, Kepzettseg>);
export function AvailableKezpettsegList(...osztalyok: Osztaly2E[]): Kepzettseg[] { export function AvailableKezpettsegList(osztaly: Osztaly2E): Kepzettseg[] {
return KepzettsegLista.filter(k => k.Osztalyok == null || k.Osztalyok.some(o => osztalyok.includes(o))) return KepzettsegLista.filter(k => k.Osztalyok == null || k.Osztalyok.includes(osztaly))
} }
export function GetNumberOfKepzettsegek(t_int: number, faj: Faj2E, max: number = 11) { export function GetNumberOfKepzettsegek(t_int: number, faj: Faj2E, max: number = 11) {
//max = 3 + 1 + 3 + 5 = 12 // 3 base, 1 human, 3 from max ability modifier, 5 from Thief at 9th level //max = 3 + 1 + 3 + 4 // 3 base, 1 human, 3 from max ability modifier, 4 from Thief
let numberOfKepzettseg = 3 + Modifier(t_int) + (faj === Faj2E.Ember ? 1 : 0) let numberOfKepzettseg = 3 + Modifier(t_int) + (faj === Faj2E.Ember ? 1 : 0)
if (numberOfKepzettseg < 1) { if (numberOfKepzettseg < 1) {
@@ -228,20 +228,18 @@ export function GetNumberOfKepzettsegek(t_int: number, faj: Faj2E, max: number =
return numberOfKepzettseg; return numberOfKepzettseg;
} }
export function SetDefaultTolvajKepzettsegek(karakter: Pick<Karakter2E, 'szintlepesek' | 'tolvajKepzettsegek'>, changeTolvajKepzettsegek: (tolvajKepzettsegek?: KepzettsegId[]) => void) { export function SetDefaultTolvajKepzettsegek(karakter: Pick<Karakter2E, 'osztaly' | 'szintlepesek' | 'tolvajKepzettsegek'>, changeTolvajKepzettsegek: (tolvajKepzettsegek?: KepzettsegId[]) => void) {
const hasTolvajSzint = karakter.szintlepesek.some(szint => szint.osztaly === Osztaly2E.Tolvaj) if (karakter.osztaly !== Osztaly2E.Tolvaj && karakter.tolvajKepzettsegek != null) {
if (!hasTolvajSzint && karakter.tolvajKepzettsegek != null) {
changeTolvajKepzettsegek(undefined) changeTolvajKepzettsegek(undefined)
} }
if (hasTolvajSzint && (karakter.tolvajKepzettsegek == null || karakter.tolvajKepzettsegek.length === 0)) { if (karakter.osztaly === Osztaly2E.Tolvaj && (karakter.tolvajKepzettsegek == null || karakter.tolvajKepzettsegek.length === 0)) {
const tolvajKepzettsegek = TolvajKepzettsegList.slice(0, 4).map(x => x.Id) const tolvajKepzettsegek = TolvajKepzettsegList.slice(0, 4).map(x => x.Id)
changeTolvajKepzettsegek(tolvajKepzettsegek) changeTolvajKepzettsegek(tolvajKepzettsegek)
} }
} }
export function GetKepzettsegListaN(karakter: Pick<Karakter2E, 'szintlepesek' | 'faj' | 'kepzettsegek' | 'tolvajKepzettsegek'>) { export function GetKepzettsegListaN(karakter: Pick<Karakter2E, 'osztaly' | 'faj' | 'kepzettsegek' | 'tolvajKepzettsegek'>) {
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly)) const availableKepzettsegList = AvailableKezpettsegList(karakter.osztaly)
const availableKepzettsegList = AvailableKezpettsegList(...osztalyok)
return (n: number): Kepzettseg[] => { return (n: number): Kepzettseg[] => {
let available = [...availableKepzettsegList] let available = [...availableKepzettsegList]
if (n === 0) { if (n === 0) {
@@ -251,8 +249,7 @@ export function GetKepzettsegListaN(karakter: Pick<Karakter2E, 'szintlepesek' |
if (karakter.faj === Faj2E.Nomad) { if (karakter.faj === Faj2E.Nomad) {
return [Kepzettsegek.k_lovaglas] return [Kepzettsegek.k_lovaglas]
} }
// TODO birodalmi tolvaj, tolvajképzettségek! if (karakter.faj === Faj2E.Birodalmi && karakter.osztaly !== Osztaly2E.Tolvaj) {
if (karakter.faj === Faj2E.Birodalmi) {
return [Kepzettsegek.k_alkimia, Kepzettsegek.k_meregkeveres, Kepzettsegek.k_okkultizmus] return [Kepzettsegek.k_alkimia, Kepzettsegek.k_meregkeveres, Kepzettsegek.k_okkultizmus]
} }
if (karakter.faj === Faj2E.Torpe) { if (karakter.faj === Faj2E.Torpe) {
@@ -261,38 +258,30 @@ export function GetKepzettsegListaN(karakter: Pick<Karakter2E, 'szintlepesek' |
if (karakter.faj === Faj2E.Elf || karakter.faj === Faj2E.Felelf) { if (karakter.faj === Faj2E.Elf || karakter.faj === Faj2E.Felelf) {
return [Kepzettsegek.k_vadonjaras] return [Kepzettsegek.k_vadonjaras]
} }
if (osztalyok.has(Osztaly2E.Druida) || osztalyok.has(Osztaly2E.Vandor)) { if (karakter.osztaly === Osztaly2E.Druida || karakter.osztaly === Osztaly2E.Vandor) {
return [Kepzettsegek.k_vadonjaras] return [Kepzettsegek.k_vadonjaras]
} }
if (osztalyok.has(Osztaly2E.Dalnok)) { if (karakter.osztaly === Osztaly2E.Dalnok) {
return [Kepzettsegek.k_eloadas] return [Kepzettsegek.k_eloadas]
} }
} }
if (n === 1) { if (n === 1) {
if ((osztalyok.has(Osztaly2E.Vandor) || osztalyok.has(Osztaly2E.Druida)) if (karakter.osztaly === Osztaly2E.Dalnok
&& karakter.kepzettsegek[0] !== Kepzettsegek.k_vadonjaras.Id) { && [Faj2E.Eszaki, Faj2E.Nomad, Faj2E.Birodalmi, Faj2E.Torpe, Faj2E.Elf, Faj2E.Felelf].includes(karakter.faj)) {
return [Kepzettsegek.k_eloadas]
}
if ([Osztaly2E.Druida, Osztaly2E.Vandor].includes(karakter.osztaly)
&& [Faj2E.Eszaki, Faj2E.Nomad, Faj2E.Birodalmi, Faj2E.Torpe].includes(karakter.faj)) {
return [Kepzettsegek.k_vadonjaras] return [Kepzettsegek.k_vadonjaras]
} }
if (osztalyok.has(Osztaly2E.Dalnok)
&& karakter.kepzettsegek[0] !== Kepzettsegek.k_eloadas.Id) {
return [Kepzettsegek.k_eloadas]
}
}
if (n === 2) { // maybe write a better abstraction?
if (osztalyok.has(Osztaly2E.Dalnok)
&& karakter.kepzettsegek[0] !== Kepzettsegek.k_eloadas.Id
&& karakter.kepzettsegek[1] !== Kepzettsegek.k_eloadas.Id) {
return [Kepzettsegek.k_eloadas]
}
} }
const kepzettsegekWithoutN = [...karakter.kepzettsegek.slice(0, n), ...karakter.kepzettsegek.slice(n + 1)] const kepzettsegekWithoutN = [...karakter.kepzettsegek.slice(0, n), ...karakter.kepzettsegek.slice(n + 1)]
return available.filter(x => !kepzettsegekWithoutN.includes(x.Id) && !karakter.tolvajKepzettsegek?.includes(x.Id)) return available.filter(x => !kepzettsegekWithoutN.includes(x.Id) && !karakter.tolvajKepzettsegek?.includes(x.Id))
} }
} }
export function SetDefaultKepzettsegek(karakter: Pick<Karakter2E, 'szintlepesek' | 'faj' | 'tulajdonsagok' | 'kepzettsegek' | 'tolvajKepzettsegek'>, changeKepzettsegek: (k: KepzettsegId[]) => void) { export function SetDefaultKepzettsegek(karakter: Pick<Karakter2E, 'osztaly' | 'faj' | 'tulajdonsagok' | 'kepzettsegek' | 'tolvajKepzettsegek'>, changeKepzettsegek: (k: KepzettsegId[]) => void) {
const osztalyok = karakter.szintlepesek.map(x => x.osztaly) const availableKepzettsegList = AvailableKezpettsegList(karakter.osztaly)
const availableKepzettsegList = AvailableKezpettsegList(...osztalyok)
const numberOfKepzettsegek = GetNumberOfKepzettsegek(karakter.tulajdonsagok.t_int, karakter.faj, availableKepzettsegList.length) const numberOfKepzettsegek = GetNumberOfKepzettsegek(karakter.tulajdonsagok.t_int, karakter.faj, availableKepzettsegList.length)
let kepzettsegek = [...karakter.kepzettsegek] let kepzettsegek = [...karakter.kepzettsegek]
@@ -14,7 +14,7 @@ export interface MasodlagosErtekekView {
Mentok: Mentok Mentok: Mentok
} }
export type KarakterpickForMasodlagosErtekek = Pick<Karakter2E, 'tulajdonsagok' | 'szint' | 'szintlepesek' | 'faj' | 'felszereles'> export type KarakterpickForMasodlagosErtekek = Pick<Karakter2E, 'osztaly' | 'tulajdonsagok' | 'szint' | 'szintlepesek' | 'faj' | 'felszereles'>
export function BaseHP(osztaly: Osztaly2E) { export function BaseHP(osztaly: Osztaly2E) {
let base = 4; let base = 4;
@@ -45,7 +45,7 @@ export function BaseHP(osztaly: Osztaly2E) {
return base return base
} }
export function HP(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'szintlepesek'>): number { export function HP(karakter: Pick<Karakter2E, 'osztaly' | 'tulajdonsagok' | 'szintlepesek'>): number {
const egeszsegModifier = Modifier(karakter.tulajdonsagok.t_egs) const egeszsegModifier = Modifier(karakter.tulajdonsagok.t_egs)
return karakter.szintlepesek return karakter.szintlepesek
// https://lfg.hu/forum/topic/15079-kard-es-magia/page/219/#comment-2218333 // https://lfg.hu/forum/topic/15079-kard-es-magia/page/219/#comment-2218333
@@ -53,8 +53,7 @@ export function HP(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'szintlepesek'>)
.reduce((sum, val) => sum + val, 0) .reduce((sum, val) => sum + val, 0)
} }
export function VO(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'faj' | 'szintlepesek' | 'szint' | 'felszereles'>): number { export function VO(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'faj' | 'osztaly' | 'szint' | 'felszereles'>): number {
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
const pancel = GetPancel(karakter.felszereles.pancelID) const pancel = GetPancel(karakter.felszereles.pancelID)
const pancelVO = pancel?.VO ?? 0 const pancelVO = pancel?.VO ?? 0
const pajzsVO = GetPajzs(karakter.felszereles.pajzsID)?.VO ?? 0 const pajzsVO = GetPajzs(karakter.felszereles.pajzsID)?.VO ?? 0
@@ -63,16 +62,14 @@ export function VO(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'faj' | 'szintle
if (pancel) { if (pancel) {
abilityVO = Math.min(MaxAbilityVO(pancel.Type), abilityVO) abilityVO = Math.min(MaxAbilityVO(pancel.Type), abilityVO)
} }
if (osztalyok.has(Osztaly2E.Tengeresz)) { if (karakter.osztaly === Osztaly2E.Tengeresz) {
const kalozSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Tengeresz).length vo += Math.floor(karakter.szint / 3)
vo += Math.floor(kalozSzintek / 3)
} }
if (osztalyok.has(Osztaly2E.Amazon)) { if (karakter.osztaly === Osztaly2E.Amazon) {
if (karakter.tulajdonsagok.t_kar > karakter.tulajdonsagok.t_ugy) { if (karakter.tulajdonsagok.t_kar > karakter.tulajdonsagok.t_ugy) {
abilityVO = Modifier(karakter.tulajdonsagok.t_kar) abilityVO = Modifier(karakter.tulajdonsagok.t_kar)
} }
const amazonSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Amazon).length vo += Math.floor(karakter.szint / 2)
vo += Math.floor(amazonSzintek / 2)
} }
if (karakter.faj === Faj2E.Felszerzet || karakter.faj === Faj2E.Gnom){ if (karakter.faj === Faj2E.Felszerzet || karakter.faj === Faj2E.Gnom){
vo += 1 vo += 1
@@ -1,7 +1,6 @@
import {Osztaly2E} from "./osztaly2E"; import {Osztaly2E} from "./osztaly2E";
import {Karakter2E} from "./karakter2E"; import {Karakter2E} from "./karakter2E";
import {KarakterTulajdonsagok, TulajdonsagModosito} from "./tulajdonsag2E"; import {KarakterTulajdonsagok, TulajdonsagModosito} from "./tulajdonsag2E";
import {Szintlepes} from "./szintlepes";
export interface Mentok { export interface Mentok {
kitartas: number kitartas: number
@@ -74,26 +73,8 @@ export function MentoModositok(tulajdonsagModositok: KarakterTulajdonsagok) {
} }
} }
export function MultiClassMentokAlap(szintlepesek: Szintlepes[]) : Mentok { export function MentokTotal(karakter: Pick<Karakter2E, 'osztaly' | 'szint' | 'tulajdonsagok'>) {
const osztalyok = new Set(szintlepesek.map(x => x.osztaly)) const alap = MentokAlap(karakter.osztaly, karakter.szint)
let mentok = {
kitartas: 0,
reflex: 0,
akaratero: 0
}
for (const osztaly of osztalyok) {
const szint = szintlepesek.filter(x => x.osztaly === osztaly).length
const uj_mentok = MentokAlap(osztaly, szint)
mentok.akaratero += uj_mentok.akaratero
mentok.reflex += uj_mentok.reflex
mentok.kitartas += uj_mentok.kitartas
}
return mentok
}
export function MentokTotal(karakter: Pick<Karakter2E, 'szintlepesek' | 'tulajdonsagok'>) {
const alap = MultiClassMentokAlap(karakter.szintlepesek)
const modositok = MentoModositok(TulajdonsagModosito(karakter.tulajdonsagok)) const modositok = MentoModositok(TulajdonsagModosito(karakter.tulajdonsagok))
return { return {
kitartas: alap.kitartas + modositok.kitartas, kitartas: alap.kitartas + modositok.kitartas,
@@ -20,15 +20,14 @@ export function PickableSpecializationFilter(existingSpecilizations: (string | u
} }
export function LevelUp(karakter: Karakter2E, changeKarakter: (input: Karakter2E) => void) { export function LevelUp(karakter: Karakter2E, changeKarakter: (input: Karakter2E) => void) {
const osztaly = karakter.szintlepesek[0].osztaly
const tulajdonsagokTotal = TulajdonsagokTotal(karakter) const tulajdonsagokTotal = TulajdonsagokTotal(karakter)
const szint = karakter.szint + 1 const szint = karakter.szint + 1
const dice = BaseHP(osztaly) const dice = BaseHP(karakter.osztaly)
const roll = dAny(dice) const roll = dAny(dice)
console.log(`Level ${szint} HP roll on d${dice} is: ${roll}`) console.log(`Level ${szint} HP roll on d${dice} is: ${roll}`)
const szintlepes: Szintlepes = { const szintlepes: Szintlepes = {
osztaly: osztaly, osztaly: karakter.osztaly,
HProll: roll HProll: roll
} }
@@ -40,23 +39,14 @@ export function LevelUp(karakter: Karakter2E, changeKarakter: (input: Karakter2E
} }
} }
} }
if(osztaly === Osztaly2E.Harcos) { if(karakter.osztaly === Osztaly2E.Harcos && szint % 2 === 1) {
const harcosSzint = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Harcos).length + 1
if (harcosSzint % 2 === 1) {
const harcosSpecializaciok = karakter.szintlepesek.map(x => x.harcosFegyver) const harcosSpecializaciok = karakter.szintlepesek.map(x => x.harcosFegyver)
let specializationFilter = PickableSpecializationFilter(harcosSpecializaciok, harcosSzint) szintlepes.harcosFegyver = AllowedFegyver(Osztaly2E.Harcos).filter(PickableSpecializationFilter(harcosSpecializaciok, karakter.szint))[0].Id
szintlepes.harcosFegyver = AllowedFegyver(Osztaly2E.Harcos).filter(specializationFilter)[0].Id
} }
} if(karakter.osztaly === Osztaly2E.Tengeresz && szint % 3 === 0) {
if(osztaly === Osztaly2E.Tengeresz) {
const kalozSzint = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Tengeresz).length + 1
if (kalozSzint % 3 === 0) {
let kalozKritikus = karakter.szintlepesek.map(x => x.kalozKritikus) let kalozKritikus = karakter.szintlepesek.map(x => x.kalozKritikus)
let specializationFilter = PickableSpecializationFilter(kalozKritikus, kalozSzint) szintlepes.kalozKritikus = AllowedFegyver(Osztaly2E.Tengeresz).filter(PickableSpecializationFilter(kalozKritikus, szint))[0].Id
szintlepes.kalozKritikus = AllowedFegyver(Osztaly2E.Tengeresz).filter(specializationFilter)[0].Id
} }
}
changeKarakter({...karakter, szint, szintlepesek: [...karakter.szintlepesek, szintlepes]}) changeKarakter({...karakter, szint, szintlepesek: [...karakter.szintlepesek, szintlepes]})
} }
@@ -68,32 +58,3 @@ export function LevelDown(karakter: Karakter2E, changeKarakter: (input: Karakter
console.error(`Can't level down character: ${karakter}`) console.error(`Can't level down character: ${karakter}`)
} }
} }
export type ClassLevels = {
[key in Osztaly2E]: number;
};
const defaultClassLevels: ClassLevels = {
[Osztaly2E.Amazon]: 0,
[Osztaly2E.Barbar]: 0,
[Osztaly2E.Ijasz]: 0,
[Osztaly2E.Harcos]: 0,
[Osztaly2E.Tengeresz]: 0,
[Osztaly2E.Tolvaj]: 0,
[Osztaly2E.Pap]: 0,
[Osztaly2E.Varazslo]: 0,
[Osztaly2E.Illuzionista]: 0,
[Osztaly2E.Dalnok]: 0,
[Osztaly2E.Druida]: 0,
[Osztaly2E.Vandor]: 0,
}
export function getClassLevels(szintlepesek: Szintlepes[]) : ClassLevels {
return szintlepesek.map(x => x.osztaly).reduce((classLevels, osztaly) => {
classLevels[osztaly]++
return classLevels
}, {...defaultClassLevels})
}
@@ -1,7 +1,6 @@
import {Osztaly2E} from "./osztaly2E"; import {Osztaly2E} from "./osztaly2E";
import {Karakter2E} from "./karakter2E"; import {Karakter2E} from "./karakter2E";
import {Modifier} from "./tulajdonsag2E"; import {Modifier} from "./tulajdonsag2E";
import {Szintlepes} from "./szintlepes";
/// Finally second edition doesn't mess with the extra attack of high level clerics rouges and wizards! /// Finally second edition doesn't mess with the extra attack of high level clerics rouges and wizards!
function ExtraAttack(attack: number): number[] { function ExtraAttack(attack: number): number[] {
@@ -11,31 +10,6 @@ function ExtraAttack(attack: number): number[] {
return [Math.min(attack, 10), ...ExtraAttack(attack - 5)] return [Math.min(attack, 10), ...ExtraAttack(attack - 5)]
} }
export function TamadasBonuszBase(osztaly: Osztaly2E, szint: number = 1) : number {
let base = 0
switch (osztaly){
case Osztaly2E.Barbar:
case Osztaly2E.Amazon:
case Osztaly2E.Ijasz:
case Osztaly2E.Tengeresz:
case Osztaly2E.Harcos:
case Osztaly2E.Vandor:
base = szint;
break;
case Osztaly2E.Pap:
case Osztaly2E.Tolvaj:
case Osztaly2E.Dalnok:
case Osztaly2E.Druida:
base = Math.floor(szint * 2 / 3);
break;
case Osztaly2E.Varazslo:
case Osztaly2E.Illuzionista:
base = Math.floor(szint / 2);
break;
}
return base
}
export function TamadasBonusz(osztaly: Osztaly2E, szint: number = 1) : number[] { export function TamadasBonusz(osztaly: Osztaly2E, szint: number = 1) : number[] {
let base = 0 let base = 0
switch (osztaly){ switch (osztaly){
@@ -61,23 +35,12 @@ export function TamadasBonusz(osztaly: Osztaly2E, szint: number = 1) : number[]
return ExtraAttack(base) return ExtraAttack(base)
} }
export function KozelharciTB(karakter : Pick<Karakter2E, 'szint' | 'tulajdonsagok' | 'osztaly'>): number[] {
export function MultiClassTamadasBonusz(szintlepesek: Szintlepes[]) : number[]{ const base = TamadasBonusz(karakter.osztaly, karakter.szint);
const osztalyok = new Set(szintlepesek.map(x => x.osztaly))
let TBB = 0
for (const osztaly of osztalyok) {
const szint = szintlepesek.filter(x => x.osztaly === osztaly).length
TBB += TamadasBonuszBase(osztaly, szint)
}
return ExtraAttack(TBB)
}
export function KozelharciTB(karakter : Pick<Karakter2E, 'szintlepesek' | 'tulajdonsagok'>): number[] {
const base = MultiClassTamadasBonusz(karakter.szintlepesek);
let modifier = Modifier(karakter.tulajdonsagok.t_ero) let modifier = Modifier(karakter.tulajdonsagok.t_ero)
return base.map(v => v + modifier) return base.map(v => v + modifier)
} }
export function CelzoTB(karakter : Pick<Karakter2E, 'szintlepesek' | 'tulajdonsagok'>): number[] { export function CelzoTB(karakter : Pick<Karakter2E, 'szint' | 'tulajdonsagok' | 'osztaly'>): number[] {
let base = MultiClassTamadasBonusz(karakter.szintlepesek) let base = TamadasBonusz(karakter.osztaly, karakter.szint)
return base.map(v => v + Modifier(karakter.tulajdonsagok.t_ugy)) return base.map(v => v + Modifier(karakter.tulajdonsagok.t_ugy))
} }
@@ -103,7 +103,7 @@ function CreateCharacter2E(props: {}) {
</div> </div>
<OsztalySelector2E <OsztalySelector2E
currentFaj={karakter.faj} currentFaj={karakter.faj}
currentOsztaly={karakter.szintlepesek[0].osztaly} currentOsztaly={karakter.osztaly}
changeOsztaly={o => setKarakter(ChangeLvl1Osztaly(karakter, o))} changeOsztaly={o => setKarakter(ChangeLvl1Osztaly(karakter, o))}
/> />
{karakter.szintlepesek[0].osztaly === Osztaly2E.Harcos && {karakter.szintlepesek[0].osztaly === Osztaly2E.Harcos &&
+1 -10
View File
@@ -13,21 +13,12 @@
## Features ## Features
- multiclass characters - multiclass characters
- 2e -ben félig működik
- druidáknál tiltani kell
- PDF-ben varazshasznalok
- tolvaj 9ik szintű képessége
## Epics ## Epics
- Backend - Backend
- Varazslatok - Varazslatok
- Felszerelés - Felszerelés
- 1e-ben fel van már véve az adat. Gergő neki veselkedik. - KéM 2.0-ra felkészülés
- 2e-ben teljesen hiányzik
- KéM 2e
- frontend oldalon úgy, ahogy megvan
- PDF hiányzik
- backend hiányzik
- Klikkelésre dobás - Klikkelésre dobás