Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c5fa7a92d9 | ||
|
|
700684ecfd | ||
|
|
43959ae94f | ||
|
|
88b0379c93 |
@@ -1,91 +0,0 @@
|
|||||||
when:
|
|
||||||
- event: [push, manual, pull_request]
|
|
||||||
branch: [main]
|
|
||||||
|
|
||||||
services:
|
|
||||||
docker:
|
|
||||||
image: docker:28-dind
|
|
||||||
privileged: true
|
|
||||||
environment:
|
|
||||||
DOCKER_TLS_CERTDIR: ""
|
|
||||||
|
|
||||||
steps:
|
|
||||||
prepare-fe-image-tags:
|
|
||||||
image: alpine:3.21
|
|
||||||
commands:
|
|
||||||
- |
|
|
||||||
COMMIT_SHA="${CI_COMMIT_SHA:-${CI_COMMIT:-${DRONE_COMMIT_SHA:-${DRONE_COMMIT:-}}}}"
|
|
||||||
if [ -n "$COMMIT_SHA" ]; then
|
|
||||||
IMAGE_TAG="$(printf '%s' "$COMMIT_SHA" | cut -c1-8)"
|
|
||||||
else
|
|
||||||
REF_NAME="${CI_COMMIT_REF:-${CI_COMMIT_BRANCH:-manual}}"
|
|
||||||
REF_NAME="${REF_NAME#refs/heads/}"
|
|
||||||
REF_NAME="$(printf '%s' "$REF_NAME" | sed 's#[^A-Za-z0-9_.-]#-#g')"
|
|
||||||
IMAGE_TAG="$(printf '%s' "${REF_NAME:-manual}-${CI_PIPELINE_NUMBER:-0}" | cut -c1-32)"
|
|
||||||
fi
|
|
||||||
echo "Using frontend image tag: $IMAGE_TAG"
|
|
||||||
printf '%s\n' "$IMAGE_TAG" > .fe-tags
|
|
||||||
printf '%s\n' "latest" >> .fe-tags
|
|
||||||
printf '%s\n' "$IMAGE_TAG" > .e2e-tags
|
|
||||||
printf '%s\n' "latest" >> .e2e-tags
|
|
||||||
|
|
||||||
build-and-push-fe-image:
|
|
||||||
image: docker.io/woodpeckerci/plugin-docker-buildx:latest
|
|
||||||
privileged: true
|
|
||||||
depends_on:
|
|
||||||
- prepare-fe-image-tags
|
|
||||||
settings:
|
|
||||||
registry: git.cluster.lab.kemkas.hu
|
|
||||||
repo: git.cluster.lab.kemkas.hu/${CI_REPO}
|
|
||||||
context: frontend
|
|
||||||
dockerfile: frontend/Dockerfile
|
|
||||||
tags_file: .fe-tags
|
|
||||||
username:
|
|
||||||
from_secret: gitea_packages_username
|
|
||||||
password:
|
|
||||||
from_secret: gitea_packages_token
|
|
||||||
|
|
||||||
build-and-push-e2e-image:
|
|
||||||
image: docker.io/woodpeckerci/plugin-docker-buildx:latest
|
|
||||||
privileged: true
|
|
||||||
depends_on:
|
|
||||||
- prepare-fe-image-tags
|
|
||||||
settings:
|
|
||||||
registry: git.cluster.lab.kemkas.hu
|
|
||||||
repo: git.cluster.lab.kemkas.hu/${CI_REPO}-e2e
|
|
||||||
context: e2e
|
|
||||||
dockerfile: e2e/Dockerfile
|
|
||||||
tags_file: .e2e-tags
|
|
||||||
username:
|
|
||||||
from_secret: gitea_packages_username
|
|
||||||
password:
|
|
||||||
from_secret: gitea_packages_token
|
|
||||||
|
|
||||||
run-e2e:
|
|
||||||
image: docker:28-cli
|
|
||||||
privileged: true
|
|
||||||
depends_on:
|
|
||||||
- build-and-push-fe-image
|
|
||||||
- build-and-push-e2e-image
|
|
||||||
environment:
|
|
||||||
DOCKER_HOST: tcp://docker:2375
|
|
||||||
DOCKER_TLS_CERTDIR: ""
|
|
||||||
GITEA_PACKAGES_USERNAME:
|
|
||||||
from_secret: gitea_packages_username
|
|
||||||
GITEA_PACKAGES_TOKEN:
|
|
||||||
from_secret: gitea_packages_token
|
|
||||||
GHCR_IO_REGISTRY_USERNAME:
|
|
||||||
from_secret: ghcr_io_registry_username
|
|
||||||
GHCR_IO_REGISTRY_TOKEN:
|
|
||||||
from_secret: ghcr_io_registry_token
|
|
||||||
commands:
|
|
||||||
- |
|
|
||||||
IMAGE_TAG="$(head -n1 .fe-tags)"
|
|
||||||
export FRONTEND_IMAGE="git.cluster.lab.kemkas.hu/${CI_REPO}:$${IMAGE_TAG}"
|
|
||||||
export E2E_IMAGE="git.cluster.lab.kemkas.hu/${CI_REPO}-e2e:$${IMAGE_TAG}"
|
|
||||||
echo "Using image tag: $${IMAGE_TAG}"
|
|
||||||
printf '%s' "$${GITEA_PACKAGES_TOKEN}" | docker login git.cluster.lab.kemkas.hu -u "$${GITEA_PACKAGES_USERNAME}" --password-stdin
|
|
||||||
printf '%s' "$${GHCR_IO_REGISTRY_TOKEN}" | docker login ghcr.io -u "$${GHCR_IO_REGISTRY_USERNAME}" --password-stdin
|
|
||||||
trap 'docker compose -f e2e.docker-compose.yaml down -v --remove-orphans' EXIT
|
|
||||||
docker compose -f e2e.docker-compose.yaml pull
|
|
||||||
docker compose -f e2e.docker-compose.yaml up --no-build --abort-on-container-exit --exit-code-from e2e e2e
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
when:
|
|
||||||
- event: [push, pull_request, manual]
|
|
||||||
branch: [main]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
unit-test-and-lint:
|
|
||||||
image: node:24
|
|
||||||
commands:
|
|
||||||
- corepack enable
|
|
||||||
- corepack prepare yarn@1.22.22 --activate
|
|
||||||
- cd frontend
|
|
||||||
- yarn install --frozen-lockfile
|
|
||||||
- yarn run test
|
|
||||||
- yarn run lint
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
import {render} from "@testing-library/react";
|
|
||||||
import {configureStore} from "@reduxjs/toolkit";
|
|
||||||
import {Provider} from "react-redux";
|
|
||||||
import KarakterKepzettsegek from "./Kepzettsegek2E";
|
|
||||||
import userReducer from "../../shared/domain-models/userSlice";
|
|
||||||
import characterReducer, {setCharacter} from "../domain-models/characterSlice";
|
|
||||||
import {DefaultKarakter, Karakter2E} from "../domain-models/karakter2E";
|
|
||||||
import {Osztaly2E} from "../domain-models/osztaly2E";
|
|
||||||
import {Tulajdonsag2E} from "../domain-models/tulajdonsag2E";
|
|
||||||
|
|
||||||
function createStore() {
|
|
||||||
return configureStore({
|
|
||||||
reducer: {
|
|
||||||
user: userReducer,
|
|
||||||
character2E: characterReducer,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
describe("KarakterKepzettsegek", () => {
|
|
||||||
it("shows one more kepzettseg selector when INT modifier increases from level-up", () => {
|
|
||||||
const karakter: Karakter2E = {
|
|
||||||
...DefaultKarakter,
|
|
||||||
szint: 4,
|
|
||||||
tulajdonsagok: {
|
|
||||||
...DefaultKarakter.tulajdonsagok,
|
|
||||||
t_int: 17,
|
|
||||||
},
|
|
||||||
szintlepesek: [
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 10 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 7 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 6 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 8, tulajdonsagNoveles: Tulajdonsag2E.Intelligencia },
|
|
||||||
],
|
|
||||||
tolvajKepzettsegek: [],
|
|
||||||
varazslatok: [],
|
|
||||||
};
|
|
||||||
|
|
||||||
const store = createStore();
|
|
||||||
store.dispatch(setCharacter(karakter));
|
|
||||||
|
|
||||||
const sut = render(
|
|
||||||
<Provider store={store}>
|
|
||||||
<KarakterKepzettsegek />
|
|
||||||
</Provider>
|
|
||||||
);
|
|
||||||
|
|
||||||
const selectors = sut.container.querySelectorAll('[data-testid^="kepzettseg-"]');
|
|
||||||
expect(selectors).toHaveLength(7);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("shows one more kepzettseg selector when INT modifier increases at level 8", () => {
|
|
||||||
const karakter: Karakter2E = {
|
|
||||||
...DefaultKarakter,
|
|
||||||
szint: 8,
|
|
||||||
tulajdonsagok: {
|
|
||||||
...DefaultKarakter.tulajdonsagok,
|
|
||||||
t_int: 14,
|
|
||||||
},
|
|
||||||
szintlepesek: [
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 10 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 7 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 6 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 8, tulajdonsagNoveles: Tulajdonsag2E.Ero },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 4 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 9 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 5 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 6, tulajdonsagNoveles: Tulajdonsag2E.Intelligencia },
|
|
||||||
],
|
|
||||||
tolvajKepzettsegek: [],
|
|
||||||
varazslatok: [],
|
|
||||||
};
|
|
||||||
|
|
||||||
const store = createStore();
|
|
||||||
store.dispatch(setCharacter(karakter));
|
|
||||||
|
|
||||||
const sut = render(
|
|
||||||
<Provider store={store}>
|
|
||||||
<KarakterKepzettsegek />
|
|
||||||
</Provider>
|
|
||||||
);
|
|
||||||
|
|
||||||
const selectors = sut.container.querySelectorAll('[data-testid^="kepzettseg-"]');
|
|
||||||
expect(selectors).toHaveLength(6);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("shows one more kepzettseg selector when INT modifier increases at level 12", () => {
|
|
||||||
const karakter: Karakter2E = {
|
|
||||||
...DefaultKarakter,
|
|
||||||
szint: 12,
|
|
||||||
tulajdonsagok: {
|
|
||||||
...DefaultKarakter.tulajdonsagok,
|
|
||||||
t_int: 17,
|
|
||||||
},
|
|
||||||
szintlepesek: [
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 10 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 7 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 6 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 8, tulajdonsagNoveles: Tulajdonsag2E.Ero },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 4 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 9 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 5 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 6, tulajdonsagNoveles: Tulajdonsag2E.Egeszseg },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 3 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 7 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 5 },
|
|
||||||
{ osztaly: Osztaly2E.Harcos, HProll: 4, tulajdonsagNoveles: Tulajdonsag2E.Intelligencia },
|
|
||||||
],
|
|
||||||
tolvajKepzettsegek: [],
|
|
||||||
varazslatok: [],
|
|
||||||
};
|
|
||||||
|
|
||||||
const store = createStore();
|
|
||||||
store.dispatch(setCharacter(karakter));
|
|
||||||
|
|
||||||
const sut = render(
|
|
||||||
<Provider store={store}>
|
|
||||||
<KarakterKepzettsegek />
|
|
||||||
</Provider>
|
|
||||||
);
|
|
||||||
|
|
||||||
const selectors = sut.container.querySelectorAll('[data-testid^="kepzettseg-"]');
|
|
||||||
expect(selectors).toHaveLength(7);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -13,7 +13,7 @@ import {arraySetN} from "../../util";
|
|||||||
import {useDispatch, useSelector} from "react-redux";
|
import {useDispatch, useSelector} from "react-redux";
|
||||||
import {AppDispatch, RootState} from "../../store";
|
import {AppDispatch, RootState} from "../../store";
|
||||||
import {characterSelector, setKepzettsegek, setTolvajKepzettsegek} from "../domain-models/characterSlice";
|
import {characterSelector, setKepzettsegek, setTolvajKepzettsegek} from "../domain-models/characterSlice";
|
||||||
import {TulajdonsagokTotal} from "../domain-models/tulajdonsag2E";
|
import {TulajdonsagokFajjal} from "../domain-models/faj2E";
|
||||||
|
|
||||||
function InternalKepzettsegekSelector(props: {
|
function InternalKepzettsegekSelector(props: {
|
||||||
title: string,
|
title: string,
|
||||||
@@ -70,8 +70,8 @@ function KarakterKepzettsegek () {
|
|||||||
const karakter = useSelector.withTypes<RootState>()(characterSelector);
|
const karakter = useSelector.withTypes<RootState>()(characterSelector);
|
||||||
const dispatch = useDispatch.withTypes<AppDispatch>()();
|
const dispatch = useDispatch.withTypes<AppDispatch>()();
|
||||||
|
|
||||||
const tulajdonsagokTotal = TulajdonsagokTotal(karakter)
|
const tulajdonsagokFajjal = TulajdonsagokFajjal(karakter.tulajdonsagok, karakter.faj)
|
||||||
const numberOfKepzettsegek = GetNumberOfKepzettsegek(tulajdonsagokTotal.t_int, karakter.faj)
|
const numberOfKepzettsegek = GetNumberOfKepzettsegek(tulajdonsagokFajjal.t_int, karakter.faj)
|
||||||
const kepzettsegek = karakter.kepzettsegek
|
const kepzettsegek = karakter.kepzettsegek
|
||||||
const fajError = karakter.kepzettsegFajError
|
const fajError = karakter.kepzettsegFajError
|
||||||
const osztalyError = karakter.kepzettsegOsztalyError
|
const osztalyError = karakter.kepzettsegOsztalyError
|
||||||
|
|||||||
@@ -13,8 +13,7 @@ function availableKezpettsegListFajjal(faj: Faj2E, ...osztalyok: Osztaly2E[]): K
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function GetNumberOfKepzettsegek(t_int: number, faj: Faj2E, max: number = 11) {
|
export function GetNumberOfKepzettsegek(t_int: number, faj: Faj2E, max: number = 11) {
|
||||||
// Default cap is 11. Base calculation is 3 + 1 (human) + 3 (max ability modifier) = 7;
|
//max = 3 + 1 + 3 + 5 = 12 // 3 base, 1 human, 3 from max ability modifier, 4 from Thief +1 at 9th level
|
||||||
// thief-specific extra selections are handled elsewhere and are not part of this default max.
|
|
||||||
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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user