mirror of
https://github.com/morbalint/kemkas.git
synced 2026-07-17 19:03:46 +00:00
WIP varazskonyv
This commit is contained in:
@@ -14,13 +14,14 @@ See deployment repo at: [https://github.com/morbalint/kemkas-deployment](https:/
|
|||||||
|
|
||||||
## Coding readmes
|
## Coding readmes
|
||||||
|
|
||||||
For frontend only see: [Frontend README](./Kemkas.Web/frontend/README.md)
|
For frontend only see: [Frontend README](./frontend/README.md)
|
||||||
|
|
||||||
To start development, spin up the docker-compose.yaml file and use the launchSettings.json to start the backend and frontend dev servers.
|
To start development, spin up the docker-compose.yaml file and use yarn to start frontend dev server.
|
||||||
|
|
||||||
For the first time setup:
|
For the first time setup:
|
||||||
1. start the DB from the docker compose (required for the backend)
|
```shell
|
||||||
2. launch the project with the launchSettings file (will generate SSL certs)
|
dotnet dev-certs https --clean && \
|
||||||
3. spin up the proxy from docker compose (needs the SSL certs)
|
dotnet dev-certs https --format PEM --no-password -ep ~/.aspnet/https/kemkas.pem --trust
|
||||||
|
```
|
||||||
|
|
||||||
Later start the docker compose first and the project launch settings after the DB is up and running.
|
Later start the docker compose first and the project launch settings after the DB is up and running.
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ function LevelUp(props: {
|
|||||||
|
|
||||||
return <div>
|
return <div>
|
||||||
<div className='row mt-3'>
|
<div className='row mt-3'>
|
||||||
<h5 className='col align-self-center'>{szint}. Szint</h5>
|
<h4 className='col align-self-center'>{szint}. Szint</h4>
|
||||||
</div>
|
</div>
|
||||||
{osztaly !== Osztaly2E.Druida &&
|
{osztaly !== Osztaly2E.Druida &&
|
||||||
<MultiClassOsztalySelector2E
|
<MultiClassOsztalySelector2E
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ export function MasodlagosErtekekPresenter(props: MasodlagosErtekekView) {
|
|||||||
|
|
||||||
return <>
|
return <>
|
||||||
<div className='row'>
|
<div className='row'>
|
||||||
<h5 className='col align-self-center'>Másodlagos értékek</h5>
|
<h4 className='col align-self-center'>Másodlagos értékek (első szinten)</h4>
|
||||||
</div>
|
</div>
|
||||||
<div className='row'>
|
<div className='row'>
|
||||||
<div className='col-lg-6'>
|
<div className='col-lg-6'>
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ function Tulajdonsagok(props: {
|
|||||||
const tulajdonsagok = props.tulajdonsagok ?? karakter.tulajdonsagok
|
const tulajdonsagok = props.tulajdonsagok ?? karakter.tulajdonsagok
|
||||||
return <>
|
return <>
|
||||||
<div className='row'>
|
<div className='row'>
|
||||||
<h5 className='col-lg-2 col-sm-4 align-self-center'>Tulajdonságok</h5>
|
<h4 className='col-lg-2 col-sm-4 align-self-center'>Tulajdonságok</h4>
|
||||||
<div className='col-sm-2 m-2'>
|
<div className='col-sm-2 m-2'>
|
||||||
<button className='btn btn-dark' type='button' data-testid="tulajdonsag-dobas"
|
<button className='btn btn-dark' type='button' data-testid="tulajdonsag-dobas"
|
||||||
onClick={() => dispatch(rollAbilities())}>Dobás
|
onClick={() => dispatch(rollAbilities())}>Dobás
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import {Osztaly2E} from "../domain-models/osztaly2E";
|
||||||
|
import {ClassSpells, KarakterVarazslat} from "../domain-models/varazslat";
|
||||||
|
import VarazskonyvSzint from "./VarazskonyvSzint";
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
|
function Varazskonyv(props: { osztaly: Osztaly2E, varazslatok: KarakterVarazslat[] }) {
|
||||||
|
const {osztaly, varazslatok} = props;
|
||||||
|
|
||||||
|
const classSpells = ClassSpells(osztaly)
|
||||||
|
const spells = varazslatok.map(v => classSpells.find(x => x.id === v.id)).filter(x => !!x)
|
||||||
|
|
||||||
|
return <>
|
||||||
|
<div className='row my-2'>
|
||||||
|
<h4 className='col align-self-center'>{osztaly === Osztaly2E.Varazslo ? "Varázslói" : "Illúzionista"} Varázskönyv</h4>
|
||||||
|
</div>
|
||||||
|
<VarazskonyvSzint osztaly={osztaly} level={0} varazslatok={varazslatok}/>
|
||||||
|
{spells.some(v => v.szint === 0) && <VarazskonyvSzint osztaly={osztaly} level={1} varazslatok={varazslatok}/>}
|
||||||
|
{spells.some(v => v.szint === 1) && <VarazskonyvSzint osztaly={osztaly} level={2} varazslatok={varazslatok}/>}
|
||||||
|
{spells.some(v => v.szint === 2) && <VarazskonyvSzint osztaly={osztaly} level={3} varazslatok={varazslatok}/>}
|
||||||
|
{spells.some(v => v.szint === 3) && <VarazskonyvSzint osztaly={osztaly} level={4} varazslatok={varazslatok}/>}
|
||||||
|
{spells.some(v => v.szint === 4) && <VarazskonyvSzint osztaly={osztaly} level={5} varazslatok={varazslatok}/>}
|
||||||
|
</>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Varazskonyv
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
import {Osztaly2E} from "../domain-models/osztaly2E";
|
||||||
|
import {ClassSpells, KarakterVarazslat} from "../domain-models/varazslat";
|
||||||
|
import {useDispatch} from "react-redux";
|
||||||
|
import {AppDispatch} from "../../store";
|
||||||
|
import VarazslatSelector from "../display-components/VarazslatSelector";
|
||||||
|
import {addVarazslat, removeVarazslat, setVarazslat} from "../domain-models/characterSlice";
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
|
function VarazskonyvSzint(props: { osztaly: Osztaly2E, level: number, varazslatok: KarakterVarazslat[] }) {
|
||||||
|
const {level, osztaly, varazslatok} = props;
|
||||||
|
const dispatch = useDispatch.withTypes<AppDispatch>()()
|
||||||
|
|
||||||
|
const classSpells = ClassSpells(osztaly)
|
||||||
|
const leveledSpells = classSpells.filter(v => v.szint === level)
|
||||||
|
const selectedSpells = varazslatok.map(v => {
|
||||||
|
return leveledSpells.find(x => x.id === v.id)
|
||||||
|
}).filter(x => !!x)
|
||||||
|
const availableSpells = leveledSpells.filter(v => varazslatok.every(x => x.id !== v.id))
|
||||||
|
|
||||||
|
return <>
|
||||||
|
<div className='row my-2'>
|
||||||
|
<h5 className='col align-self-center'>{level}. Szintű varázslatok</h5>
|
||||||
|
</div>
|
||||||
|
{selectedSpells.map((v, i) => (
|
||||||
|
<React.Fragment key={`VarazslatSelector-${i}`}>
|
||||||
|
<div className='row m-2'>
|
||||||
|
<VarazslatSelector
|
||||||
|
selected={v.id}
|
||||||
|
available={[v, ...availableSpells]}
|
||||||
|
dataTestId={`varazskonyv_varazslo_1_${v.id}`}
|
||||||
|
onChange={(nextId) => dispatch(setVarazslat({prev: v.id, next: nextId}))}
|
||||||
|
/>
|
||||||
|
<div className="col-lg-2 col-md-3 col-sm-4">
|
||||||
|
<button
|
||||||
|
className='btn btn-outline-dark w-100'
|
||||||
|
type='button'
|
||||||
|
onClick={() => dispatch(removeVarazslat(v.id))}>Elvesz
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="row m-2">
|
||||||
|
<span>{v?.leiras}</span>
|
||||||
|
{v?.megfordithato && <u>Megfordítható{' '}</u>}
|
||||||
|
{v?.komponens && <b>Kötelező komponens: {v.komponens}{' '}</b>}
|
||||||
|
{v?.opcionalis_komponens && <i>Opcionális komponens: {v.opcionalis_komponens}{' '}</i>}
|
||||||
|
</div>
|
||||||
|
</React.Fragment>))}
|
||||||
|
{availableSpells.length > 0 && <button className='btn btn-outline-dark ms-2'
|
||||||
|
onClick={() => dispatch(addVarazslat(availableSpells[0].id))}>
|
||||||
|
Új varázslat hozzáadása
|
||||||
|
</button>}
|
||||||
|
</>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default VarazskonyvSzint
|
||||||
@@ -1,65 +1,18 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import {ClassSpells, KarakterVarazslat} from "../domain-models/varazslat";
|
|
||||||
import {getClassLevels} from "../domain-models/szintlepes";
|
import {getClassLevels} from "../domain-models/szintlepes";
|
||||||
import {useDispatch, useSelector} from "react-redux";
|
import {useSelector} from "react-redux";
|
||||||
import {AppDispatch, RootState} from "../../store";
|
import {RootState} from "../../store";
|
||||||
import {addVarazslat, characterSelector, setVarazslat} from "../domain-models/characterSlice";
|
import {characterSelector} from "../domain-models/characterSlice";
|
||||||
import {Osztaly2E} from "../domain-models/osztaly2E";
|
import {Osztaly2E} from "../domain-models/osztaly2E";
|
||||||
import VarazslatSelector from "../display-components/VarazslatSelector";
|
import Varazskonyv from "./Varazskonyv";
|
||||||
|
|
||||||
function VarazskonyvSzint(props: {osztaly: Osztaly2E, level: number, varazslatok: KarakterVarazslat[]}) {
|
|
||||||
const {level, osztaly, varazslatok} = props;
|
|
||||||
const dispatch = useDispatch.withTypes<AppDispatch>()()
|
|
||||||
|
|
||||||
const classSpells = ClassSpells(osztaly)
|
|
||||||
const leveledSpells = classSpells.filter(v => v.szint === level)
|
|
||||||
const selectedSpells = varazslatok.map(v => {
|
|
||||||
return leveledSpells.find(x => x.id === v.id)
|
|
||||||
}).filter(x => !!x)
|
|
||||||
const availableSpells = leveledSpells.filter(v => varazslatok.every(x => x.id !== v.id))
|
|
||||||
|
|
||||||
return <>
|
|
||||||
<h5>{level}. Szintű varázslatok</h5>
|
|
||||||
{selectedSpells.map((v, i) => (
|
|
||||||
<VarazslatSelector
|
|
||||||
key={`${i}VarazslatSelector`}
|
|
||||||
selected={v.id}
|
|
||||||
available={[v, ...availableSpells]}
|
|
||||||
dataTestId={`varazskonyv_varazslo_1_${v.id}`}
|
|
||||||
onChange={(nextId) => dispatch(setVarazslat({prev: v.id, next: nextId}))}
|
|
||||||
/>))}
|
|
||||||
{availableSpells.length > 0 && <button className='btn btn-outline-dark'
|
|
||||||
onClick={() => dispatch(addVarazslat(availableSpells[0].id))}>
|
|
||||||
Új varázslat hozzáadása
|
|
||||||
</button>}
|
|
||||||
</>;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function Varazskonyv(props: {osztaly: Osztaly2E, varazslatok: KarakterVarazslat[] }) {
|
|
||||||
const {osztaly, varazslatok } = props;
|
|
||||||
|
|
||||||
const classSpells = ClassSpells(osztaly)
|
|
||||||
const spells = varazslatok.map(v => classSpells.find(x => x.id === v.id)).filter(x => !!x)
|
|
||||||
|
|
||||||
return <>
|
|
||||||
<h3>Varázslói Varázskönyv</h3>
|
|
||||||
<VarazskonyvSzint osztaly={osztaly} level={0} varazslatok={varazslatok} />
|
|
||||||
{spells.some(v => v.szint === 0) && <VarazskonyvSzint osztaly={osztaly} level={1} varazslatok={varazslatok} />}
|
|
||||||
{spells.some(v => v.szint === 1) && <VarazskonyvSzint osztaly={osztaly} level={2} varazslatok={varazslatok} />}
|
|
||||||
{spells.some(v => v.szint === 2) && <VarazskonyvSzint osztaly={osztaly} level={3} varazslatok={varazslatok} />}
|
|
||||||
{spells.some(v => v.szint === 3) && <VarazskonyvSzint osztaly={osztaly} level={4} varazslatok={varazslatok} />}
|
|
||||||
{spells.some(v => v.szint === 4) && <VarazskonyvSzint osztaly={osztaly} level={5} varazslatok={varazslatok} />}
|
|
||||||
</>;
|
|
||||||
}
|
|
||||||
|
|
||||||
function Varazslatok() {
|
function Varazslatok() {
|
||||||
const karakter = useSelector.withTypes<RootState>()(characterSelector)
|
const karakter = useSelector.withTypes<RootState>()(characterSelector)
|
||||||
const classLevels = getClassLevels(karakter.szintlepesek)
|
const classLevels = getClassLevels(karakter.szintlepesek)
|
||||||
|
|
||||||
|
|
||||||
return <>
|
return <>
|
||||||
{classLevels[Osztaly2E.Varazslo] > 0 && <Varazskonyv osztaly={Osztaly2E.Varazslo} varazslatok={karakter.varazslatok} />}
|
{classLevels[Osztaly2E.Varazslo] > 0 && <Varazskonyv osztaly={Osztaly2E.Varazslo} varazslatok={karakter.varazslatok} />}
|
||||||
|
{classLevels[Osztaly2E.Illuzionista] > 0 && <Varazskonyv osztaly={Osztaly2E.Illuzionista} varazslatok={karakter.varazslatok} />}
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -96,14 +96,17 @@ export const characterSlice = createSlice({
|
|||||||
setFelszereles: (state, action: {payload: KarakterFelszereles}) => {
|
setFelszereles: (state, action: {payload: KarakterFelszereles}) => {
|
||||||
state.felszereles = action.payload;
|
state.felszereles = action.payload;
|
||||||
},
|
},
|
||||||
|
addVarazslat: (state, action: {payload: string}) => {
|
||||||
|
state.varazslatok = [...state.varazslatok, {id: action.payload, bekeszitve: false}];
|
||||||
|
},
|
||||||
setVarazslat: (state, action: {payload: {prev: string, next: string}}) => {
|
setVarazslat: (state, action: {payload: {prev: string, next: string}}) => {
|
||||||
let spell = state.varazslatok.find(x => x.id === action.payload.prev)
|
let spell = state.varazslatok.find(x => x.id === action.payload.prev)
|
||||||
if (spell !== undefined) {
|
if (spell !== undefined) {
|
||||||
spell.id = action.payload.next
|
spell.id = action.payload.next
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
addVarazslat: (state, action: {payload: string}) => {
|
removeVarazslat: (state, action: {payload: string}) => {
|
||||||
state.varazslatok = [...state.varazslatok, {id: action.payload, bekeszitve: false}];
|
state.varazslatok = [...state.varazslatok.filter(x => x.id !== action.payload)];
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -159,8 +162,9 @@ export const {
|
|||||||
setKepzettsegek,
|
setKepzettsegek,
|
||||||
setTolvajKepzettsegek,
|
setTolvajKepzettsegek,
|
||||||
setFelszereles,
|
setFelszereles,
|
||||||
setVarazslat,
|
|
||||||
addVarazslat,
|
addVarazslat,
|
||||||
|
setVarazslat,
|
||||||
|
removeVarazslat,
|
||||||
} = characterSlice.actions
|
} = characterSlice.actions
|
||||||
|
|
||||||
export const characterSelector = characterSlice.selectSlice
|
export const characterSelector = characterSlice.selectSlice
|
||||||
|
|||||||
@@ -99,14 +99,14 @@ function CreateCharacter2E(props: {
|
|||||||
<div className='p-3'>
|
<div className='p-3'>
|
||||||
<form onSubmit={async (event) => event.preventDefault()}>
|
<form onSubmit={async (event) => event.preventDefault()}>
|
||||||
<div className='row'>
|
<div className='row'>
|
||||||
<h5 className='col align-self-center'>Származás</h5>
|
<h4 className='col align-self-center'>Származás</h4>
|
||||||
</div>
|
</div>
|
||||||
<Szarmazas/>
|
<Szarmazas/>
|
||||||
<hr/>
|
<hr/>
|
||||||
<Tulajdonsagok2E/>
|
<Tulajdonsagok2E/>
|
||||||
<hr/>
|
<hr/>
|
||||||
<div className='row'>
|
<div className='row'>
|
||||||
<h5 className='col align-self-center'>Tanult</h5>
|
<h4 className='col align-self-center'>Tanult</h4>
|
||||||
</div>
|
</div>
|
||||||
<OsztalySelector2E />
|
<OsztalySelector2E />
|
||||||
{karakter.szintlepesek[0].osztaly === Osztaly2E.Harcos && <HarcosFegyverSpecializacio szint={1}/>}
|
{karakter.szintlepesek[0].osztaly === Osztaly2E.Harcos && <HarcosFegyverSpecializacio szint={1}/>}
|
||||||
|
|||||||
Reference in New Issue
Block a user