mirror of
https://github.com/morbalint/kemkas.git
synced 2026-07-18 03:13:46 +00:00
refactor to use redux WIP
just pushing to save data
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
import {createSlice} from "@reduxjs/toolkit";
|
||||
import {Faj2E, TulajdonsagokFajjal} 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 {BaseHP} from "./masodlagos_ertekek";
|
||||
|
||||
export const characterSlice = createSlice({
|
||||
name: "character2E",
|
||||
initialState: DefaultKarakter,
|
||||
reducers: {
|
||||
setNev: (state, action: { payload: string }) => {
|
||||
state.nev = action.payload;
|
||||
},
|
||||
setIsten: (state, action: { payload: string }) => {
|
||||
state.isten = action.payload;
|
||||
},
|
||||
setJellem: (state, action: { payload: JellemID }) => {
|
||||
state.jellem = action.payload;
|
||||
},
|
||||
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.kepzettsegFajError = getKepzettsegErrorForFaj(action.payload, [...state.kepzettsegek, ...(state.tolvajKepzettsegek || [])])
|
||||
},
|
||||
rollAbilities: (state) => {
|
||||
state.tulajdonsagok = RollAllAbilities()
|
||||
},
|
||||
setEro: (state, action: {payload: number}) => {
|
||||
state.tulajdonsagok.t_ero = action.payload;
|
||||
},
|
||||
setUgyesseg: (state, action: {payload: number}) => {
|
||||
state.tulajdonsagok.t_ugy = action.payload;
|
||||
},
|
||||
setEgeszseg: (state, action: {payload: number}) => {
|
||||
state.tulajdonsagok.t_egs = action.payload;
|
||||
},
|
||||
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);
|
||||
},
|
||||
setBolcsesseg: (state, action: {payload: number}) => {
|
||||
state.tulajdonsagok.t_bol = action.payload;
|
||||
},
|
||||
setKarizma: (state, action: {payload: number}) => {
|
||||
state.tulajdonsagok.t_kar = action.payload;
|
||||
},
|
||||
setLevel1Osztaly : (state, action: {payload: Osztaly2E}) => {
|
||||
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])
|
||||
}
|
||||
const osztalyok = new Set(szintlepesek.map(x => x.osztaly))
|
||||
state.kepzettsegOsztalyError = getKepzettsegErrorForOsztaly(osztalyok, state.kepzettsegek);
|
||||
},
|
||||
setCharacter: (state, action: {payload: Karakter2E}) => {
|
||||
state = action.payload
|
||||
const osztalyok = new Set(state.szintlepesek.map(x => x.osztaly))
|
||||
state.kepzettsegOsztalyError = getKepzettsegErrorForOsztaly(osztalyok, state.kepzettsegek);
|
||||
return state;
|
||||
},
|
||||
setHarcosSpecialization: (state, action: {payload: {szint: number, fegyver: string}}) => {
|
||||
const idx = action.payload.szint - 1
|
||||
const szintlepes = {
|
||||
...state.szintlepesek[idx],
|
||||
harcosFegyver: action.payload.fegyver,
|
||||
}
|
||||
state.szintlepesek = arraySetN(state.szintlepesek, idx, szintlepes)
|
||||
},
|
||||
setKepzettsegek: (state, action: {payload: KepzettsegId[]}) => {
|
||||
state.kepzettsegek = action.payload;
|
||||
state.kepzettsegFajError = getKepzettsegErrorForFaj(state.faj, [...action.payload, ...(state.tolvajKepzettsegek || [])])
|
||||
const osztalyok = new Set(state.szintlepesek.map(x => x.osztaly))
|
||||
state.kepzettsegOsztalyError = getKepzettsegErrorForOsztaly(osztalyok, action.payload);
|
||||
},
|
||||
setTolvajKepzettsegek: (state, action: {payload: KepzettsegId[]}) => {
|
||||
state.tolvajKepzettsegek = action.payload;
|
||||
state.kepzettsegFajError = getKepzettsegErrorForFaj(state.faj, [...state.kepzettsegek, ...action.payload])
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
const getKepzettsegErrorForFaj = (faj: Faj2E, kepzettsegek: KepzettsegId[]) : (string | undefined) => {
|
||||
if (faj === Faj2E.Eszaki && kepzettsegek.every(x => x !== "k_hajozas")){
|
||||
return "Szomjan haltál miután északi létedre, hajódat zátonyra futtatad a tengeren :("
|
||||
}
|
||||
if (faj === Faj2E.Nomad && kepzettsegek.every(x => x !== "k_lovaglas")){
|
||||
return "Minden nomád lovon születik!"
|
||||
}
|
||||
if (faj === Faj2E.Birodalmi && kepzettsegek.every(x =>
|
||||
x !== "k_alkimia" && x !== "k_meregkeveres" && x !== "k_okkultizmus")){
|
||||
return "Belehaltál a birodalmi intrikákba :("
|
||||
}
|
||||
if (faj === Faj2E.Torpe && kepzettsegek.every(x => x !== "k_ertekbecsles")){
|
||||
return "Törpeként a hegy mélyére sűllyedtél szégyenedben mikor átvertek egy drágakő eladásakor :("
|
||||
}
|
||||
if ((faj === Faj2E.Elf || faj === Faj2E.Felelf) && kepzettsegek.every(x => x !== "k_vadonjaras")){
|
||||
return "Eltévedtél az elf vadonban és éhen haltál :("
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const getKepzettsegErrorForOsztaly = (osztalyok: Set<Osztaly2E>, kepzettsegek: KepzettsegId[]) : (string | undefined) => {
|
||||
if (osztalyok.has(Osztaly2E.Druida) && kepzettsegek.every(x => x !== "k_vadonjaras")) {
|
||||
return "Druida létedre, eltévedtél a vadonban és éhen haltál :("
|
||||
}
|
||||
if (osztalyok.has(Osztaly2E.Vandor) && kepzettsegek.every(x => x !== "k_vadonjaras")) {
|
||||
return "Vándor létedre, eltévedtél a vadonban és éhen haltál :("
|
||||
}
|
||||
if (osztalyok.has(Osztaly2E.Dalnok) && kepzettsegek.every(x => x !== "k_eloadas")) {
|
||||
return "Az előadásodat rohadt paradicsomok zápora szakította meg, karriered csúfos véget ért :("
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
export const {
|
||||
setCharacter,
|
||||
setNev,
|
||||
setJellem,
|
||||
setFaj,
|
||||
setIsten,
|
||||
setEro,
|
||||
setUgyesseg,
|
||||
setEgeszseg,
|
||||
setIntelligencia,
|
||||
setBolcsesseg,
|
||||
setKarizma,
|
||||
rollAbilities,
|
||||
setLevel1Osztaly,
|
||||
setHarcosSpecialization,
|
||||
setKepzettsegek,
|
||||
setTolvajKepzettsegek,
|
||||
} = characterSlice.actions
|
||||
|
||||
export const characterSelector = characterSlice.selectSlice
|
||||
|
||||
export default characterSlice.reducer
|
||||
@@ -0,0 +1,50 @@
|
||||
import {Fegyver} from "./felszereles";
|
||||
|
||||
export function FegyverFlags(fegyver: Fegyver): string {
|
||||
const flags = [] as string[]
|
||||
if (fegyver.Megterheltseg) {
|
||||
flags.push("M")
|
||||
}
|
||||
if (fegyver.Harcos) {
|
||||
flags.push("H")
|
||||
}
|
||||
if (fegyver.Masfelkezes) {
|
||||
flags.push("1½K")
|
||||
}
|
||||
if (fegyver.Ketkezes) {
|
||||
if (fegyver.Type === "kozelharci") {
|
||||
flags.push("2K")
|
||||
} else {
|
||||
if (fegyver.KetkezesBonusz) {
|
||||
flags.push("2KB")
|
||||
} else {
|
||||
flags.push("2KN")
|
||||
}
|
||||
}
|
||||
}
|
||||
if (fegyver.HarciManover) {
|
||||
flags.push("+2 HM")
|
||||
}
|
||||
if (fegyver.Alakzat){
|
||||
flags.push("AL")
|
||||
}
|
||||
if (fegyver.Hosszu) {
|
||||
flags.push("HO")
|
||||
}
|
||||
if (fegyver.Kabito) {
|
||||
flags.push("KO")
|
||||
}
|
||||
if (fegyver.LovasRoham) {
|
||||
flags.push("LR")
|
||||
}
|
||||
if (fegyver.PancelToro) {
|
||||
flags.push("PT")
|
||||
}
|
||||
if (fegyver.PajzsZuzo) {
|
||||
flags.push("PZ")
|
||||
}
|
||||
if (fegyver.Rohamtoro) {
|
||||
flags.push("RT")
|
||||
}
|
||||
return flags.join(' ');
|
||||
}
|
||||
@@ -10,6 +10,7 @@ import {BaseHP} from "./masodlagos_ertekek";
|
||||
import {dAny} from "../../shared/domain-models/kockak";
|
||||
|
||||
export interface Karakter2E {
|
||||
id?: string,
|
||||
nev: string,
|
||||
nem?: string,
|
||||
kor: number,
|
||||
@@ -17,7 +18,9 @@ export interface Karakter2E {
|
||||
jellem: JellemID,
|
||||
tulajdonsagok: KarakterTulajdonsagok
|
||||
faj: Faj2E
|
||||
kepzettsegek: KepzettsegId[]
|
||||
kepzettsegek: KepzettsegId[],
|
||||
kepzettsegFajError?: string,
|
||||
kepzettsegOsztalyError?: string,
|
||||
tolvajKepzettsegek?: KepzettsegId[]
|
||||
szint: number,
|
||||
felszereles: KarakterFelszereles,
|
||||
@@ -30,7 +33,12 @@ export const DefaultKarakter: Karakter2E = {
|
||||
jellem: 'S',
|
||||
tulajdonsagok: TulajdonsagDefaults,
|
||||
faj: Faj2E.Ember,
|
||||
kepzettsegek: [],
|
||||
kepzettsegek: [
|
||||
"k_maszas",
|
||||
"k_ugras",
|
||||
"k_uszas",
|
||||
"k_osonas"
|
||||
],
|
||||
tolvajKepzettsegek: [],
|
||||
szint: 1,
|
||||
felszereles: DefaultFelszereles,
|
||||
|
||||
@@ -241,104 +241,60 @@ export function SetDefaultTolvajKepzettsegek(karakter: Pick<Karakter2E, 'szintle
|
||||
|
||||
export function GetKepzettsegListaN(karakter: Pick<Karakter2E, 'szintlepesek' | 'faj' | 'kepzettsegek' | 'tolvajKepzettsegek'>) {
|
||||
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
|
||||
const availableKepzettsegList = AvailableKezpettsegList(...osztalyok)
|
||||
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]
|
||||
}
|
||||
return (n: number): Kepzettseg[] => {
|
||||
let available = [...availableKepzettsegList]
|
||||
if (n === 0) {
|
||||
if (karakter.faj === Faj2E.Eszaki) {
|
||||
return [Kepzettsegek.k_hajozas]
|
||||
}
|
||||
if (karakter.faj === Faj2E.Nomad) {
|
||||
return [Kepzettsegek.k_lovaglas]
|
||||
}
|
||||
// TODO birodalmi tolvaj, tolvajképzettségek!
|
||||
if (karakter.faj === Faj2E.Birodalmi) {
|
||||
return [Kepzettsegek.k_alkimia, Kepzettsegek.k_meregkeveres, Kepzettsegek.k_okkultizmus]
|
||||
}
|
||||
if (karakter.faj === Faj2E.Torpe) {
|
||||
return [Kepzettsegek.k_ertekbecsles]
|
||||
}
|
||||
if (karakter.faj === Faj2E.Elf || karakter.faj === Faj2E.Felelf) {
|
||||
return [Kepzettsegek.k_vadonjaras]
|
||||
}
|
||||
if (osztalyok.has(Osztaly2E.Druida) || osztalyok.has(Osztaly2E.Vandor)) {
|
||||
return [Kepzettsegek.k_vadonjaras]
|
||||
}
|
||||
if (osztalyok.has(Osztaly2E.Dalnok)) {
|
||||
return [Kepzettsegek.k_eloadas]
|
||||
}
|
||||
}
|
||||
if (n === 1) {
|
||||
if ((osztalyok.has(Osztaly2E.Vandor) || osztalyok.has(Osztaly2E.Druida))
|
||||
&& karakter.kepzettsegek[0] !== Kepzettsegek.k_vadonjaras.Id) {
|
||||
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]
|
||||
}
|
||||
}
|
||||
// if (n === 0) {
|
||||
// if (karakter.faj === Faj2E.Eszaki) {
|
||||
// return [Kepzettsegek.k_hajozas]
|
||||
// }
|
||||
// if (karakter.faj === Faj2E.Nomad) {
|
||||
// return [Kepzettsegek.k_lovaglas]
|
||||
// }
|
||||
// // TODO birodalmi tolvaj, tolvajképzettségek!
|
||||
// if (karakter.faj === Faj2E.Birodalmi) {
|
||||
// return [Kepzettsegek.k_alkimia, Kepzettsegek.k_meregkeveres, Kepzettsegek.k_okkultizmus]
|
||||
// }
|
||||
// if (karakter.faj === Faj2E.Torpe) {
|
||||
// return [Kepzettsegek.k_ertekbecsles]
|
||||
// }
|
||||
// if (karakter.faj === Faj2E.Elf || karakter.faj === Faj2E.Felelf) {
|
||||
// return [Kepzettsegek.k_vadonjaras]
|
||||
// }
|
||||
// if (osztalyok.has(Osztaly2E.Druida) || osztalyok.has(Osztaly2E.Vandor)) {
|
||||
// return [Kepzettsegek.k_vadonjaras]
|
||||
// }
|
||||
// if (osztalyok.has(Osztaly2E.Dalnok)) {
|
||||
// return [Kepzettsegek.k_eloadas]
|
||||
// }
|
||||
// }
|
||||
// if (n === 1) {
|
||||
// if ((osztalyok.has(Osztaly2E.Vandor) || osztalyok.has(Osztaly2E.Druida))
|
||||
// && karakter.kepzettsegek[0] !== Kepzettsegek.k_vadonjaras.Id) {
|
||||
// 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)]
|
||||
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) {
|
||||
const osztalyok = karakter.szintlepesek.map(x => x.osztaly)
|
||||
const availableKepzettsegList = AvailableKezpettsegList(...osztalyok)
|
||||
const numberOfKepzettsegek = GetNumberOfKepzettsegek(karakter.tulajdonsagok.t_int, karakter.faj, availableKepzettsegList.length)
|
||||
let kepzettsegek = [...karakter.kepzettsegek]
|
||||
|
||||
let mustChangeKepzettsegek = false
|
||||
|
||||
const restrictedKepzettsegek = GetKepzettsegListaN(karakter)(0)
|
||||
if (kepzettsegek.length === 0) {
|
||||
if (restrictedKepzettsegek.length > 0) {
|
||||
kepzettsegek.push(restrictedKepzettsegek[0].Id)
|
||||
mustChangeKepzettsegek = true
|
||||
}
|
||||
} else {
|
||||
if (!restrictedKepzettsegek.includes(Kepzettsegek[kepzettsegek[0]])) {
|
||||
kepzettsegek[0] = restrictedKepzettsegek[0].Id
|
||||
mustChangeKepzettsegek = true
|
||||
}
|
||||
}
|
||||
|
||||
// // TODO: really fix this sometimes.
|
||||
// const uglyDoubleRestrictedKepzettsegek = GetKepzettsegListaN(karakter)(1)
|
||||
// if (kepzettsegek.length === 1) {
|
||||
// if (uglyDoubleRestrictedKepzettsegek.length > 0) {
|
||||
// kepzettsegek.push(uglyDoubleRestrictedKepzettsegek[0].Id)
|
||||
// mustChangeKepzettsegek = true
|
||||
// }
|
||||
// } else {
|
||||
// if (!uglyDoubleRestrictedKepzettsegek.includes(Kepzettsegek[kepzettsegek[1]])) {
|
||||
// kepzettsegek[1] = uglyDoubleRestrictedKepzettsegek[0].Id
|
||||
// mustChangeKepzettsegek = true
|
||||
// }
|
||||
// }
|
||||
|
||||
if (kepzettsegek.length < numberOfKepzettsegek) {
|
||||
for (let i = kepzettsegek.length; i < numberOfKepzettsegek; i++) {
|
||||
const kepzettsegLista = GetKepzettsegListaN({...karakter, kepzettsegek})(i)
|
||||
if (kepzettsegLista.length > 0) {
|
||||
kepzettsegek.push(kepzettsegLista[0].Id)
|
||||
}
|
||||
}
|
||||
mustChangeKepzettsegek = true
|
||||
}
|
||||
if (kepzettsegek.length > numberOfKepzettsegek){
|
||||
kepzettsegek = kepzettsegek.slice(0, numberOfKepzettsegek)
|
||||
mustChangeKepzettsegek = true
|
||||
}
|
||||
if (mustChangeKepzettsegek){
|
||||
changeKepzettsegek(kepzettsegek)
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
import {createSlice} from "@reduxjs/toolkit";
|
||||
import {RollAllAbilities, TulajdonsagDefaults} from "./tulajdonsag2E";
|
||||
|
||||
export const tulajdonsagSlice = createSlice({
|
||||
name: "tulajdonsag2E",
|
||||
initialState: TulajdonsagDefaults,
|
||||
reducers: {
|
||||
rollAbilities: (state) => {
|
||||
state = RollAllAbilities()
|
||||
return state;
|
||||
},
|
||||
setEro: (state, action: {payload: number}) => {
|
||||
state.t_ero = action.payload;
|
||||
},
|
||||
setUgyesseg: (state, action: {payload: number}) => {
|
||||
state.t_ugy = action.payload;
|
||||
},
|
||||
setEgeszseg: (state, action: {payload: number}) => {
|
||||
state.t_egs = action.payload;
|
||||
},
|
||||
setIntelligencia: (state, action: {payload: number}) => {
|
||||
state.t_int = action.payload;
|
||||
},
|
||||
setBolcsesseg: (state, action: {payload: number}) => {
|
||||
state.t_bol = action.payload;
|
||||
},
|
||||
setKarizma: (state, action: {payload: number}) => {
|
||||
state.t_kar = action.payload;
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
export const { rollAbilities, setEro, setUgyesseg, setEgeszseg, setIntelligencia, setBolcsesseg, setKarizma } = tulajdonsagSlice.actions
|
||||
|
||||
export const tulajdonsagSelector = tulajdonsagSlice.selectSlice;
|
||||
|
||||
export default tulajdonsagSlice.reducer
|
||||
Reference in New Issue
Block a user