diff --git a/docker-compose.yaml b/docker-compose.yaml index 72d77a9..2520994 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,5 +1,3 @@ -version: "3" - services: db: image: postgres:16.1-alpine3.19 diff --git a/frontend/src/second-edition/components/Felszereles.tsx b/frontend/src/second-edition/components/Felszereles.tsx index d50b712..edca9d3 100644 --- a/frontend/src/second-edition/components/Felszereles.tsx +++ b/frontend/src/second-edition/components/Felszereles.tsx @@ -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()(characterSelector) + const dispatch = useDispatch.withTypes()() + const felszereles = character.felszereles + const osztalyok = character.szintlepesek.map(x => x.osztaly) + const changeFelszereles = (f: KarakterFelszereles) => dispatch(setFelszereles(f)) + return +} + +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 > { + allowedPancel.some(p => p.Type === "konnyu") && {allowedPancel.filter(p => p.Type === "konnyu").map(p => )} @@ -60,7 +73,7 @@ function Felszereles(props: {felszereles: KarakterFelszereles, changeFelszereles allowedPancel.some(p => p.Type === "nehez") && {allowedPancel.filter(p => p.Type === "nehez").map(p => - )} + )} } diff --git a/frontend/src/second-edition/components/KarakterKepzettsegek2E.tsx b/frontend/src/second-edition/components/KarakterKepzettsegek2E.tsx index ab7f3be..ab708c8 100644 --- a/frontend/src/second-edition/components/KarakterKepzettsegek2E.tsx +++ b/frontend/src/second-edition/components/KarakterKepzettsegek2E.tsx @@ -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)) }) } diff --git a/frontend/src/second-edition/domain-models/allowed-fegyver.ts b/frontend/src/second-edition/domain-models/allowed-fegyver.ts index 592dd77..38f7aa7 100644 --- a/frontend/src/second-edition/domain-models/allowed-fegyver.ts +++ b/frontend/src/second-edition/domain-models/allowed-fegyver.ts @@ -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)) diff --git a/frontend/src/second-edition/domain-models/characterSlice.ts b/frontend/src/second-edition/domain-models/characterSlice.ts index 4d8425b..0ba10b0 100644 --- a/frontend/src/second-edition/domain-models/characterSlice.ts +++ b/frontend/src/second-edition/domain-models/characterSlice.ts @@ -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 diff --git a/frontend/src/second-edition/domain-models/kepzettsegek2E.ts b/frontend/src/second-edition/domain-models/kepzettsegek2E.ts index 0a4479c..912275b 100644 --- a/frontend/src/second-edition/domain-models/kepzettsegek2E.ts +++ b/frontend/src/second-edition/domain-models/kepzettsegek2E.ts @@ -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, 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) { 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 !kepzettsegekWithoutN.includes(x.Id) && !karakter.tolvajKepzettsegek?.includes(x.Id)) } } + +export function AdjustKepzettsegek(karakter: Pick): 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); + } +} \ No newline at end of file diff --git a/frontend/src/second-edition/pages/CreateCharacter2E.tsx b/frontend/src/second-edition/pages/CreateCharacter2E.tsx index 331990a..89d4f3d 100644 --- a/frontend/src/second-edition/pages/CreateCharacter2E.tsx +++ b/frontend/src/second-edition/pages/CreateCharacter2E.tsx @@ -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()(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: { ⇩}
- +