fix kepzettsegek errors

This commit is contained in:
2024-04-20 18:06:17 +02:00
parent 626ceb1422
commit ee9a82eed0
7 changed files with 81 additions and 42 deletions
-2
View File
@@ -1,5 +1,3 @@
version: "3"
services:
db:
image: postgres:16.1-alpine3.19
@@ -4,17 +4,29 @@ import {Osztaly2E} from '../domain-models/osztaly2E'
import {AllowedPajzsTypes, AllowedPancelTypes} from '../domain-models/allowed-pancel-types'
import fegyverek from '../domain-models/fegyver.json'
import {arraySetN} from "../../util";
import {AllowedFegyver} from "../domain-models/allowed-fegyver";
import {AllowedFegyverek} from "../domain-models/allowed-fegyver";
import FegyverSelector from "../display-components/FegyverSelector";
import {useDispatch, useSelector} from "react-redux";
import {AppDispatch, RootState} from "../../store";
import {characterSelector, setFelszereles} from "../domain-models/characterSlice";
function Felszereles(props: {felszereles: KarakterFelszereles, changeFelszereles: (felszereles: KarakterFelszereles) => void, osztaly: Osztaly2E}) {
const { felszereles, changeFelszereles, osztaly } = props;
const allowedPancel = AllowedPancelTypes([osztaly])
const allowedPajzs = AllowedPajzsTypes([osztaly])
export function Felszereles(){
const character = useSelector.withTypes<RootState>()(characterSelector)
const dispatch = useDispatch.withTypes<AppDispatch>()()
const felszereles = character.felszereles
const osztalyok = character.szintlepesek.map(x => x.osztaly)
const changeFelszereles = (f: KarakterFelszereles) => dispatch(setFelszereles(f))
return <FelszerelesView felszereles={felszereles} changeFelszereles={changeFelszereles} osztalyok={osztalyok} />
}
export function FelszerelesView(props: {felszereles: KarakterFelszereles, changeFelszereles: (felszereles: KarakterFelszereles) => void, osztalyok: Osztaly2E[]}) {
const {felszereles, changeFelszereles, osztalyok} = props;
const allowedPancel = AllowedPancelTypes(osztalyok)
const allowedPajzs = AllowedPajzsTypes(osztalyok)
const valasztottFegyverek = felszereles.fegyverIDk
.map((id, idx) => ({idx, fegyver: fegyverek.data.find(f => f.Id === id)})).filter((x) => x.fegyver != null).map(({idx, fegyver}) => ({idx, fegyver: fegyver as Fegyver}))
const osztalyAllowedFegyverek = AllowedFegyver(osztaly)
const osztalyAllowedFegyverek = AllowedFegyverek(osztalyok)
const allowedFegyverek = [...osztalyAllowedFegyverek, ...valasztottFegyverek.filter(({idx, fegyver}) => !osztalyAllowedFegyverek.map(f => f.Id).includes(fegyver.Id)).map(({fegyver}) => fegyver)]
const changeFegyver = (idx: number, newID: string) => {
const found = fegyverek.data.find(x => x.Id === newID)
@@ -51,6 +63,7 @@ function Felszereles(props: {felszereles: KarakterFelszereles, changeFelszereles
>
<option key={'nincs'} value={'nincs'}>Nincs</option>
{
allowedPancel.some(p => p.Type === "konnyu") &&
<optgroup label={PancelTypeLabel("konnyu")}>
{allowedPancel.filter(p => p.Type === "konnyu").map(p =>
<option key={p.Id} value={p.Id}>{`${p.Name}${p.Size > 1 ? ` [${p.Size}]` : ''} (+${p.VO} VO) - ${p.Price} at`}</option>)}
@@ -60,7 +73,7 @@ function Felszereles(props: {felszereles: KarakterFelszereles, changeFelszereles
allowedPancel.some(p => p.Type === "nehez") &&
<optgroup label={PancelTypeLabel("nehez")}>
{allowedPancel.filter(p => p.Type === "nehez").map(p =>
<option key={p.Id} value={p.Id}>{`${p.Name} (+${p.VO} VO) - ${p.Price} at`}</option>)}
<option key={p.Id} value={p.Id}>{`${p.Name} [${p.Size}] (+${p.VO} VO) - ${p.Price} at`}</option>)}
</optgroup>
}
</select>
@@ -41,7 +41,7 @@ function InternalKepzettsegekSelector(props: {
for (let i = 0; i < numberOfKepzettseg; i++) {
preCalculated.push({
kepzettsegek: getKepzettsegListaN(i),
selected: Kepzettsegek[kepzettsegek[i]],
selected: Kepzettsegek[kepzettsegek[i]] || getKepzettsegListaN(i)[0],
changeKepzettseg: (newKepzettseg: KepzettsegId) => changeKepzettsegek(arraySetN(kepzettsegek, i, newKepzettseg))
})
}
@@ -2,6 +2,10 @@ import {Fegyver} from "./felszereles";
import fegyverDB from "./fegyver.json";
import {Osztaly2E} from "./osztaly2E";
export function AllowedFegyverek(osztalyok: Osztaly2E[]): Fegyver[] {
return [...new Set(osztalyok.flatMap(AllowedFegyver))]
}
export function AllowedFegyver(o: Osztaly2E): Fegyver[] {
const fegyverek = fegyverDB.data.map(x => x as Fegyver)
const varazslo = fegyverek.filter(f => ['okol', 'bot', 'bot_vasalt' , 'bunko', 'tor', 'parittya', 'dobotu'].includes(f.Id))
@@ -1,12 +1,17 @@
import {createSlice} from "@reduxjs/toolkit";
import {Faj2E, TulajdonsagokFajjal} from "./faj2E";
import {Faj2E} from "./faj2E";
import {JellemID} from "./jellem";
import {DefaultKarakter, Karakter2E} from "./karakter2E";
import {RollAllAbilities} from "./tulajdonsag2E";
import {Osztaly2E} from "./osztaly2E";
import {arraySetN} from "../../util";
import {GetNumberOfKepzettsegek, KepzettsegId} from "./kepzettsegek2E";
import {
AdjustKepzettsegek,
KepzettsegId,
SetDefaultTolvajKepzettsegek
} from "./kepzettsegek2E";
import {BaseHP} from "./masodlagos_ertekek";
import {KarakterFelszereles} from "./felszereles";
export const characterSlice = createSlice({
name: "character2E",
@@ -23,13 +28,12 @@ export const characterSlice = createSlice({
},
setFaj: (state, action: { payload: Faj2E }) => {
state.faj = action.payload;
const tulajdonsagokFajjal = TulajdonsagokFajjal(state.tulajdonsagok, state.faj)
const numberOfKepzettsegek = GetNumberOfKepzettsegek(tulajdonsagokFajjal.t_int, state.faj)
state.kepzettsegek = state.kepzettsegek.slice(0, numberOfKepzettsegek);
state.kepzettsegek = AdjustKepzettsegek(state)
state.kepzettsegFajError = getKepzettsegErrorForFaj(action.payload, [...state.kepzettsegek, ...(state.tolvajKepzettsegek || [])])
},
rollAbilities: (state) => {
state.tulajdonsagok = RollAllAbilities()
state.kepzettsegek = AdjustKepzettsegek(state)
},
setEro: (state, action: {payload: number}) => {
state.tulajdonsagok.t_ero = action.payload;
@@ -42,9 +46,7 @@ export const characterSlice = createSlice({
},
setIntelligencia: (state, action: {payload: number}) => {
state.tulajdonsagok.t_int = action.payload;
const tulajdonsagokFajjal = TulajdonsagokFajjal(state.tulajdonsagok, state.faj)
const numberOfKepzettsegek = GetNumberOfKepzettsegek(tulajdonsagokFajjal.t_int, state.faj)
state.kepzettsegek = state.kepzettsegek.slice(0, numberOfKepzettsegek);
state.kepzettsegek = AdjustKepzettsegek(state);
},
setBolcsesseg: (state, action: {payload: number}) => {
state.tulajdonsagok.t_bol = action.payload;
@@ -56,17 +58,17 @@ export const characterSlice = createSlice({
const szintlepesek = [{...state.szintlepesek[0], HProll: BaseHP(action.payload) , osztaly: action.payload}, ...state.szintlepesek.slice(1)]
state.szintlepesek = szintlepesek
// if character is not a tolvaj anymore remove all tolvaj kepzettsegek
if (szintlepesek.every(l => l.osztaly !== Osztaly2E.Tolvaj)){
state.tolvajKepzettsegek = [];
state.kepzettsegFajError = getKepzettsegErrorForFaj(state.faj, [...state.kepzettsegek])
}
SetDefaultTolvajKepzettsegek(state, t => state.tolvajKepzettsegek = t)
state.kepzettsegFajError = getKepzettsegErrorForFaj(state.faj, [...state.kepzettsegek])
const osztalyok = new Set(szintlepesek.map(x => x.osztaly))
state.kepzettsegOsztalyError = getKepzettsegErrorForOsztaly(osztalyok, state.kepzettsegek);
},
setCharacter: (state, action: {payload: Karakter2E}) => {
state = action.payload
SetDefaultTolvajKepzettsegek(state, t => state.tolvajKepzettsegek = t)
const osztalyok = new Set(state.szintlepesek.map(x => x.osztaly))
state.kepzettsegOsztalyError = getKepzettsegErrorForOsztaly(osztalyok, state.kepzettsegek);
state.kepzettsegFajError = getKepzettsegErrorForFaj(action.payload.faj, action.payload.kepzettsegek)
return state;
},
setHarcosSpecialization: (state, action: {payload: {szint: number, fegyver: string}}) => {
@@ -85,8 +87,12 @@ export const characterSlice = createSlice({
},
setTolvajKepzettsegek: (state, action: {payload: KepzettsegId[]}) => {
state.tolvajKepzettsegek = action.payload;
// birodalmi
state.kepzettsegFajError = getKepzettsegErrorForFaj(state.faj, [...state.kepzettsegek, ...action.payload])
},
setFelszereles: (state, action: {payload: KarakterFelszereles}) => {
state.felszereles = action.payload;
}
}
})
@@ -140,6 +146,7 @@ export const {
setHarcosSpecialization,
setKepzettsegek,
setTolvajKepzettsegek,
setFelszereles,
} = characterSlice.actions
export const characterSelector = characterSlice.selectSlice
@@ -1,5 +1,5 @@
import {Osztaly2E} from "./osztaly2E";
import {Faj2E} from "./faj2E";
import {Faj2E, TulajdonsagokFajjal} from "./faj2E";
import {Karakter2E} from "./karakter2E";
import {Modifier, Tulajdonsag2E} from "./tulajdonsag2E";
@@ -213,6 +213,14 @@ export function AvailableKezpettsegList(...osztalyok: Osztaly2E[]): Kepzettseg[]
return KepzettsegLista.filter(k => k.Osztalyok == null || k.Osztalyok.some(o => osztalyok.includes(o)))
}
export function AvailableKezpettsegListFajjal(faj: Faj2E, ...osztalyok: Osztaly2E[]): Kepzettseg[] {
const birodalmiKepzettsegek : KepzettsegId[] = ["k_alkimia", "k_meregkeveres", "k_okkultizmus"]
return KepzettsegLista.filter(k =>
k.Osztalyok == null || k.Osztalyok.some(o => osztalyok.includes(o))
|| (faj === Faj2E.Birodalmi && birodalmiKepzettsegek.some(x => x === k.Id))
)
}
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
let numberOfKepzettseg = 3 + Modifier(t_int) + (faj === Faj2E.Ember ? 1 : 0)
@@ -239,18 +247,16 @@ export function SetDefaultTolvajKepzettsegek(karakter: Pick<Karakter2E, 'szintle
}
}
export function GetKepzettsegAtN(karakter: Pick<Karakter2E, 'szintlepesek' | 'faj' | 'kepzettsegek' | 'tolvajKepzettsegek'>, n: number): Kepzettseg | undefined {
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
let availableKepzettsegList = AvailableKezpettsegListFajjal(karakter.faj, ...osztalyok)
const kepzettsegekWithoutN = [...karakter.kepzettsegek.slice(0, n), ...karakter.kepzettsegek.slice(n + 1)]
return availableKepzettsegList.find(x => !kepzettsegekWithoutN.includes(x.Id) && !karakter.tolvajKepzettsegek?.includes(x.Id))
}
export function GetKepzettsegListaN(karakter: Pick<Karakter2E, 'szintlepesek' | 'faj' | 'kepzettsegek' | 'tolvajKepzettsegek'>) {
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
let availableKepzettsegList = AvailableKezpettsegList(...osztalyok)
if (karakter.faj === Faj2E.Birodalmi && availableKepzettsegList.every(x => x.Id !== "k_okkultizmus")) {
availableKepzettsegList = [Kepzettsegek.k_okkultizmus, ...availableKepzettsegList]
}
if (karakter.faj === Faj2E.Birodalmi && availableKepzettsegList.every(x => x.Id !== "k_meregkeveres")) {
availableKepzettsegList = [Kepzettsegek.k_meregkeveres, ...availableKepzettsegList]
}
if (karakter.faj === Faj2E.Birodalmi && availableKepzettsegList.every(x => x.Id !== "k_alkimia")) {
availableKepzettsegList = [Kepzettsegek.k_alkimia, ...availableKepzettsegList]
}
let availableKepzettsegList = AvailableKezpettsegListFajjal(karakter.faj, ...osztalyok)
return (n: number): Kepzettseg[] => {
let available = [...availableKepzettsegList]
// if (n === 0) {
@@ -298,3 +304,22 @@ export function GetKepzettsegListaN(karakter: Pick<Karakter2E, 'szintlepesek' |
return available.filter(x => !kepzettsegekWithoutN.includes(x.Id) && !karakter.tolvajKepzettsegek?.includes(x.Id))
}
}
export function AdjustKepzettsegek(karakter: Pick<Karakter2E, 'faj' | 'tulajdonsagok' | 'szintlepesek' | 'kepzettsegek' | 'tolvajKepzettsegek'>): KepzettsegId[] {
const tulajdonsagokFajjal = TulajdonsagokFajjal(karakter.tulajdonsagok, karakter.faj)
const numberOfKepzettsegek = GetNumberOfKepzettsegek(tulajdonsagokFajjal.t_int, karakter.faj)
const diff = numberOfKepzettsegek - karakter.kepzettsegek.length
if (diff > 0) {
const kepzettsegek = [...karakter.kepzettsegek]
for (let i = 0; i < diff; i++) {
const next = GetKepzettsegAtN({
...karakter,
kepzettsegek,
}, kepzettsegek.length + 1)!.Id;
kepzettsegek.push(next)
}
return kepzettsegek;
} else {
return karakter.kepzettsegek.slice(0, numberOfKepzettsegek);
}
}
@@ -8,7 +8,6 @@ import {Osztaly2E} from "../domain-models/osztaly2E";
import KarakterKepzettsegek from "../components/KarakterKepzettsegek2E";
import MasodlagosErtekek from "../components/MasodlagosErtekek";
import Felszereles from "../components/Felszereles";
import {KarakterFelszereles} from "../domain-models/felszereles";
import LevelUps from "../components/LevelUps";
import {LevelDown, LevelUp} from "../domain-models/szintlepes";
import HarcosFegyverSpecializacio from "../components/HarcosFegyverSpec";
@@ -38,9 +37,6 @@ function CreateCharacter2E(props: {
const karakter = useSelector.withTypes<RootState>()(characterSelector)
const setKarakter = (newState: Karakter2E) => dispatch(setCharacter(newState));
const changeFelszereles = (f: KarakterFelszereles) => setKarakter({...karakter, felszereles: f})
let [showSaveModal, setShowSaveModal] = useState(false);
let [newId, setNewId] = useState(null as string | null)
let [showSaved, setShowSaved] = useState(false);
@@ -126,11 +122,7 @@ function CreateCharacter2E(props: {
</button>}
</div>
<hr/>
<Felszereles
osztaly={karakter.szintlepesek[0].osztaly}
felszereles={karakter.felszereles}
changeFelszereles={changeFelszereles}
/>
<Felszereles />
<hr/>
<div className='row'>