mirror of
https://github.com/morbalint/kemkas.git
synced 2026-07-18 03:13:46 +00:00
WIP 2e
so far: faj2E, osztaly2E, kepzettsegek2E (with some bugs)
This commit is contained in:
@@ -9,6 +9,7 @@ import Header from "./shared/Header";
|
|||||||
import Footer from "./shared/Footer";
|
import Footer from "./shared/Footer";
|
||||||
import {useState} from "react";
|
import {useState} from "react";
|
||||||
import {UserContext, userDefaults} from './shared/contexts/UserContext';
|
import {UserContext, userDefaults} from './shared/contexts/UserContext';
|
||||||
|
import CreateCharacter2E from "./second-edition/pages/CreateCharacter2E";
|
||||||
|
|
||||||
function App(props: {faro?: Faro}) {
|
function App(props: {faro?: Faro}) {
|
||||||
const router = createBrowserRouter([
|
const router = createBrowserRouter([
|
||||||
@@ -17,6 +18,17 @@ function App(props: {faro?: Faro}) {
|
|||||||
element: <CreateCharacter faro={props.faro} />,
|
element: <CreateCharacter faro={props.faro} />,
|
||||||
ErrorBoundary: ErrorBoundary,
|
ErrorBoundary: ErrorBoundary,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "/2e",
|
||||||
|
element: <CreateCharacter2E />,
|
||||||
|
ErrorBoundary: ErrorBoundary,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "/2e/:id",
|
||||||
|
element: <CreateCharacter faro={props.faro}/>,
|
||||||
|
loader: args => fetch(`api/Character/${args.params.id}`),
|
||||||
|
ErrorBoundary: ErrorBoundary,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: "/karaktereim",
|
path: "/karaktereim",
|
||||||
element: <CharacterList />,
|
element: <CharacterList />,
|
||||||
@@ -28,7 +40,7 @@ function App(props: {faro?: Faro}) {
|
|||||||
element: <CreateCharacter faro={props.faro}/>,
|
element: <CreateCharacter faro={props.faro}/>,
|
||||||
loader: args => fetch(`api/Character/${args.params.id}`),
|
loader: args => fetch(`api/Character/${args.params.id}`),
|
||||||
ErrorBoundary: ErrorBoundary,
|
ErrorBoundary: ErrorBoundary,
|
||||||
}
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const [fetchedUser, setFetchedUser] = useState(userDefaults)
|
const [fetchedUser, setFetchedUser] = useState(userDefaults)
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// TODO: move to shared!
|
||||||
export function SignedNumberToText(val: number) : string {
|
export function SignedNumberToText(val: number) : string {
|
||||||
return val === 0 ? " 0" : (val > 0 ? '+'+val : val.toString())
|
return val === 0 ? " 0" : (val > 0 ? '+'+val : val.toString())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,10 +3,9 @@ import {
|
|||||||
KarakterTulajdonsagok,
|
KarakterTulajdonsagok,
|
||||||
RollAllAbilities,
|
RollAllAbilities,
|
||||||
Tulajdonsag,
|
Tulajdonsag,
|
||||||
TulajdonsagModositokFajokra
|
|
||||||
} from "../domain-models/tulajdonsag";
|
} from "../domain-models/tulajdonsag";
|
||||||
import TulajdonsagInput from "./TulajdonsagInput";
|
import TulajdonsagInput from "./TulajdonsagInput";
|
||||||
import {Faj} from "../domain-models/faj";
|
import {Faj, TulajdonsagModositokFajokra} from "../domain-models/faj";
|
||||||
|
|
||||||
function Tulajdonsagok(props: {
|
function Tulajdonsagok(props: {
|
||||||
currentFaj: Faj,
|
currentFaj: Faj,
|
||||||
|
|||||||
@@ -1,10 +1,5 @@
|
|||||||
import {
|
|
||||||
KarakterTulajdonsagok,
|
|
||||||
Tulajdonsag,
|
|
||||||
TulajdonsagModositokFajokra,
|
|
||||||
} from "./tulajdonsag";
|
|
||||||
import {Osztaly} from "./osztaly";
|
import {Osztaly} from "./osztaly";
|
||||||
|
import {KarakterTulajdonsagok, Tulajdonsag} from "./tulajdonsag";
|
||||||
|
|
||||||
export enum Faj {
|
export enum Faj {
|
||||||
Ember = 'f_ember',
|
Ember = 'f_ember',
|
||||||
@@ -141,6 +136,77 @@ export function GetFajDetails(faj: Faj): FajDetails {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// noinspection OverlyComplexFunctionJS,FunctionTooLongJS
|
||||||
|
function tulajdonsagModositokPerFaj(tul: Tulajdonsag, faj: Faj) : number {
|
||||||
|
switch (faj) {
|
||||||
|
case Faj.Birodalmi: switch (tul) {
|
||||||
|
case Tulajdonsag.Egeszseg: return -1;
|
||||||
|
case Tulajdonsag.Intelligencia: return +1;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
case Faj.Eszaki: switch (tul) {
|
||||||
|
case Tulajdonsag.Ero: return +1;
|
||||||
|
case Tulajdonsag.Bolcsesseg: return -1;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
case Faj.Etuniai: switch (tul) {
|
||||||
|
case Tulajdonsag.Egeszseg: return +1;
|
||||||
|
case Tulajdonsag.Bolcsesseg: return -1;
|
||||||
|
default: return 0
|
||||||
|
}
|
||||||
|
case Faj.Osember: switch (tul) {
|
||||||
|
case Tulajdonsag.Ero: return +1;
|
||||||
|
case Tulajdonsag.Egeszseg: return +1;
|
||||||
|
case Tulajdonsag.Intelligencia: return -1;
|
||||||
|
case Tulajdonsag.Bolcsesseg: return -1;
|
||||||
|
default: return 0
|
||||||
|
}
|
||||||
|
case Faj.Elf: switch (tul) {
|
||||||
|
case Tulajdonsag.Egeszseg: return -1;
|
||||||
|
case Tulajdonsag.Ugyesseg: return +1;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
case Faj.Felork: switch (tul) {
|
||||||
|
case Tulajdonsag.Ero: return +1;
|
||||||
|
case Tulajdonsag.Egeszseg: return +1;
|
||||||
|
case Tulajdonsag.Karizma: return -2;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
case Faj.Felszerzet: switch (tul) {
|
||||||
|
case Tulajdonsag.Ero: return -1;
|
||||||
|
case Tulajdonsag.Ugyesseg: return +1;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
case Faj.Gnom: switch (tul) {
|
||||||
|
case Tulajdonsag.Ero: return -1;
|
||||||
|
case Tulajdonsag.Intelligencia: return +1;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
case Faj.Torpe: switch (tul) {
|
||||||
|
case Tulajdonsag.Egeszseg: return +1;
|
||||||
|
case Tulajdonsag.Karizma: return -1;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function TulajdonsagModositokFajokra(tul: Tulajdonsag) {
|
||||||
|
return (faj: Faj) => tulajdonsagModositokPerFaj(tul, faj);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function TulajdonsagokFajjal(tulajdonsagok: KarakterTulajdonsagok, faj: Faj): KarakterTulajdonsagok {
|
||||||
|
return {
|
||||||
|
[Tulajdonsag.Ero]: tulajdonsagok.t_ero + tulajdonsagModositokPerFaj(Tulajdonsag.Ero, faj),
|
||||||
|
[Tulajdonsag.Ugyesseg]: tulajdonsagok.t_ugy + tulajdonsagModositokPerFaj(Tulajdonsag.Ugyesseg, faj),
|
||||||
|
[Tulajdonsag.Egeszseg]: tulajdonsagok.t_egs + tulajdonsagModositokPerFaj(Tulajdonsag.Egeszseg, faj),
|
||||||
|
[Tulajdonsag.Intelligencia]: tulajdonsagok.t_int + tulajdonsagModositokPerFaj(Tulajdonsag.Intelligencia, faj),
|
||||||
|
[Tulajdonsag.Bolcsesseg]: tulajdonsagok.t_bol + tulajdonsagModositokPerFaj(Tulajdonsag.Bolcsesseg, faj),
|
||||||
|
[Tulajdonsag.Karizma]: tulajdonsagok.t_kar + tulajdonsagModositokPerFaj(Tulajdonsag.Karizma, faj),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function fajiTulajdonsagModositok(faj: Faj): KarakterTulajdonsagok {
|
function fajiTulajdonsagModositok(faj: Faj): KarakterTulajdonsagok {
|
||||||
return {
|
return {
|
||||||
[Tulajdonsag.Ero]: TulajdonsagModositokFajokra(Tulajdonsag.Ero)(faj),
|
[Tulajdonsag.Ero]: TulajdonsagModositokFajokra(Tulajdonsag.Ero)(faj),
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import {Faj} from "./faj";
|
import {Faj} from "./faj";
|
||||||
import {Osztaly} from "./osztaly";
|
import {Osztaly} from "./osztaly";
|
||||||
import {KarakterTulajdonsagok, Tulajdonsag, TulajdonsagDefaults} from "./tulajdonsag";
|
|
||||||
import {KepzettsegId} from "./kepzettsegek";
|
import {KepzettsegId} from "./kepzettsegek";
|
||||||
import {JellemID} from "./jellem";
|
import {JellemID} from "./jellem";
|
||||||
import { DefaultFelszereles, KarakterFelszereles } from './felszereles'
|
import { DefaultFelszereles, KarakterFelszereles } from './felszereles'
|
||||||
|
import {KarakterTulajdonsagok, Tulajdonsag, TulajdonsagDefaults} from "./tulajdonsag";
|
||||||
|
|
||||||
export interface KarakterInputs {
|
export interface KarakterInputs {
|
||||||
name: string,
|
name: string,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import {Modifier, Tulajdonsag} from "./tulajdonsag";
|
|
||||||
import {Osztaly} from "./osztaly";
|
import {Osztaly} from "./osztaly";
|
||||||
import {Faj} from "./faj";
|
import {Faj} from "./faj";
|
||||||
import {KarakterInputs} from "./karakter";
|
import {KarakterInputs} from "./karakter";
|
||||||
|
import {Modifier, Tulajdonsag} from "./tulajdonsag";
|
||||||
|
|
||||||
export type KepzettsegId = 'k_alkimia' | 'k_alcazas' | 'k_allatidomitas' | 'k_csapdak' | 'k_csillagjoslas' | 'k_egyensulyozas' | 'k_eloadas' | 'k_ertekbecsles' | 'k_gyogyitas' | 'k_hajozas' | 'k_hallgatozas' | 'k_hamisitas' | 'k_jelek_olvasasa' | 'k_koncentracio' | 'k_lovaglas' | 'k_maszas' | 'k_megfigyeles' | 'k_meregkeveres' | 'k_mesterseg' | 'k_nyomkereses' | 'k_osonas' | 'k_rejtozes' | 'k_szabadulomuveszet' | 'k_tudas' | 'k_ugras' | 'k_uszas' | 'k_varazslatismeret' | 'k_zarnyitas' | 'k_zsebmetszes'
|
export type KepzettsegId = 'k_alkimia' | 'k_alcazas' | 'k_allatidomitas' | 'k_csapdak' | 'k_csillagjoslas' | 'k_egyensulyozas' | 'k_eloadas' | 'k_ertekbecsles' | 'k_gyogyitas' | 'k_hajozas' | 'k_hallgatozas' | 'k_hamisitas' | 'k_jelek_olvasasa' | 'k_koncentracio' | 'k_lovaglas' | 'k_maszas' | 'k_megfigyeles' | 'k_meregkeveres' | 'k_mesterseg' | 'k_nyomkereses' | 'k_osonas' | 'k_rejtozes' | 'k_szabadulomuveszet' | 'k_tudas' | 'k_ugras' | 'k_uszas' | 'k_varazslatismeret' | 'k_zarnyitas' | 'k_zsebmetszes'
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
import {BaseHP} from "./masodlagos_ertekek";
|
import {BaseHP} from "./masodlagos_ertekek";
|
||||||
import {dAny} from "./kockak";
|
|
||||||
import {TulajdonsagIDs, TulajdonsagokTotal} from "./tulajdonsag";
|
|
||||||
import {KarakterInputs} from "./karakter";
|
import {KarakterInputs} from "./karakter";
|
||||||
import {GetFajDetails} from "./faj";
|
import {GetFajDetails} from "./faj";
|
||||||
import {Osztaly} from "./osztaly";
|
import {Osztaly} from "./osztaly";
|
||||||
import fegyverek from "./fegyver.json"
|
import fegyverek from "./fegyver.json"
|
||||||
import {AllowedFegyver} from "./allowed-fegyver";
|
import {AllowedFegyver} from "./allowed-fegyver";
|
||||||
|
import {TulajdonsagokTotal} from "./tulajdonsag";
|
||||||
|
import {dAny} from "../../shared/domain-models/kockak";
|
||||||
|
import {TulajdonsagIDs} from "./tulajdonsag";
|
||||||
|
|
||||||
export function PickableSpecializationFilter(existingSpecilizations: string[], szint: number) {
|
export function PickableSpecializationFilter(existingSpecilizations: string[], szint: number) {
|
||||||
return (fegyver: {Id: string}) => existingSpecilizations.filter(x => x === fegyver.Id).length < (szint < 9 ? 1 : 2)
|
return (fegyver: {Id: string}) => existingSpecilizations.filter(x => x === fegyver.Id).length < (szint < 9 ? 1 : 2)
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import {Mentok, MentokTotal} from "./mentok";
|
import {Mentok, MentokTotal} from "./mentok";
|
||||||
import {Osztaly} from "./osztaly";
|
import {Osztaly} from "./osztaly";
|
||||||
import {KarakterInputs} from "./karakter";
|
import {KarakterInputs} from "./karakter";
|
||||||
import {Modifier} from "./tulajdonsag";
|
|
||||||
import {CelzoTB, KozelharciTB} from "./tamadas_bonusz";
|
import {CelzoTB, KozelharciTB} from "./tamadas_bonusz";
|
||||||
import {Faj} from "./faj";
|
import {Faj} from "./faj";
|
||||||
import { GetPajzs, GetPancel, MaxAbilityVO } from "./felszereles";
|
import { GetPajzs, GetPancel, MaxAbilityVO } from "./felszereles";
|
||||||
|
import {Modifier} from "./tulajdonsag";
|
||||||
|
|
||||||
export interface MasodlagosErtekekView {
|
export interface MasodlagosErtekekView {
|
||||||
HP: number
|
HP: number
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import {Osztaly} from "./osztaly";
|
import {Osztaly} from "./osztaly";
|
||||||
import {KarakterTulajdonsagok, TulajdonsagModosito} from "./tulajdonsag";
|
|
||||||
import {KarakterInputs} from "./karakter";
|
import {KarakterInputs} from "./karakter";
|
||||||
|
import {KarakterTulajdonsagok, TulajdonsagModosito} from "./tulajdonsag";
|
||||||
|
|
||||||
export interface Mentok {
|
export interface Mentok {
|
||||||
kitartas: number
|
kitartas: number
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import {Osztaly} from "./osztaly";
|
import {Osztaly} from "./osztaly";
|
||||||
import TamadasBonuszTabla from "./tamadas_bonus_tabla.json";
|
import TamadasBonuszTabla from "./tamadas_bonus_tabla.json";
|
||||||
import {Modifier} from "./tulajdonsag";
|
|
||||||
import {KarakterInputs} from "./karakter";
|
import {KarakterInputs} from "./karakter";
|
||||||
|
import {Modifier} from "./tulajdonsag";
|
||||||
|
|
||||||
export function TamadasBonusz(osztaly: Osztaly, szint: number = 1) : number[] {
|
export function TamadasBonusz(osztaly: Osztaly, szint: number = 1) : number[] {
|
||||||
let base = []
|
let base = []
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import {d6} from "./kockak";
|
import {TulajdonsagokFajjal} from "./faj";
|
||||||
import {Faj} from "./faj";
|
|
||||||
import {KarakterInputs} from "./karakter";
|
import {KarakterInputs} from "./karakter";
|
||||||
|
|
||||||
|
import {d6} from "../../shared/domain-models/kockak";
|
||||||
|
|
||||||
export enum Tulajdonsag {
|
export enum Tulajdonsag {
|
||||||
Ero = 't_ero',
|
Ero = 't_ero',
|
||||||
Ugyesseg = 't_ugy',
|
Ugyesseg = 't_ugy',
|
||||||
@@ -77,80 +78,10 @@ export function TulajdonsagModosito(tulajdonsagok: KarakterTulajdonsagok): Karak
|
|||||||
return response
|
return response
|
||||||
}
|
}
|
||||||
|
|
||||||
// noinspection OverlyComplexFunctionJS,FunctionTooLongJS
|
|
||||||
function tulajdonsagModositokPerFaj(tul: Tulajdonsag, faj: Faj) : number {
|
|
||||||
switch (faj) {
|
|
||||||
case Faj.Birodalmi: switch (tul) {
|
|
||||||
case Tulajdonsag.Egeszseg: return -1;
|
|
||||||
case Tulajdonsag.Intelligencia: return +1;
|
|
||||||
default: return 0;
|
|
||||||
}
|
|
||||||
case Faj.Eszaki: switch (tul) {
|
|
||||||
case Tulajdonsag.Ero: return +1;
|
|
||||||
case Tulajdonsag.Bolcsesseg: return -1;
|
|
||||||
default: return 0;
|
|
||||||
}
|
|
||||||
case Faj.Etuniai: switch (tul) {
|
|
||||||
case Tulajdonsag.Egeszseg: return +1;
|
|
||||||
case Tulajdonsag.Bolcsesseg: return -1;
|
|
||||||
default: return 0
|
|
||||||
}
|
|
||||||
case Faj.Osember: switch (tul) {
|
|
||||||
case Tulajdonsag.Ero: return +1;
|
|
||||||
case Tulajdonsag.Egeszseg: return +1;
|
|
||||||
case Tulajdonsag.Intelligencia: return -1;
|
|
||||||
case Tulajdonsag.Bolcsesseg: return -1;
|
|
||||||
default: return 0
|
|
||||||
}
|
|
||||||
case Faj.Elf: switch (tul) {
|
|
||||||
case Tulajdonsag.Egeszseg: return -1;
|
|
||||||
case Tulajdonsag.Ugyesseg: return +1;
|
|
||||||
default: return 0;
|
|
||||||
}
|
|
||||||
case Faj.Felork: switch (tul) {
|
|
||||||
case Tulajdonsag.Ero: return +1;
|
|
||||||
case Tulajdonsag.Egeszseg: return +1;
|
|
||||||
case Tulajdonsag.Karizma: return -2;
|
|
||||||
default: return 0;
|
|
||||||
}
|
|
||||||
case Faj.Felszerzet: switch (tul) {
|
|
||||||
case Tulajdonsag.Ero: return -1;
|
|
||||||
case Tulajdonsag.Ugyesseg: return +1;
|
|
||||||
default: return 0;
|
|
||||||
}
|
|
||||||
case Faj.Gnom: switch (tul) {
|
|
||||||
case Tulajdonsag.Ero: return -1;
|
|
||||||
case Tulajdonsag.Intelligencia: return +1;
|
|
||||||
default: return 0;
|
|
||||||
}
|
|
||||||
case Faj.Torpe: switch (tul) {
|
|
||||||
case Tulajdonsag.Egeszseg: return +1;
|
|
||||||
case Tulajdonsag.Karizma: return -1;
|
|
||||||
default: return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
default: return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function TulajdonsagModositokFajokra(tul: Tulajdonsag) {
|
|
||||||
return (faj: Faj) => tulajdonsagModositokPerFaj(tul, faj);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function TulajdonsagokFajjal(tulajdonsagok: KarakterTulajdonsagok, faj: Faj): KarakterTulajdonsagok {
|
|
||||||
return {
|
|
||||||
[Tulajdonsag.Ero]: tulajdonsagok.t_ero + tulajdonsagModositokPerFaj(Tulajdonsag.Ero, faj),
|
|
||||||
[Tulajdonsag.Ugyesseg]: tulajdonsagok.t_ugy + tulajdonsagModositokPerFaj(Tulajdonsag.Ugyesseg, faj),
|
|
||||||
[Tulajdonsag.Egeszseg]: tulajdonsagok.t_egs + tulajdonsagModositokPerFaj(Tulajdonsag.Egeszseg, faj),
|
|
||||||
[Tulajdonsag.Intelligencia]: tulajdonsagok.t_int + tulajdonsagModositokPerFaj(Tulajdonsag.Intelligencia, faj),
|
|
||||||
[Tulajdonsag.Bolcsesseg]: tulajdonsagok.t_bol + tulajdonsagModositokPerFaj(Tulajdonsag.Bolcsesseg, faj),
|
|
||||||
[Tulajdonsag.Karizma]: tulajdonsagok.t_kar + tulajdonsagModositokPerFaj(Tulajdonsag.Karizma, faj),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function TulajdonsagokTotal(karakter: Pick<KarakterInputs, 'tulajdonsagok' | 'faj' | 'tulajdonsagNovelesek'>): KarakterTulajdonsagok {
|
export function TulajdonsagokTotal(karakter: Pick<KarakterInputs, 'tulajdonsagok' | 'faj' | 'tulajdonsagNovelesek'>): KarakterTulajdonsagok {
|
||||||
const response = TulajdonsagokFajjal(karakter.tulajdonsagok, karakter.faj)
|
const response = TulajdonsagokFajjal(karakter.tulajdonsagok, karakter.faj)
|
||||||
for (const tulajdonsag of karakter.tulajdonsagNovelesek) {
|
for (const tulajdonsag of karakter.tulajdonsagNovelesek) {
|
||||||
|
// @ts-ignore // Trust me bro!
|
||||||
response[tulajdonsag] += 1
|
response[tulajdonsag] += 1
|
||||||
}
|
}
|
||||||
return response
|
return response
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
import React, {useContext, useState} from 'react';
|
import React, {useContext, useState} from 'react';
|
||||||
import './CreateCharacter.css'
|
import './CreateCharacter.css'
|
||||||
import {Faj} from "../domain-models/faj";
|
import {Faj, TulajdonsagokFajjal} from "../domain-models/faj";
|
||||||
import {Osztaly, SetFelszerelesForChangedOsztaly} from "../domain-models/osztaly"
|
import {Osztaly, SetFelszerelesForChangedOsztaly} from "../domain-models/osztaly"
|
||||||
import FajSelector from "../components/FajSelector";
|
import FajSelector from "../components/FajSelector";
|
||||||
import Tulajdonsagok from "../components/Tulajdonsagok";
|
import Tulajdonsagok from "../components/Tulajdonsagok";
|
||||||
import OsztalySelector from "../components/OsztalySelector";
|
import OsztalySelector from "../components/OsztalySelector";
|
||||||
import KarakterKepzettsegek from "../components/KarakterKepzettsegek";
|
import KarakterKepzettsegek from "../components/KarakterKepzettsegek";
|
||||||
import {KarakterTulajdonsagok, TulajdonsagokFajjal} from "../domain-models/tulajdonsag";
|
|
||||||
import MasodlagosErtekek from "../components/MasodlagosErtekek";
|
import MasodlagosErtekek from "../components/MasodlagosErtekek";
|
||||||
import {
|
import {
|
||||||
AvailableKezpettsegList,
|
AvailableKezpettsegList,
|
||||||
@@ -32,6 +31,7 @@ import {StoreNewCharacter, UpdateCharacter} from "../api/character.api";
|
|||||||
import {useLoaderData, useParams} from "react-router-dom";
|
import {useLoaderData, useParams} from "react-router-dom";
|
||||||
import saveOverlayTooltip from "../components/SaveOverlayTooltip";
|
import saveOverlayTooltip from "../components/SaveOverlayTooltip";
|
||||||
import {UserContext} from "../../shared/contexts/UserContext";
|
import {UserContext} from "../../shared/contexts/UserContext";
|
||||||
|
import {KarakterTulajdonsagok} from "../domain-models/tulajdonsag";
|
||||||
|
|
||||||
function CreateCharacterPage(props: {
|
function CreateCharacterPage(props: {
|
||||||
faro?: Faro,
|
faro?: Faro,
|
||||||
@@ -94,7 +94,7 @@ function CreateCharacterPage(props: {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div className='container-fluid p-5 bg-black text-white text-center'>
|
<div className='container-fluid p-5 bg-black text-white text-center'>
|
||||||
<h1>Karakter {initialKarakterInputs ? "szerkesztése" : "létrehozása"}</h1>
|
<h1>Karakter {!!id ? "szerkesztése" : "létrehozása"}</h1>
|
||||||
</div>
|
</div>
|
||||||
<ToastContainer className="position-fixed" position="top-end">
|
<ToastContainer className="position-fixed" position="top-end">
|
||||||
<Toast show={showSaved} onClose={hideSaved} bg="success">
|
<Toast show={showSaved} onClose={hideSaved} bg="success">
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import {KarakterTulajdonsagok, Modifier, TulajdonsagModosito, TulajdonsagokTotal} from "../domain-models/tulajdonsag";
|
import {TulajdonsagokTotal} from "../domain-models/tulajdonsag";
|
||||||
import {Mentok, MentokAlap, MentoModositok} from "../domain-models/mentok";
|
import {Mentok, MentokAlap, MentoModositok} from "../domain-models/mentok";
|
||||||
import {Kepzettseg, Kepzettsegek} from "../domain-models/kepzettsegek";
|
import {Kepzettseg, Kepzettsegek} from "../domain-models/kepzettsegek";
|
||||||
import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek";
|
import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek";
|
||||||
@@ -11,6 +11,11 @@ import {GetJellem} from "../domain-models/jellem";
|
|||||||
import {Fegyver, GetFegyverek, GetPajzs, GetPancel} from '../domain-models/felszereles'
|
import {Fegyver, GetFegyverek, GetPajzs, GetPancel} from '../domain-models/felszereles'
|
||||||
import {SignedNumberToText} from "../components/Helpers";
|
import {SignedNumberToText} from "../components/Helpers";
|
||||||
import {OsztalySkillsTordelt} from "./osztaly_skills";
|
import {OsztalySkillsTordelt} from "./osztaly_skills";
|
||||||
|
import {
|
||||||
|
KarakterTulajdonsagok,
|
||||||
|
Modifier,
|
||||||
|
TulajdonsagModosito
|
||||||
|
} from "../domain-models/tulajdonsag";
|
||||||
|
|
||||||
export interface KepzettsegPdfView {
|
export interface KepzettsegPdfView {
|
||||||
KepzettsegName: string
|
KepzettsegName: string
|
||||||
@@ -112,7 +117,7 @@ export function KarakterInputToPdfView(karakter: KarakterInputs): KarakterPdfVie
|
|||||||
|
|
||||||
function mapKepzettsegToPdfView(kepzettseg: Kepzettseg, tulajdonsagok: KarakterTulajdonsagok, szint: number) {
|
function mapKepzettsegToPdfView(kepzettseg: Kepzettseg, tulajdonsagok: KarakterTulajdonsagok, szint: number) {
|
||||||
const tulajdonsagErtek = kepzettseg.Tulajdonsag.reduce((maxTulajdonsagErtek, currentTulajdonsag) =>
|
const tulajdonsagErtek = kepzettseg.Tulajdonsag.reduce((maxTulajdonsagErtek, currentTulajdonsag) =>
|
||||||
(tulajdonsagok[currentTulajdonsag] > maxTulajdonsagErtek)
|
tulajdonsagok[currentTulajdonsag] > maxTulajdonsagErtek
|
||||||
? tulajdonsagok[currentTulajdonsag]
|
? tulajdonsagok[currentTulajdonsag]
|
||||||
: maxTulajdonsagErtek,
|
: maxTulajdonsagErtek,
|
||||||
tulajdonsagok[kepzettseg.Tulajdonsag[0]])
|
tulajdonsagok[kepzettseg.Tulajdonsag[0]])
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import {PDFFont, PDFPage, rgb} from "pdf-lib";
|
import {PDFFont, PDFPage, rgb} from "pdf-lib";
|
||||||
import {KarakterTulajdonsagok, Modifier} from "../domain-models/tulajdonsag";
|
|
||||||
import {SignedNumberToText} from "../components/Helpers";
|
import {SignedNumberToText} from "../components/Helpers";
|
||||||
|
import {KarakterTulajdonsagok, Modifier} from "../domain-models/tulajdonsag";
|
||||||
|
|
||||||
export function DrawTulajdonsagok(page: PDFPage, tulajdonsagok: KarakterTulajdonsagok, fontSizeBase: number, pdfFont: PDFFont) {
|
export function DrawTulajdonsagok(page: PDFPage, tulajdonsagok: KarakterTulajdonsagok, fontSizeBase: number, pdfFont: PDFFont) {
|
||||||
page.drawText(tulajdonsagok.t_ero.toString(), {
|
page.drawText(tulajdonsagok.t_ero.toString(), {
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
import React from "react";
|
||||||
|
import {Faj2E, FajDescription, FajLabel, FajSpecials} from "../domain-models/faj2E";
|
||||||
|
|
||||||
|
function FajSelector2E(props: { faj: Faj2E, changeFaj: (val: Faj2E) => void }) {
|
||||||
|
const {faj, changeFaj} = props
|
||||||
|
return <>
|
||||||
|
<div className='row m-2'>
|
||||||
|
<label className='col-md-2 col-sm-3 col-form-label'>Faj</label>
|
||||||
|
<select className='col form-select' value={faj} onChange={e => changeFaj(e.target.value as Faj2E)}>
|
||||||
|
<option key={Faj2E.Ember} value={Faj2E.Ember}>{FajLabel(Faj2E.Ember)}</option>
|
||||||
|
<optgroup label='más emberi népek'>
|
||||||
|
<option key={Faj2E.Amazon} value={Faj2E.Amazon}>{FajLabel(Faj2E.Amazon)}</option>
|
||||||
|
<option key={Faj2E.Birodalmi} value={Faj2E.Birodalmi}>{FajLabel(Faj2E.Birodalmi)}</option>
|
||||||
|
<option key={Faj2E.Eszaki} value={Faj2E.Eszaki}>{FajLabel(Faj2E.Eszaki)}</option>
|
||||||
|
<option key={Faj2E.Nomad} value={Faj2E.Nomad}>{FajLabel(Faj2E.Nomad)}</option>
|
||||||
|
<option key={Faj2E.Osember} value={Faj2E.Osember}>{FajLabel(Faj2E.Osember)}</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label='nem emberi fajok'>
|
||||||
|
<option key={Faj2E.Elf} value={Faj2E.Elf}>{FajLabel(Faj2E.Elf)}</option>
|
||||||
|
<option key={Faj2E.Felelf} value={Faj2E.Felelf}>{FajLabel(Faj2E.Felelf)}</option>
|
||||||
|
<option key={Faj2E.Felork} value={Faj2E.Felork}>{FajLabel(Faj2E.Felork)}</option>
|
||||||
|
<option key={Faj2E.Felszerzet}
|
||||||
|
value={Faj2E.Felszerzet}>{FajLabel(Faj2E.Felszerzet)}</option>
|
||||||
|
<option key={Faj2E.Gnom} value={Faj2E.Gnom}>{FajLabel(Faj2E.Gnom)}</option>
|
||||||
|
<option key={Faj2E.Torpe} value={Faj2E.Torpe}>{FajLabel(Faj2E.Torpe)}</option>
|
||||||
|
</optgroup>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div className='row m-2'>
|
||||||
|
<label className='col-md-2 col-sm-3 form-label'></label>
|
||||||
|
<div className='col'>
|
||||||
|
<p className='row pt-2'>
|
||||||
|
{FajDescription(faj)}
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
{FajSpecials(faj).map(((special, i) => (<li key={faj + i}>{special}</li>)))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FajSelector2E
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
// import React from "react";
|
||||||
|
// import fegyverek from "../domain-models/fegyver.json"
|
||||||
|
// import {defaultFegyverID, GetFegyver} from "../domain-models/felszereles";
|
||||||
|
//
|
||||||
|
// function HarcosFegyverSpecializacio(props: {
|
||||||
|
// specialization: string,
|
||||||
|
// existingSpecializations: string[],
|
||||||
|
// changeSpecialization: (specialization: string) => void
|
||||||
|
// szint: number
|
||||||
|
// }) {
|
||||||
|
// const {
|
||||||
|
// specialization,
|
||||||
|
// existingSpecializations,
|
||||||
|
// changeSpecialization,
|
||||||
|
// szint
|
||||||
|
// } = props
|
||||||
|
// const fegyver = GetFegyver(specialization)
|
||||||
|
// const pickableFegyverek = fegyverek.data.filter(f => f.Id === specialization || existingSpecializations.filter(x => x === f.Id).length < (szint < 9 ? 1 : 2))
|
||||||
|
// const kozelharciPickable = pickableFegyverek.filter(f => f.Type === 'kozelharci')
|
||||||
|
// const tavolsagiPickable = pickableFegyverek.filter(f => f.Type === 'lofegyver')
|
||||||
|
//
|
||||||
|
// return <>
|
||||||
|
// <div className='row m-2'>
|
||||||
|
// <label className='col-md-2 col-sm-3 col-form-label' >Fegyver specializáció</label>
|
||||||
|
// <select className='col form-select' value={fegyver?.Id || defaultFegyverID} onChange={e => changeSpecialization(e.target.value)}>
|
||||||
|
// <optgroup label="Közelharci">
|
||||||
|
// {kozelharciPickable.map(f => <option key={`spec-${szint}-${f.Id}`} value={f.Id}>{f.Name}</option>)}
|
||||||
|
// </optgroup>
|
||||||
|
// <optgroup label="Távolsági">
|
||||||
|
// {tavolsagiPickable.map(f => <option key={`spec-${szint}-${f.Id}`} value={f.Id}>{f.Name}</option>)}
|
||||||
|
// </optgroup>
|
||||||
|
// </select>
|
||||||
|
// {fegyver == null && <span className='form-field-error'>Ismeretlen fegyver: {specialization}</span>}
|
||||||
|
// </div>
|
||||||
|
// </>
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// export default HarcosFegyverSpecializacio
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
import React from "react";
|
||||||
|
import {AllJellemIDs, GetJellem, JellemID} from "../domain-models/jellem";
|
||||||
|
|
||||||
|
function JellemSelector(props: {selected: JellemID, changeJellem: (val: JellemID) => void}) {
|
||||||
|
const { selected, changeJellem } = props
|
||||||
|
const jellem = GetJellem(selected)
|
||||||
|
return <>
|
||||||
|
<div className='row m-2'>
|
||||||
|
<label className='col-md-2 col-sm-3 col-form-label'>Jellem</label>
|
||||||
|
<select className='col form-select' value={selected} onChange={e => changeJellem(e.target.value as JellemID)}>
|
||||||
|
{AllJellemIDs.map((id) => (
|
||||||
|
<option key={id} value={id}>{GetJellem(id).Label}</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div className='row m-2'>
|
||||||
|
<label className='col-md-2 col-sm-3 form-label'></label>
|
||||||
|
<div className='col'>
|
||||||
|
<p className='row pt-2'>
|
||||||
|
{jellem.Description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default JellemSelector
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
import React from "react";
|
||||||
|
import KepzettsegSelector from "./KepzettsegSelector2E";
|
||||||
|
import {
|
||||||
|
Kepzettseg,
|
||||||
|
Kepzettsegek,
|
||||||
|
KepzettsegId,
|
||||||
|
TolvajKepzettsegList,
|
||||||
|
} from "../domain-models/kepzettsegek2E";
|
||||||
|
import {arraySetN} from "../../util";
|
||||||
|
|
||||||
|
|
||||||
|
function InternalKepzettsegekSelector(props: {
|
||||||
|
title: string,
|
||||||
|
numberOfKepzettseg: number,
|
||||||
|
getKepzettsegListaN: (n: number) => Kepzettseg[],
|
||||||
|
kepzettsegek: KepzettsegId[],
|
||||||
|
changeKepzettsegek: (newKepzettsegek: KepzettsegId[]) => void
|
||||||
|
}) {
|
||||||
|
const {title, numberOfKepzettseg, getKepzettsegListaN, kepzettsegek, changeKepzettsegek} = props
|
||||||
|
|
||||||
|
const klist = Array.from(new Array(numberOfKepzettseg).keys())
|
||||||
|
|
||||||
|
const preCalculated: {
|
||||||
|
kepzettsegek: Kepzettseg[],
|
||||||
|
changeKepzettseg: (newKepzettseg: KepzettsegId) => void,
|
||||||
|
selected: Kepzettseg,
|
||||||
|
}[] = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < numberOfKepzettseg; i++) {
|
||||||
|
preCalculated.push({
|
||||||
|
kepzettsegek: getKepzettsegListaN(i),
|
||||||
|
selected: Kepzettsegek[kepzettsegek[i]],
|
||||||
|
changeKepzettseg: (newKepzettseg: KepzettsegId) => changeKepzettsegek(arraySetN(kepzettsegek, i, newKepzettseg))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return <>
|
||||||
|
<div className='row m-2'>
|
||||||
|
<label className='col-lg-2 col-md-12 col-form-label'>{title}</label>
|
||||||
|
<div className='col'>
|
||||||
|
{klist.map((idx) =>
|
||||||
|
<KepzettsegSelector
|
||||||
|
key={title+idx}
|
||||||
|
kepzettsegek={preCalculated[idx].kepzettsegek}
|
||||||
|
selected={preCalculated[idx].selected}
|
||||||
|
changeKepzettseg={preCalculated[idx].changeKepzettseg}
|
||||||
|
/>)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function KarakterKepzettsegek (props: {
|
||||||
|
numberOfKepzettsegek: number
|
||||||
|
kepzettsegek: KepzettsegId[],
|
||||||
|
changeKepzettsegek: (newKepzettsegek: KepzettsegId[]) => void
|
||||||
|
tolvajKepzettsegek: KepzettsegId[],
|
||||||
|
changeTolvajKepzettsegek: (newKepzettsegek: KepzettsegId[]) => void
|
||||||
|
getKepzettsegListaN: (n: number) => Kepzettseg[]
|
||||||
|
}) {
|
||||||
|
const { kepzettsegek, numberOfKepzettsegek, getKepzettsegListaN, changeKepzettsegek, tolvajKepzettsegek, changeTolvajKepzettsegek} = props
|
||||||
|
|
||||||
|
// TODO: Birodalmi tolvajnal az Alikmia, vagy Meregkeveres kezelese
|
||||||
|
|
||||||
|
const getTolvajKepzettsegListaN = (n: number) : Kepzettseg[] => {
|
||||||
|
const tolvajKepzettsegekWithoutN = [...tolvajKepzettsegek.slice(0, n), ...tolvajKepzettsegek.slice(n+1)]
|
||||||
|
return TolvajKepzettsegList.filter(x => !kepzettsegek.includes(x.Id) && !tolvajKepzettsegekWithoutN.includes(x.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
return <>
|
||||||
|
<InternalKepzettsegekSelector
|
||||||
|
title="Képzettségek"
|
||||||
|
numberOfKepzettseg={numberOfKepzettsegek}
|
||||||
|
getKepzettsegListaN={getKepzettsegListaN}
|
||||||
|
changeKepzettsegek={changeKepzettsegek}
|
||||||
|
kepzettsegek={kepzettsegek} />
|
||||||
|
|
||||||
|
{tolvajKepzettsegek.length > 0 && <InternalKepzettsegekSelector
|
||||||
|
title="Tolvaj képzettségek"
|
||||||
|
numberOfKepzettseg={4}
|
||||||
|
getKepzettsegListaN={getTolvajKepzettsegListaN}
|
||||||
|
changeKepzettsegek={changeTolvajKepzettsegek}
|
||||||
|
kepzettsegek={tolvajKepzettsegek} />}
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default KarakterKepzettsegek
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
import React from "react";
|
||||||
|
import {Kepzettseg, KepzettsegId} from "../domain-models/kepzettsegek2E";
|
||||||
|
import {TulajdonsagLabel} from "../domain-models/tulajdonsag2E";
|
||||||
|
import {OsztalyLabel} from "../domain-models/osztaly2E";
|
||||||
|
|
||||||
|
function kepzettsegOptionText(k: Kepzettseg) {
|
||||||
|
const osztalyok = k.Osztalyok?.reduce((acc, o) => acc + ' / ' + OsztalyLabel(o), '')?.substring(3)
|
||||||
|
return k.Name + ' (' + k.Tulajdonsag.reduce((acc, k) => (acc === '' ? acc : acc + ' / ') + TulajdonsagLabel(k), '') + ')' + (osztalyok == null ? '' : (' - ' + osztalyok));
|
||||||
|
}
|
||||||
|
|
||||||
|
function KepzettsegSelector (props: {kepzettsegek: Kepzettseg[], changeKepzettseg: (newKepzettseg: KepzettsegId) => void, selected : Kepzettseg}) {
|
||||||
|
|
||||||
|
const { kepzettsegek, changeKepzettseg, selected } = props
|
||||||
|
|
||||||
|
return <>
|
||||||
|
<div className='row'>
|
||||||
|
<select className='form-control'
|
||||||
|
value={selected.Id} onChange={e => changeKepzettseg(e.target.value as KepzettsegId)}>
|
||||||
|
{kepzettsegek.map(k =>(
|
||||||
|
<option key={k.Id} value={k.Id}>
|
||||||
|
{kepzettsegOptionText(k)}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div className='row pt-2'>
|
||||||
|
<p className='col'>{selected.Description}</p>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default KepzettsegSelector
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
import React from "react";
|
||||||
|
import {
|
||||||
|
Osztaly2E,
|
||||||
|
OsztalyDescription,
|
||||||
|
OsztalyLabel,
|
||||||
|
OsztalyProperties,
|
||||||
|
OsztalySpecialSkills
|
||||||
|
} from "../domain-models/osztaly2E";
|
||||||
|
import {Faj2E, SzintKorlatokFajokra} from "../domain-models/faj2E";
|
||||||
|
|
||||||
|
function OsztalySelector2E(props: {
|
||||||
|
currentFaj: Faj2E,
|
||||||
|
currentOsztaly: Osztaly2E,
|
||||||
|
changeOsztaly: (newOsztaly: Osztaly2E) => void
|
||||||
|
}) {
|
||||||
|
const {currentFaj, currentOsztaly, changeOsztaly} = props;
|
||||||
|
|
||||||
|
return <>
|
||||||
|
<div className='row m-2'>
|
||||||
|
<label className='col-md-2 col-sm-3 col-form-label'>Osztály</label>
|
||||||
|
<select className="col form-select" value={currentOsztaly}
|
||||||
|
onChange={(e) => changeOsztaly(e.target.value as Osztaly2E)}>
|
||||||
|
<optgroup label='Harcos'>
|
||||||
|
<option value={Osztaly2E.Harcos}>{OsztalyLabel(Osztaly2E.Harcos)}</option>
|
||||||
|
{SzintKorlatokFajokra(currentFaj)[Osztaly2E.Amazon] > 0 && (
|
||||||
|
<option value={Osztaly2E.Amazon}>{OsztalyLabel(Osztaly2E.Amazon)}</option>)}
|
||||||
|
<option value={Osztaly2E.Barbar}>{OsztalyLabel(Osztaly2E.Barbar)}</option>
|
||||||
|
<option value={Osztaly2E.Ijasz}>{OsztalyLabel(Osztaly2E.Ijasz)}</option>
|
||||||
|
<option value={Osztaly2E.Tengeresz}>{OsztalyLabel(Osztaly2E.Tengeresz)}</option>
|
||||||
|
</optgroup>
|
||||||
|
<option value={Osztaly2E.Pap}>{OsztalyLabel(Osztaly2E.Pap)}</option>
|
||||||
|
<option value={Osztaly2E.Tolvaj}>{OsztalyLabel(Osztaly2E.Tolvaj)}</option>
|
||||||
|
<optgroup label='Varázsló'>
|
||||||
|
<option value={Osztaly2E.Varazslo}>{OsztalyLabel(Osztaly2E.Varazslo)}</option>
|
||||||
|
<option value={Osztaly2E.Illuzionista}>{OsztalyLabel(Osztaly2E.Illuzionista)}</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label='Opcionális'>
|
||||||
|
<option value={Osztaly2E.Dalnok}>{OsztalyLabel(Osztaly2E.Dalnok)}</option>
|
||||||
|
<option value={Osztaly2E.Druida}>{OsztalyLabel(Osztaly2E.Druida)}</option>
|
||||||
|
<option value={Osztaly2E.Vandor}>{OsztalyLabel(Osztaly2E.Vandor)}</option>
|
||||||
|
</optgroup>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div className='row m-2'>
|
||||||
|
<label className='col-md-2 col-sm-3 form-label'></label>
|
||||||
|
<div className='col'>
|
||||||
|
<p className='row pt-2'>
|
||||||
|
{OsztalyDescription(currentOsztaly)}
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
{OsztalyProperties(currentOsztaly).map(((special, i) => (<li key={currentOsztaly + i}>{special}</li>)))}
|
||||||
|
</ul>
|
||||||
|
<div className='col'>
|
||||||
|
{OsztalySpecialSkills(currentOsztaly).map(skill =>
|
||||||
|
<div key={skill.Id} >
|
||||||
|
<strong className='d-inline'>
|
||||||
|
{skill.Name}
|
||||||
|
</strong>
|
||||||
|
{' '}
|
||||||
|
{skill.Description}
|
||||||
|
{skill.ExtendedDescription && (
|
||||||
|
<ol>
|
||||||
|
{skill.ExtendedDescription.map((ext, i) =>
|
||||||
|
(<li key={skill.Id + '-' + i}>{ext}</li>))}
|
||||||
|
</ol>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default OsztalySelector2E;
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
import {Faj2E, FajLabel} from "../domain-models/faj2E";
|
||||||
|
import {Modifier} from "../domain-models/tulajdonsag2E";
|
||||||
|
import {SignedNumberToText} from "../../shared/helpers";
|
||||||
|
|
||||||
|
|
||||||
|
function fajiModositoText(faj: Faj2E, szamolas: (f: Faj2E) => number) : string {
|
||||||
|
const mod = szamolas(faj)
|
||||||
|
return (mod !== 0) ? SignedNumberToText(mod) + ' (' + FajLabel(faj) + ')' : ''
|
||||||
|
}
|
||||||
|
|
||||||
|
function TulajdonsagInput(props: {
|
||||||
|
tulajdonsag: string,
|
||||||
|
currentFaj : Faj2E,
|
||||||
|
fajiModosito: (faj: Faj2E) => number,
|
||||||
|
changeValue: (val: number) => void
|
||||||
|
currentValue: number
|
||||||
|
tooLowError: string,
|
||||||
|
tooHighError: string
|
||||||
|
}) {
|
||||||
|
const {
|
||||||
|
tulajdonsag,
|
||||||
|
changeValue,
|
||||||
|
currentFaj,
|
||||||
|
currentValue,
|
||||||
|
fajiModosito,
|
||||||
|
tooLowError,
|
||||||
|
tooHighError,
|
||||||
|
} = props;
|
||||||
|
return (<div className='row m-2'>
|
||||||
|
<label className='col-lg-1 col-sm-2 col-form-label'>{tulajdonsag}</label>
|
||||||
|
<div className='col-lg-1 col-sm-2 m-2'>
|
||||||
|
<input className='form-control' maxLength={2} type='number' value={currentValue} onChange={e => changeValue(Number(e.target.value))} />
|
||||||
|
</div>
|
||||||
|
<span className='col-sm-2 m-2'>
|
||||||
|
{fajiModositoText(currentFaj, fajiModosito)}
|
||||||
|
</span>
|
||||||
|
<span className='col-sm-2 m-2'>
|
||||||
|
Összesen: { (currentValue + (fajiModosito(currentFaj))).toString() }
|
||||||
|
</span>
|
||||||
|
<span className='col-sm-2 m-2'>
|
||||||
|
Módosító: { SignedNumberToText(Modifier(currentValue + fajiModosito(currentFaj))) }
|
||||||
|
</span>
|
||||||
|
{currentValue < 3 && (
|
||||||
|
<span className='form-field-error'>{tooLowError}</span>)}
|
||||||
|
{currentValue > 18 && (
|
||||||
|
<span className='form-field-error'>{tooHighError}</span>)}
|
||||||
|
</div>)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default TulajdonsagInput;
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
import React from "react";
|
||||||
|
import {
|
||||||
|
KarakterTulajdonsagok,
|
||||||
|
RollAllAbilities,
|
||||||
|
Tulajdonsag2E,
|
||||||
|
} from "../domain-models/tulajdonsag2E";
|
||||||
|
import TulajdonsagInput from "./TulajdonsagInput2E";
|
||||||
|
import {Faj2E, TulajdonsagModositokFajokra} from "../domain-models/faj2E";
|
||||||
|
|
||||||
|
function Tulajdonsagok(props: {
|
||||||
|
currentFaj: Faj2E,
|
||||||
|
tulajdonsagok: KarakterTulajdonsagok
|
||||||
|
changeTulajdonsagok: (tulajdonsagok: KarakterTulajdonsagok) => void
|
||||||
|
}) {
|
||||||
|
const {currentFaj, tulajdonsagok, changeTulajdonsagok} = props
|
||||||
|
return <>
|
||||||
|
<div className='row'>
|
||||||
|
<h5 className='col-lg-2 col-sm-4 align-self-center'>Tulajdonságok</h5>
|
||||||
|
<div className='col-sm-2 m-2'>
|
||||||
|
<button className='btn btn-dark' type='button'
|
||||||
|
onClick={() => changeTulajdonsagok(RollAllAbilities())}>Dobás
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<TulajdonsagInput
|
||||||
|
tulajdonsag='Erő'
|
||||||
|
currentValue={tulajdonsagok.t_ero}
|
||||||
|
currentFaj={currentFaj}
|
||||||
|
fajiModosito={TulajdonsagModositokFajokra(Tulajdonsag2E.Ero)}
|
||||||
|
changeValue={(val: number) => changeTulajdonsagok({...tulajdonsagok, t_ero: val})}
|
||||||
|
tooLowError='Túl gyenge vagy, nem bírtad felemelni a kezed a jelentkezéshez!'
|
||||||
|
tooHighError='Szét szakadtak az izmaid!'
|
||||||
|
/>
|
||||||
|
<TulajdonsagInput
|
||||||
|
tulajdonsag='Ügyesség'
|
||||||
|
currentValue={tulajdonsagok.t_ugy}
|
||||||
|
currentFaj={currentFaj}
|
||||||
|
fajiModosito={TulajdonsagModositokFajokra(Tulajdonsag2E.Ugyesseg)}
|
||||||
|
changeValue={(val: number) => changeTulajdonsagok({...tulajdonsagok, t_ugy: val})}
|
||||||
|
tooLowError='Orrabuktál jelentkezés helyett!'
|
||||||
|
tooHighError='Emberfeletti zsonglörködésedre záptojással válaszoltak a helyiek!'
|
||||||
|
/>
|
||||||
|
<TulajdonsagInput
|
||||||
|
tulajdonsag='Egészség'
|
||||||
|
currentValue={tulajdonsagok.t_egs}
|
||||||
|
currentFaj={currentFaj}
|
||||||
|
fajiModosito={TulajdonsagModositokFajokra(Tulajdonsag2E.Egeszseg)}
|
||||||
|
changeValue={(val: number) => changeTulajdonsagok({...tulajdonsagok, t_egs: val})}
|
||||||
|
tooLowError='Túl beteg vagy ahhoz, hogy kalandozni menj!'
|
||||||
|
tooHighError='Kicsattanó egészségedet csak a diambroid állíthatja meg, minő véletlen, hogy pont az arcodba robbant...'
|
||||||
|
/>
|
||||||
|
<TulajdonsagInput
|
||||||
|
tulajdonsag='Intelligencia'
|
||||||
|
currentValue={tulajdonsagok.t_int}
|
||||||
|
currentFaj={currentFaj}
|
||||||
|
fajiModosito={TulajdonsagModositokFajokra(Tulajdonsag2E.Intelligencia)}
|
||||||
|
changeValue={(val: number) => changeTulajdonsagok({...tulajdonsagok, t_int: val})}
|
||||||
|
tooLowError='Elfelejtetted, hogy mikor is kéne kalandozni indulni!'
|
||||||
|
tooHighError='Ilyen tudás és logika birtokában mi szükséged van új információkra? Mindent le tudsz vezetni a már meglévő ismereteidből, és ezt azonnal beláttad.'
|
||||||
|
/>
|
||||||
|
<TulajdonsagInput
|
||||||
|
tulajdonsag='Bölcsesség'
|
||||||
|
currentValue={tulajdonsagok.t_bol}
|
||||||
|
currentFaj={currentFaj}
|
||||||
|
fajiModosito={TulajdonsagModositokFajokra(Tulajdonsag2E.Bolcsesseg)}
|
||||||
|
changeValue={(val: number) => changeTulajdonsagok({...tulajdonsagok, t_bol: val})}
|
||||||
|
tooLowError='Nem bírtál ellenállni a kíváncsiságodnak, hogy közelebbről is megvizsgáld a tőr hegyét. Nagyon közelről.'
|
||||||
|
tooHighError='Hatalmas bölcsességedben beláttad a kalandozás veszélyeit és inkább más tevékenységbe fogtál.'
|
||||||
|
/>
|
||||||
|
<TulajdonsagInput
|
||||||
|
tulajdonsag='Karizma'
|
||||||
|
currentValue={tulajdonsagok.t_kar}
|
||||||
|
currentFaj={currentFaj}
|
||||||
|
fajiModosito={TulajdonsagModositokFajokra(Tulajdonsag2E.Karizma)}
|
||||||
|
changeValue={(val: number) => changeTulajdonsagok({...tulajdonsagok, t_kar: val})}
|
||||||
|
tooLowError='Mintha taszítanád az embereket, sose sikerült kalandozó csapatot találnod.'
|
||||||
|
tooHighError='Az ellenkező nem tagjai nem engedték, hogy útnak indulj.'
|
||||||
|
/>
|
||||||
|
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Tulajdonsagok
|
||||||
@@ -0,0 +1,337 @@
|
|||||||
|
import {KarakterTulajdonsagok, Tulajdonsag2E} from "./tulajdonsag2E";
|
||||||
|
|
||||||
|
export enum Faj2E {
|
||||||
|
Ember = 'f_2e_ember',
|
||||||
|
Amazon = 'f_2e_amazon',
|
||||||
|
Birodalmi = 'f_2e_birodalmi',
|
||||||
|
Nomad = 'f_2e_nomad',
|
||||||
|
Eszaki = 'f_2e_eszaki',
|
||||||
|
Osember = 'f_2e_osember',
|
||||||
|
Elf = 'f_2e_elf',
|
||||||
|
Felelf = 'f_2e_felelf',
|
||||||
|
Felork = 'f_2e_felork',
|
||||||
|
Felszerzet = 'f_2e_felszerzet',
|
||||||
|
Gnom = 'f_2e_gnom',
|
||||||
|
Torpe = 'f_2e_torpe',
|
||||||
|
}
|
||||||
|
|
||||||
|
export function FajLabel(faj: Faj2E) : string {
|
||||||
|
switch (faj) {
|
||||||
|
case Faj2E.Ember: return 'Ember';
|
||||||
|
case Faj2E.Amazon: return 'Amazon';
|
||||||
|
case Faj2E.Birodalmi: return 'Birodalmi';
|
||||||
|
case Faj2E.Nomad: return 'Nomád';
|
||||||
|
case Faj2E.Eszaki: return 'Északi';
|
||||||
|
case Faj2E.Osember: return 'Ősember';
|
||||||
|
case Faj2E.Elf: return 'Elf';
|
||||||
|
case Faj2E.Felelf: return 'Félelf';
|
||||||
|
case Faj2E.Felork: return 'Félork';
|
||||||
|
case Faj2E.Felszerzet: return 'Félszerzet';
|
||||||
|
case Faj2E.Gnom: return 'Gnóm';
|
||||||
|
case Faj2E.Torpe: return 'Törpe';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function FajDescription(faj: Faj2E) : string {
|
||||||
|
switch (faj) {
|
||||||
|
case Faj2E.Ember: return "Az emberi népek sokfélesége és szaporasága, valamint a bennük élő felfedezői hajlam és erkölcsi rugalmasság hatására képviselőik majdnem minden földön megtalálhatók. A legtöbb ember a lenti vonásokkal rendelkezik.";
|
||||||
|
case Faj2E.Amazon: return "Bár az amazonok barbár népe igen kis létszámú, harciasságuk miatt mégis félik őket. Az amazonok nyúlánk termetűek, hajuk általában vöröses vagy világosbarna, bőrük világos. Társadalmukban teljes a nőuralom; a férfiakat rabszolgaságban tartják és megtiltják számukra a fegyverek viselését. Képzett tengeri rablók, de a szárazföldön is megállják a helyüket. Az amazon nők kivétel nélkül értenek a harchoz és soha, soha nem hagyják megtorlatlanul az őket ért sérelmeket. Technikailag fejletlenek. Kis erejű passzív pszionikus (elmebeli) képességeik vannak.";
|
||||||
|
case Faj2E.Birodalmi: return "Dekadens, hanyatló birodalmak előkelő lakói. Életüket többnyire dekadens élvezetek habzsolásával, kábítószeres mámorban töltik; soraikban a beltenyészet és a degeneráció miatt gyakoriak az örökletes betegségek. Városaik számtalan titkot és mesés kincseket rejtenek.";
|
||||||
|
case Faj2E.Eszaki: return "Az északi kultúra lételeme a harc és a hajózás. Még nőik is kiválóan forgatják a harci fejszét vagy a hosszú nyelű bárdot, s – bár rabszolgatartók – kegyetlenségnek tartják rabszolgáikat a legelemibb védekező eszközöktől, mint a késtől vagy a rövidkardtól megfosztani, vagy fegyvertelenekre támadni. Ettől eltekintve vérszomjasak, és általában semleges vagy gonosz jelleműek. Testalkatuk magas és erős, hajuk vöröses, szőke vagy világosbarna. A férfiak szakállat vagy bajuszt, a nők hosszú hajat viselnek. A déli vidékeken civilizálatlanságuk és faragatlanságuk miatt gyakran megvetik őket.";
|
||||||
|
case Faj2E.Nomad: return "A lovas nomádok kultúrája mindmáig megőrizte primitívségét. Az alkalomnak megfelelően állattartásból, lovas portyázásból, kereskedésből vagy ezek kombinációjából élnek. Eszközeik is egyszerűek: fegyvereik főleg hosszú lándzsák és íjak, és bár kedvelik a kardokat és láncvérteket, nem jeleskednek azok előállításában (a vas megmunkálását kovácsaik féltett titokként őrzik). Többnyire semleges jelleműek, de otthonuktól elszakadva mindenhol feltalálják magukat, és hajlamosak a gonoszra. A nomádok középtermetűek, bőrük cserzett, hajuk olajos fekete, amit leggyakrabban copfban fognak össze. A férfiak kedvelik a bajusz viseletét." ;
|
||||||
|
case Faj2E.Osember: return "Vad földek primitív őslakói. Máig megőrizték görnyedt tartásukat, szőrös küllemüket és loboncos fekete hajukat. A fémmegmunkálást még sokan nem ismerik, s kőeszközöket – esetleg rezet – használnak. Írásuk egyáltalán nincs. Félistenekként tisztelik hátasaikat, a hatalmas mamutokat. Sokan értelem nélküli vagy gyermeki vadaknak hiszik őket, nagy kárukra: az ősemberekben gyakran lakozik bestiális ravaszság, és a civilizált ember eszközeihez jutva rendkívül veszedelmesek.";
|
||||||
|
case Faj2E.Elf: return "Az elfek szépségükről, 150-200 éves élettartamukról és fejlett civilizációjukról ismertek, amely ötvözi a városi és természeti élet előnyeit. Termetük nyúlánk, vonásaik az embernél finomabbak, de egyben törékenyebbek. Kiváló íjászok és varázslók. Általában visszahúzódók, csak ritkán lépnek kapcsolatba a rövidebb életű népekkel – legjobban az emberekkel és a félszerzetekkel jönnek ki. Jellemük általában kaotikus jó.";
|
||||||
|
case Faj2E.Felelf: return "A félelfek elf és ember szülők gyermekei, akik nem tartoznak egyik közösséghez sem – jellemvonásaik általában az elfekhez húznak, de élettartamuk emberi. Kis számuk miatt nem alkotnak külön nemzetségeket, többségük magányos utazó.";
|
||||||
|
case Faj2E.Felork: return "A félorkok többsége külsejében inkább rút emberre hasonlít (bár termetük gyakran görnyedt, arcvonásaik pedig disznószerűek), belsőleg azonban számos ork vonással rendelkeznek: számítók, magányosak és bizalmatlanok a szebb fajokkal, de legtöbbször fajtársaikkal is. Különösen sok közöttük az orgyilkos és a közönséges gonosztevő; egyikük-másikuk ezt némi mágikus erővel vegyíti. Nem alkotnak különálló közösségeket, életük általában rövid és erőszakos. A legtöbb félork gonosz jellemű.";
|
||||||
|
case Faj2E.Felszerzet: return "A félszerzetek általában megelégszenek a nyugodt vidéki élettel. Termetük az emberi fele, élettartamuk a másfélszerese. Hajlamosak az elhízásra, s lábukat vastag szőr borítja. Általában mezítláb járnak. Mivel lusták és kényelemszeretők, csak ritkán adják fejüket kalandokra – ekkor azonban kiváló tolvajokká válhatnak.";
|
||||||
|
case Faj2E.Gnom: return "A gnómok különösen ritka, elsősorban az embernéppel együtt élő Faj2E. A gnómokat alacsony termetükről, vékony végtagjaikról és tömpe, húsos orrukról lehet fölismerni. Élettartamuk az emberi másfélszerese. A gnómok jó kézművesek és van érzékük a mágiához is – elsősorban az illuzionisták trükkjeihez vonzódnak. A legtöbb gnóm semleges jó vagy semleges jellemű.";
|
||||||
|
case Faj2E.Torpe: return "A törpék elsősorban hegyek között és dombvidékeken élnek. Termetük kicsi, de testük tömzsi és igen szívós. Bozontos szakállat viselnek, amely a férfiak esetén dús és sörteszerű, a nőknél finomabb és ritkásabb. A törpék kiemelkedőek a mindenféle mesterségekben, különösen a fémmunkákban, de harcban is megállják helyüket. Nagy nemzetségekbe szerveződnek és híresek igazságérzetükről, makacsságukról és kapzsiságukról. A legtöbb törpe törvényes jó vagy törvényes semleges jellemű..";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function FajSpecials(faj : Faj2E) : string[] {
|
||||||
|
switch (faj) {
|
||||||
|
case Faj2E.Ember: return [
|
||||||
|
"A játék kezdetén egy extra képzettséggel kezdenek",
|
||||||
|
"Korlátlanul fejlődhetnek minden osztályban",
|
||||||
|
];
|
||||||
|
case Faj2E.Amazon: return [
|
||||||
|
"+1-et kapnak kezdeményezésükre",
|
||||||
|
"Ha két vagy több amazon együttesen harcol, VO-juk 2-vel nő pszionikus képességeik miatt",
|
||||||
|
"Szintkorlátok: Harcos 9, Pap 5, Tolvaj 3, Varázsló 3",
|
||||||
|
];
|
||||||
|
case Faj2E.Birodalmi: return [
|
||||||
|
"+1 Intelligencia, -1 Egészség",
|
||||||
|
"Egyik kezdő képzettségük mindenképpen az Alkímia, a Méregkeverés vagy az Okkultizmus.",
|
||||||
|
"Szintkorlátok: Harcos 7, Pap 5, Tolvaj 5, Varázsló 9",
|
||||||
|
];
|
||||||
|
case Faj2E.Eszaki: return [
|
||||||
|
"+1 Erő, -1 Bölcsesség",
|
||||||
|
"Az egyik kezdő képzettségük mindenképpen a Hajózás",
|
||||||
|
"-1-et kapnak minden Karizmapróbájukra (népük tagjai között is)",
|
||||||
|
"Szintkorlátok: Harcos 9, Pap 7, Tolvaj 7, Varázsló 3",
|
||||||
|
];
|
||||||
|
case Faj2E.Nomad: return [
|
||||||
|
"+1 Egészség, -1 Bölcsesség",
|
||||||
|
"Az egyik kezdő képzettségük mindenképpen a Lovaglás",
|
||||||
|
"Szintkorlátok: Harcos 9, Pap 5, Tolvaj 7, Varázsló 3",
|
||||||
|
];
|
||||||
|
case Faj2E.Osember: return [
|
||||||
|
"+1 Erő, +1 Egészség, -1 Intelligencia, -1 Bölcsesség",
|
||||||
|
"Szintkorlátok: Harcos -, Pap 5, Tolvaj 4, Varázsló 0",
|
||||||
|
];
|
||||||
|
case Faj2E.Elf: return [
|
||||||
|
"+1 Ügyesség, -1 Egészség",
|
||||||
|
"Immunisak az altató mágiára, +2 mentődobás bűbáj ellen",
|
||||||
|
"Képzettek a hosszúíjak és a hosszúkard használatában akkor is, ha osztályuk ezt nem adná meg nekik",
|
||||||
|
"Az egyik képzettségük mindenképpen a Vadonjárás",
|
||||||
|
"Nem támaszthatók föl",
|
||||||
|
"Szintkorlátok: Harcos 7, Pap 3, Tolvaj 5, Varázsló 7",
|
||||||
|
];
|
||||||
|
case Faj2E.Felelf: return [
|
||||||
|
"Képzettek a hosszúíjak és a hosszúkard használatában akkor is, ha osztályuk ezt nem adná meg nekik",
|
||||||
|
"Az egyik képzettségük mindenképpen a Vadonjárás",
|
||||||
|
"Szintkorlátok: Harcos 9, Pap 5, Tolvaj 9, Varázsló 9",
|
||||||
|
];
|
||||||
|
case Faj2E.Felork: return [
|
||||||
|
"+1 Erő, +1 Egészség, -2 Karizma",
|
||||||
|
"A fenti levonáson túl -1-et kapnak minden Karizmapróbájukra (más félorkokkal szemben is)",
|
||||||
|
"Szintkorlátok: Harcos 7, Pap 5, Tolvaj 7, Varázsló 5",
|
||||||
|
];
|
||||||
|
case Faj2E.Felszerzet: return [
|
||||||
|
"+1 Ügyesség, -1 Erő",
|
||||||
|
"+1 VO-t kapnak kis méretük miatt",
|
||||||
|
"+1 támadást kapnak dobófegyverekre és parittyákra",
|
||||||
|
"Kétkezes közelharci fegyvereket -4 levonással, másfélkezes fegyvereket két kézzel forgathatnak",
|
||||||
|
"Kétszer annyi élelmet kell enniük, mint másoknak",
|
||||||
|
"Szintkorlátok: Harcos 5, Pap 3, Tolvaj 7, Varázsló 3",
|
||||||
|
];
|
||||||
|
case Faj2E.Gnom: return [
|
||||||
|
"+1 Intelligencia, -1 Erő",
|
||||||
|
"+1 VO-t kapnak kis méretük miatt",
|
||||||
|
"+1-et kapnak a mágia elleni mentődobásaikra",
|
||||||
|
"Kétkezes közelharci fegyvereket -4 levonással, másfélkezes fegyvereket két kézzel forgathatnak",
|
||||||
|
"Szintkorlátok: Harcos 3, Pap 3, Tolvaj 5, Varázsló 7",
|
||||||
|
];
|
||||||
|
case Faj2E.Torpe: return [
|
||||||
|
"+1 Egészség, -1 Karizma",
|
||||||
|
"Lassabban mozognak az embereknél, kezdeményezésükre -2-t kapnak",
|
||||||
|
"+2 mentődobást kapnak mérgek, betegségek és varázslatok hatásai ellen",
|
||||||
|
"Az egyik képzettségük mindenképpen az Értékbecslés",
|
||||||
|
"Szintkorlátok: Harcos 7, Pap 5, Tolvaj 5, Varázsló 3",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export type Szintkorlatok = Record<string, number> // TODO!! use Osztaly enum, rule fix!
|
||||||
|
|
||||||
|
export interface FajDetails {
|
||||||
|
ID: Faj2E,
|
||||||
|
Label: string,
|
||||||
|
Description: string,
|
||||||
|
Specials: string[],
|
||||||
|
TulajdonsagModifiers: KarakterTulajdonsagok
|
||||||
|
Szintkorlatok: Szintkorlatok
|
||||||
|
}
|
||||||
|
|
||||||
|
export function GetFajDetails(faj: Faj2E): FajDetails {
|
||||||
|
return {
|
||||||
|
ID: faj,
|
||||||
|
Label: FajLabel(faj),
|
||||||
|
Description: FajDescription(faj),
|
||||||
|
Specials: FajSpecials(faj),
|
||||||
|
TulajdonsagModifiers: fajiTulajdonsagModositok(faj),
|
||||||
|
Szintkorlatok: SzintKorlatokFajokra(faj),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// noinspection OverlyComplexFunctionJS,FunctionTooLongJS
|
||||||
|
function tulajdonsagModositokPerFaj(tul: Tulajdonsag2E, faj: Faj2E) : number {
|
||||||
|
switch (faj) {
|
||||||
|
case Faj2E.Birodalmi: switch (tul) {
|
||||||
|
case Tulajdonsag2E.Egeszseg: return -1;
|
||||||
|
case Tulajdonsag2E.Intelligencia: return +1;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
case Faj2E.Eszaki: switch (tul) {
|
||||||
|
case Tulajdonsag2E.Ero: return +1;
|
||||||
|
case Tulajdonsag2E.Bolcsesseg: return -1;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
case Faj2E.Nomad: switch (tul) {
|
||||||
|
case Tulajdonsag2E.Egeszseg: return +1;
|
||||||
|
case Tulajdonsag2E.Bolcsesseg: return -1;
|
||||||
|
default: return 0
|
||||||
|
}
|
||||||
|
case Faj2E.Osember: switch (tul) {
|
||||||
|
case Tulajdonsag2E.Ero: return +1;
|
||||||
|
case Tulajdonsag2E.Egeszseg: return +1;
|
||||||
|
case Tulajdonsag2E.Intelligencia: return -1;
|
||||||
|
case Tulajdonsag2E.Bolcsesseg: return -1;
|
||||||
|
default: return 0
|
||||||
|
}
|
||||||
|
case Faj2E.Elf: switch (tul) {
|
||||||
|
case Tulajdonsag2E.Egeszseg: return -1;
|
||||||
|
case Tulajdonsag2E.Ugyesseg: return +1;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
case Faj2E.Felork: switch (tul) {
|
||||||
|
case Tulajdonsag2E.Ero: return +1;
|
||||||
|
case Tulajdonsag2E.Egeszseg: return +1;
|
||||||
|
case Tulajdonsag2E.Karizma: return -2;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
case Faj2E.Felszerzet: switch (tul) {
|
||||||
|
case Tulajdonsag2E.Ero: return -1;
|
||||||
|
case Tulajdonsag2E.Ugyesseg: return +1;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
case Faj2E.Gnom: switch (tul) {
|
||||||
|
case Tulajdonsag2E.Ero: return -1;
|
||||||
|
case Tulajdonsag2E.Intelligencia: return +1;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
case Faj2E.Torpe: switch (tul) {
|
||||||
|
case Tulajdonsag2E.Egeszseg: return +1;
|
||||||
|
case Tulajdonsag2E.Karizma: return -1;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function TulajdonsagModositokFajokra(tul: Tulajdonsag2E) {
|
||||||
|
return (faj: Faj2E) => tulajdonsagModositokPerFaj(tul, faj);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function TulajdonsagokFajjal(tulajdonsagok: KarakterTulajdonsagok, faj: Faj2E): KarakterTulajdonsagok {
|
||||||
|
return {
|
||||||
|
[Tulajdonsag2E.Ero]: tulajdonsagok.t_ero + tulajdonsagModositokPerFaj(Tulajdonsag2E.Ero, faj),
|
||||||
|
[Tulajdonsag2E.Ugyesseg]: tulajdonsagok.t_ugy + tulajdonsagModositokPerFaj(Tulajdonsag2E.Ugyesseg, faj),
|
||||||
|
[Tulajdonsag2E.Egeszseg]: tulajdonsagok.t_egs + tulajdonsagModositokPerFaj(Tulajdonsag2E.Egeszseg, faj),
|
||||||
|
[Tulajdonsag2E.Intelligencia]: tulajdonsagok.t_int + tulajdonsagModositokPerFaj(Tulajdonsag2E.Intelligencia, faj),
|
||||||
|
[Tulajdonsag2E.Bolcsesseg]: tulajdonsagok.t_bol + tulajdonsagModositokPerFaj(Tulajdonsag2E.Bolcsesseg, faj),
|
||||||
|
[Tulajdonsag2E.Karizma]: tulajdonsagok.t_kar + tulajdonsagModositokPerFaj(Tulajdonsag2E.Karizma, faj),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function fajiTulajdonsagModositok(faj: Faj2E): KarakterTulajdonsagok {
|
||||||
|
return {
|
||||||
|
[Tulajdonsag2E.Ero]: TulajdonsagModositokFajokra(Tulajdonsag2E.Ero)(faj),
|
||||||
|
[Tulajdonsag2E.Ugyesseg]: TulajdonsagModositokFajokra(Tulajdonsag2E.Ugyesseg)(faj),
|
||||||
|
[Tulajdonsag2E.Egeszseg]: TulajdonsagModositokFajokra(Tulajdonsag2E.Egeszseg)(faj),
|
||||||
|
[Tulajdonsag2E.Intelligencia]: TulajdonsagModositokFajokra(Tulajdonsag2E.Intelligencia)(faj),
|
||||||
|
[Tulajdonsag2E.Bolcsesseg]: TulajdonsagModositokFajokra(Tulajdonsag2E.Bolcsesseg)(faj),
|
||||||
|
[Tulajdonsag2E.Karizma]: TulajdonsagModositokFajokra(Tulajdonsag2E.Karizma)(faj),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const EmberiSzintKorlatok: Szintkorlatok = {
|
||||||
|
o_amazon: 0,
|
||||||
|
o_barbar: 12,
|
||||||
|
o_harcos: 12,
|
||||||
|
o_ijasz: 12,
|
||||||
|
o_illuzionista: 12,
|
||||||
|
o_kaloz: 12,
|
||||||
|
o_pap: 12,
|
||||||
|
o_tolvaj: 12,
|
||||||
|
o_varazslo: 12
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// noinspection OverlyComplexFunctionJS,FunctionTooLongJS
|
||||||
|
export function SzintKorlatokFajokra(faj: Faj2E) : Szintkorlatok {
|
||||||
|
let szintkorlatok = {...EmberiSzintKorlatok}
|
||||||
|
switch (faj) {
|
||||||
|
case Faj2E.Ember: break;
|
||||||
|
case Faj2E.Amazon:
|
||||||
|
szintkorlatok.o_pap = 5
|
||||||
|
szintkorlatok.o_tolvaj = 0
|
||||||
|
szintkorlatok.o_illuzionista = 0
|
||||||
|
szintkorlatok.o_varazslo = 0
|
||||||
|
szintkorlatok.o_amazon = 20
|
||||||
|
break
|
||||||
|
case Faj2E.Birodalmi:
|
||||||
|
szintkorlatok.o_harcos = 7
|
||||||
|
szintkorlatok.o_barbar = 7
|
||||||
|
szintkorlatok.o_ijasz = 7
|
||||||
|
szintkorlatok.o_kaloz = 7
|
||||||
|
szintkorlatok.o_pap = 5
|
||||||
|
szintkorlatok.o_tolvaj = 5
|
||||||
|
break
|
||||||
|
case Faj2E.Eszaki:
|
||||||
|
case Faj2E.Nomad:
|
||||||
|
szintkorlatok.o_pap = 7
|
||||||
|
szintkorlatok.o_illuzionista = 5
|
||||||
|
szintkorlatok.o_varazslo = 5
|
||||||
|
break
|
||||||
|
case Faj2E.Osember:
|
||||||
|
szintkorlatok.o_pap = 7
|
||||||
|
szintkorlatok.o_tolvaj = 4
|
||||||
|
szintkorlatok.o_illuzionista = 0
|
||||||
|
szintkorlatok.o_varazslo = 0
|
||||||
|
break
|
||||||
|
case Faj2E.Elf:
|
||||||
|
szintkorlatok.o_pap = 7
|
||||||
|
szintkorlatok.o_tolvaj = 6
|
||||||
|
szintkorlatok.o_illuzionista = 9
|
||||||
|
szintkorlatok.o_varazslo = 9
|
||||||
|
szintkorlatok.o_harcos = 9
|
||||||
|
szintkorlatok.o_barbar = 9
|
||||||
|
szintkorlatok.o_ijasz = 9
|
||||||
|
szintkorlatok.o_kaloz = 9
|
||||||
|
break
|
||||||
|
case Faj2E.Felelf:
|
||||||
|
szintkorlatok.o_pap = 5
|
||||||
|
szintkorlatok.o_tolvaj = 9
|
||||||
|
szintkorlatok.o_illuzionista = 9
|
||||||
|
szintkorlatok.o_varazslo = 9
|
||||||
|
szintkorlatok.o_harcos = 9
|
||||||
|
szintkorlatok.o_barbar = 9
|
||||||
|
szintkorlatok.o_ijasz = 9
|
||||||
|
szintkorlatok.o_kaloz = 9
|
||||||
|
break
|
||||||
|
case Faj2E.Felork:
|
||||||
|
szintkorlatok.o_pap = 5
|
||||||
|
szintkorlatok.o_tolvaj = 9
|
||||||
|
szintkorlatok.o_illuzionista = 5
|
||||||
|
szintkorlatok.o_varazslo = 5
|
||||||
|
szintkorlatok.o_harcos = 9
|
||||||
|
szintkorlatok.o_barbar = 9
|
||||||
|
szintkorlatok.o_ijasz = 9
|
||||||
|
szintkorlatok.o_kaloz = 9
|
||||||
|
break
|
||||||
|
case Faj2E.Felszerzet:
|
||||||
|
szintkorlatok.o_pap = 6
|
||||||
|
szintkorlatok.o_tolvaj = 9
|
||||||
|
szintkorlatok.o_illuzionista = 4
|
||||||
|
szintkorlatok.o_varazslo = 4
|
||||||
|
szintkorlatok.o_harcos = 6
|
||||||
|
szintkorlatok.o_barbar = 6
|
||||||
|
szintkorlatok.o_ijasz = 6
|
||||||
|
szintkorlatok.o_kaloz = 6
|
||||||
|
break
|
||||||
|
case Faj2E.Gnom:
|
||||||
|
szintkorlatok.o_pap = 6
|
||||||
|
szintkorlatok.o_tolvaj = 8
|
||||||
|
szintkorlatok.o_illuzionista = 7
|
||||||
|
szintkorlatok.o_varazslo = 7
|
||||||
|
szintkorlatok.o_harcos = 6
|
||||||
|
szintkorlatok.o_barbar = 6
|
||||||
|
szintkorlatok.o_ijasz = 6
|
||||||
|
szintkorlatok.o_kaloz = 6
|
||||||
|
break
|
||||||
|
case Faj2E.Torpe:
|
||||||
|
szintkorlatok.o_pap = 9
|
||||||
|
szintkorlatok.o_tolvaj = 6
|
||||||
|
szintkorlatok.o_illuzionista = 4
|
||||||
|
szintkorlatok.o_varazslo = 4
|
||||||
|
szintkorlatok.o_harcos = 9
|
||||||
|
szintkorlatok.o_barbar = 9
|
||||||
|
szintkorlatok.o_ijasz = 9
|
||||||
|
szintkorlatok.o_kaloz = 9
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return szintkorlatok
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
export type JellemID = 'TJ' | 'SJ' | 'KJ' | 'TS' | 'S' | 'KS' | 'TG' | 'SG' | 'KG'
|
||||||
|
|
||||||
|
export const AllJellemIDs: JellemID[] = ['TJ', 'SJ', 'KJ', 'TS', 'S', 'KS', 'TG', 'SG', 'KG']
|
||||||
|
|
||||||
|
export interface Jellem {
|
||||||
|
ID: JellemID
|
||||||
|
Label: string
|
||||||
|
Description: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export function GetJellem(id: JellemID): Jellem {
|
||||||
|
switch (id) {
|
||||||
|
case "TJ": return {
|
||||||
|
ID: "TJ",
|
||||||
|
Label: "Törvényes Jó",
|
||||||
|
Description: "A törvényes jó karakterek betartják és fontosnak tartják az igazságos törvényeket, valamint a kiérdemelt tekintély tiszteletét. Viselkedésükben lehetőleg egyenesek, és nem okoznak szükségtelen károkat másnak; továbbá segítenek a kevésbé szerencséseken.",
|
||||||
|
}
|
||||||
|
case "SJ": return {
|
||||||
|
ID: "SJ",
|
||||||
|
Label: "Semleges Jó",
|
||||||
|
Description: "A semleges jó karakterek általában jóindulatúak, de nem jellemző rájuk sem a törvényes jók szigora, sem a kaotikus jók kiszámíthatatlansága.",
|
||||||
|
}
|
||||||
|
case "KJ": return {
|
||||||
|
ID: "KJ",
|
||||||
|
Label: "Kaotikus Jó",
|
||||||
|
Description: "A kaotikus jó karakterek nagy súlyt fektetnek az egyéni szabadságra és a jótéteményekre – akkor is, ha ezek a nézetek és tettek ellentétesek a társadalmi szokásokkal és írott törvényekkel.",
|
||||||
|
}
|
||||||
|
case "TS": return {
|
||||||
|
ID: "TS",
|
||||||
|
Label: "Törvényes Semleges",
|
||||||
|
Description: "A törvényes semleges karakterek szigorúan betartják a törvényeket és adott szavukat, de ez a törvénytisztelet nem altruizmusból, hanem elsősorban önzésből, közömbösségből vagy a törvények öncélú tiszteletéből fakad.",
|
||||||
|
}
|
||||||
|
case "S": return {
|
||||||
|
ID: "S",
|
||||||
|
Label: "Semleges",
|
||||||
|
Description: "A semleges karakterek vagy nem törődnek a fontos erkölcsi kérdésekkel – azaz nem kötelezik el magukat egyes ügyek mellett – vagy éppen ellenkezőleg, aktívan a különféle nézetek közötti egyensúlyra és harmóniára törekednek. Az átlagemberek többsége ehhez a jellemhez tartozik.",
|
||||||
|
}
|
||||||
|
case "KS": return {
|
||||||
|
ID: "KS",
|
||||||
|
Label: "Kaotikus Semleges",
|
||||||
|
Description: "A kaotikus semleges karakterek kiszámíthatatlanok, saját boldogulásukra törekednek akár mások ellenében is. A kalandozók igen jelentős része kaotikus semleges jellemű"
|
||||||
|
}
|
||||||
|
case "TG": return {
|
||||||
|
ID: "TG",
|
||||||
|
Label: "Törvényes Gonosz",
|
||||||
|
Description: "A törvényes gonosz karakterek lételeme a törvényadta lehetőségek kihasználása mások kisemmizésére és önmaguk gyarapítására. Nem csoda, hogy számos zsarnok és kiskirály e jellem képviselője.",
|
||||||
|
}
|
||||||
|
case "SG": return {
|
||||||
|
ID: "SG",
|
||||||
|
Label: "Semleges Gonosz",
|
||||||
|
Description: "A semleges gonosz karakterek döntően aljasak és rosszindulatúak, s céljaikat hol a törvények kijátszásával, hol a rájuk való hivatkozással érik el."
|
||||||
|
}
|
||||||
|
case "KG": return {
|
||||||
|
ID: "KG",
|
||||||
|
Label: "Kaotikus Gonosz",
|
||||||
|
Description: "A kaotikus gonosz karakterek kíméletlenül, mindenen és mindenkin átgázolva hajszolják a hatalmat vagy a vagyont, s ennek érdekében bármilyen gaztettre képesek."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
import {KarakterTulajdonsagok, TulajdonsagDefaults} from "./tulajdonsag2E";
|
||||||
|
import {Faj2E} from "./faj2E";
|
||||||
|
import {Osztaly2E} from "./osztaly2E";
|
||||||
|
import {KepzettsegId} from "./kepzettsegek2E";
|
||||||
|
import {JellemID} from "./jellem";
|
||||||
|
|
||||||
|
export interface Karakter2E {
|
||||||
|
name: string,
|
||||||
|
nem?: string,
|
||||||
|
kor: number,
|
||||||
|
isten?: string,
|
||||||
|
jellem: JellemID,
|
||||||
|
tulajdonsagok: KarakterTulajdonsagok
|
||||||
|
faj: Faj2E
|
||||||
|
osztaly: Osztaly2E
|
||||||
|
harcosSpecializaciok: string[],
|
||||||
|
kalozKritikus: string[],
|
||||||
|
kepzettsegek: KepzettsegId[]
|
||||||
|
tolvajKepzettsegek?: KepzettsegId[]
|
||||||
|
}
|
||||||
|
export const DefaultKarakter: Karakter2E = {
|
||||||
|
name: 'Névtelen Kalandozó',
|
||||||
|
kor: 20,
|
||||||
|
jellem: 'S',
|
||||||
|
tulajdonsagok: TulajdonsagDefaults,
|
||||||
|
faj: Faj2E.Ember,
|
||||||
|
osztaly: Osztaly2E.Tengeresz,
|
||||||
|
harcosSpecializaciok: [],
|
||||||
|
kalozKritikus: [],
|
||||||
|
kepzettsegek: [],
|
||||||
|
tolvajKepzettsegek: [],
|
||||||
|
}
|
||||||
@@ -0,0 +1,333 @@
|
|||||||
|
import {Osztaly2E} from "./osztaly2E";
|
||||||
|
import {Faj2E} from "./faj2E";
|
||||||
|
import {Karakter2E} from "./karakter2E";
|
||||||
|
import {Modifier, Tulajdonsag2E} from "./tulajdonsag2E";
|
||||||
|
|
||||||
|
export type KepzettsegId = 'k_alkimia' | 'k_alcazas' | 'k_allatidomitas' | 'k_csapdak' | 'k_csillagjoslas' | 'k_egyensulyozas' | 'k_eloadas' | 'k_ertekbecsles' | 'k_gyogyitas' | 'k_hajozas' | 'k_hallgatozas' | 'k_hamisitas' | 'k_herbalizmus' | 'k_historia' | 'k_jelek_olvasasa' | 'k_lovaglas' | 'k_maszas' | 'k_megfigyeles' | 'k_meregkeveres' | 'k_mesterseg' | 'k_nyomkereses' | 'k_okkultizmus' | 'k_osonas' | 'k_szabadulomuveszet' | 'k_ugras' | 'k_uszas' | 'k_vadonjaras' | 'k_zarnyitas' | 'k_zsebmetszes'
|
||||||
|
|
||||||
|
export interface Kepzettseg {
|
||||||
|
Id: KepzettsegId,
|
||||||
|
Name: string,
|
||||||
|
Description: string,
|
||||||
|
Tulajdonsag: Tulajdonsag2E[],
|
||||||
|
Osztalyok?: Osztaly2E[],
|
||||||
|
}
|
||||||
|
|
||||||
|
export const KepzettsegLista: Kepzettseg[] = [
|
||||||
|
{
|
||||||
|
Id: 'k_alkimia',
|
||||||
|
Name: 'Alkímia',
|
||||||
|
Description: 'Különféle különleges anyagok, pl. savak, görögtűz,és különböző varázskomponensek kikeverésére szolgál. Használatához gyakran jól felszerelt laboratórium szükséges. A képzettséggel a karakter képes beazonosítani a különféle vegyi anyagokat és mérgeket, Nehéz próbával a varázsitalokat is',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Intelligencia],
|
||||||
|
Osztalyok: [Osztaly2E.Druida, Osztaly2E.Illuzionista, Osztaly2E.Pap, Osztaly2E.Varazslo, Osztaly2E.Vandor]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_alcazas',
|
||||||
|
Name: 'Álcázás',
|
||||||
|
Description: 'Álöltözetek készítése és használata. Próbadobást akkor kell dobni, ha az álca hitelességét valaki kétségbe vonhatja (általában ellenpróbaként; az eredményt gyakran csak a mesélő ismerheti)',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Karizma],
|
||||||
|
Osztalyok: [Osztaly2E.Tolvaj],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_allatidomitas',
|
||||||
|
Name: 'Állatidomítás',
|
||||||
|
Description: 'Állatok megszelídítésére és betanítására szolgál. A járatos karakter próbát tehet arra is, hogy a különféle vadállatok ne tekintsék ellenségüknek vagy prédájuknak',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Karizma],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_csapdak',
|
||||||
|
Name: 'Csapdák',
|
||||||
|
Description: 'A karakter a rendelkezésre álló idő és alapanyagok függvényében szimpla vagy komplex csapdákat készíthet. A képzettség arra is jó, hogy hatástalanítsa, tönkretegye, vagy elkerülje ezeket a szerkezeteket. Ha egy csapda eltávolítására tett próba sikertelen, az kisülhet és veszélybe sodorhatja az óvatlan próbálkozót.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Ugyesseg],
|
||||||
|
Osztalyok: [Osztaly2E.Tolvaj],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_csillagjoslas',
|
||||||
|
Name: 'Csillagjóslás',
|
||||||
|
Description: 'A karakter a képzettséggel egyrészt képes meghatározni a csapat hozzávetőleges pozícióját a térképen (hexek vagy tájegység szerint), másrészt egyszerűbb jóslatokat készíthet. A jóslat sikertelen próbánál értelmezhetetlen, Közepes nehézségnél homályos, Nehéz próbánál többértelmű, Hősies próbánál pedig világos és jól értelmezhető. Egyetlen jóslat sem tárja fel a pontos jövőt, csak segítséget vagy jelet ad annak értelmezéséhez. A képzettséget csak tiszta, csillagos égbolt alatt vagy ritka asztrológiai térképek birtokában lehet használni (ezek ára 2000 at vagy több, és így is -2 jár a próbára).',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Bolcsesseg],
|
||||||
|
Osztalyok: [Osztaly2E.Druida, Osztaly2E.Illuzionista, Osztaly2E.Pap, Osztaly2E.Varazslo, Osztaly2E.Vandor]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_egyensulyozas',
|
||||||
|
Name: 'Egyensúlyozás',
|
||||||
|
Description: 'Omlatag talajon, kötélen vagy keskeny párkányon való átjutáshoz szükséges képzettség. Ha a próba sikertelen, a karakter lezuhan.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Ugyesseg],
|
||||||
|
Osztalyok: [Osztaly2E.Tolvaj],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_eloadas',
|
||||||
|
Name: 'Előadás',
|
||||||
|
Description: 'A képzettséggel rendelkező karakter járatos a hangszerek használatában, éneklésben, eposzmondásban, stb.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Karizma],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_ertekbecsles',
|
||||||
|
Name: 'Értékbecslés',
|
||||||
|
Description: 'Sikeres próba esetén a karakter hozzávetőlegesen felméri egy tárgy pénzbeli értékét, és Nehéz vagy jobb próbán kiszúrja a hamisítványokat.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Intelligencia],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_gyogyitas',
|
||||||
|
Name: 'Gyógyítás',
|
||||||
|
Description: 'A sebek bekötözésének, mérgek és betegségek semlegesítésének vagy enyhítésének tudománya. Harc vagy más sérülés után alkalmazva a bekötözött karakter siker esetén visszanyer 1d4 elvesztett Hp-t, Nehéz próba megdobása esetén 1d4+2-t, Hősies esetén pedig 1d4+4-et. 1-es dobáson 1d4 pontot veszít. A képzettség hatékony alkalmazásához egy adag gyógyfű vagy egy orvosló készlet szükséges; nélkülük legfeljebb 1d4 Hp adható vissza.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Bolcsesseg],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_hajozas',
|
||||||
|
Name: 'Hajózás',
|
||||||
|
Description: 'A karakter ismeri a hajózás fogásait, tehát elkormányoz kisebb vitorlásokat vagy gályákat, tudja hogyan kell elkerülni a zátonyokat és épen kikerülni egy viharból, képes javításokat végezni stb.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Ugyesseg],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_hallgatozas',
|
||||||
|
Name: 'Hallgatózás',
|
||||||
|
Description: 'Nehezen hallható zajok, beszéd meghallása és kihallgatása.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Bolcsesseg],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_hamisitas',
|
||||||
|
Name: 'Hamisítás',
|
||||||
|
Description: 'A képzettséggel néhány óra vagy nap munkájával hamis pénz, iratok, pecsétek és értéktárgyak készíthetők. Ellenpróbát akkor kell dobni, ha a hamisítvány hitelességét valaki kétségbe vonná.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Intelligencia],
|
||||||
|
Osztalyok: [Osztaly2E.Tolvaj],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_herbalizmus',
|
||||||
|
Name: 'Herbalizmus',
|
||||||
|
Description: 'A képzettség sikeres alkalmazásával (Közepes, Nehéz és Hősies eredménnyel) 1d3 / 1d3+1 / 1d3+2 adag, a Gyógyítás vagy Méregkeverés képzettséghez hasznos fű gyűjthető össze, az utóbbinál -2, terméketlen vidékeken -3 módosítóval. Utazás közben naponta egy, táborozva két próba dobható.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Bolcsesseg],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_historia',
|
||||||
|
Name: 'História',
|
||||||
|
Description: 'A karakter ismeri a történetírók munkáit vagy a szóhagyományt. Az ismeretek mértékét és pontosságát a képzettségpróba eredménye mutatja. Természetesen gyakran vannak olyan helyezetek, amikor a képzettség nem ad használható ismeretet.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Intelligencia],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_jelek_olvasasa',
|
||||||
|
Name: 'Jelek Olvasása',
|
||||||
|
Description: 'A képzettséggel a karakter el tud olvasni más nyelven írt írásokat és feliratokat.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Intelligencia],
|
||||||
|
Osztalyok: [Osztaly2E.Druida, Osztaly2E.Illuzionista, Osztaly2E.Pap, Osztaly2E.Varazslo, Osztaly2E.Vandor, Osztaly2E.Tolvaj]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_lovaglas',
|
||||||
|
Name: 'Lovaglás',
|
||||||
|
Description: 'A karakter kiemelkedően jól ért a lovagláshoz; harcban és nehéz helyzetekben is csodákra képes sarkallni hátasát.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Ugyesseg],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_maszas',
|
||||||
|
Name: 'Mászás',
|
||||||
|
Description: 'A képzettség olyan falakra való felmászásra alkalmas, ami egy átlagembernek komol gondot jelentene. Sikertelen próba esetén a karakter lezuhan, vagy a feladat meghaladja a képességeit.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Ero],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_megfigyeles',
|
||||||
|
Name: 'Megfigyelés',
|
||||||
|
Description: 'A karakter észreveszi a szabad szemmel látható veszélyforrásokat, a rá leselkedő támadókat, és a csak az avatott megfigyelő számára látható részleteket. (A szobák átkutatásához vagy pl. titkosajtók megtalálásához azonban nem szükséges ez a képzettség.)',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Bolcsesseg],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_meregkeveres',
|
||||||
|
Name: 'Méregkeverés',
|
||||||
|
Description: 'A megfelelő eszközök és alapanyagok birtokában különféle mérgek készíthetők. Sikertelen próbadobás esetén a keverék hatástalan, és a méregkeverő 1:6 eséllyel veszélybe sodorja önmagát.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Intelligencia],
|
||||||
|
Osztalyok: [Osztaly2E.Tolvaj],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_mesterseg',
|
||||||
|
Name: 'Mesterség',
|
||||||
|
Description: 'A karakter járatos egy kiválasztott mesterségben – pl. kovácsolás, adószedés vagy építészet. A kézügyességet igénylő mesterségekhez Ügyesség, a szellemi foglalkozásokhoz Intelligencia szükséges.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Intelligencia, Tulajdonsag2E.Ugyesseg],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_nyomkereses',
|
||||||
|
Name: 'Nyomkeresés',
|
||||||
|
Description: 'A karakter képes a nyomok követésére és hozzávetőleges azonosítására, vagyis megtudhatja, milyen régiek, miféle szerzet hagyta őket, milyen gyorsan haladt a nyomokat hagyó stb.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Bolcsesseg],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_okkultizmus',
|
||||||
|
Name: 'Okkultizmus',
|
||||||
|
Description: 'A képzettség a mágikus tanok elméleti és gyakorlati ismeretét jelenti. Számos hasznán belül a karakter Közepes próbával azonosíthatja az elmondás alatt álló varázslatokat, Nehéz próbával pedig a mágikus effektusokat és csapdákat.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Intelligencia],
|
||||||
|
Osztalyok: [Osztaly2E.Druida, Osztaly2E.Illuzionista, Osztaly2E.Pap, Osztaly2E.Varazslo, Osztaly2E.Vandor]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_osonas',
|
||||||
|
Name: 'Osonás',
|
||||||
|
Description: 'Csöndes és gyors mozgást tesz lehetővé, s azt, hogy a karakter elrejtőzzön a figyelmes tekintetek elől – nagy szakértelemmel akár sötét sarkokban vagy árnyékokban is. Nehéz próba megdobásával az aktívan nem figyelő ellenfelek nem is dobhatnak ellenpróbát a felfedésére, Hősies próba esetén a karakter gyakorlatilag „mintha ott sem lenne”.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Ugyesseg],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_szabadulomuveszet',
|
||||||
|
Name: 'Szabadulóművészet',
|
||||||
|
Description: 'A karakter képes kiszabadulni kötelékeiből és láncaiból, és ami még fontosabb, ellenségei gyűrűjéből (lásd harcrendszer).',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Ugyesseg],
|
||||||
|
Osztalyok: [Osztaly2E.Tolvaj],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_ugras',
|
||||||
|
Name: 'Ugrás',
|
||||||
|
Description: 'A karakter képes átugrani szélesebb vagy magasabb akadályokat is, és tompíthatja az esésből származó sebesüléseket (sikeres próbával egy kocka, Nehéz próbával kettő, Hősiessel három). Ha a próba sikertelen, a karakter lezuhan.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Ero],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_uszas',
|
||||||
|
Name: 'Úszás',
|
||||||
|
Description: 'A karakter jól tud úszni, akár nehéz körülmények között (zajló vízben, megterhelten stb.) is képes a felszínen maradni.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Ero],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_vadonjaras',
|
||||||
|
Name: 'Vadonjárás',
|
||||||
|
Description: 'A képzettség segít a vadonbeli megélhetésben, tájékozódásban és túlélésben. Sikeres képzettségpróbával (Közepes, Nehéz és Hősies nehézség megdobása esetén) 1d3 / 1d3+2 / 1d3+4 adag élelmet eredményez, terméketlen vidékeken az utóbbi dobásra -3 módosítóval. Utazás közben naponta egy, táborozva két próba dobható. A képzettség segít abban is, hogy a csapat ne tévedjen el a sűrű erdőkben, kietlen sivatagokban vagy zegzugos szurdokvölgyekben. Végül a képzettségpróba sikere befolyásolja, hogy milyen táborhelyet sikerül találni a vadonban: ha a mesélő máshogy nem határoz, sikeres próbával kettőre, Nehéz próbával egyre csökkenti, Hősies próbával teljesen elkerüli az éjszakai találkozási esélyeket.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Bolcsesseg],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_zarnyitas',
|
||||||
|
Name: 'Zárnyitás',
|
||||||
|
Description: 'Tolvajszerszámok segítségével a karakter felnyithatja a különféle mechanikus zárakat. Sikertelen próba esetén nem képes az adott zár felnyitására – egészen addig, amíg új tapasztalatokat nem szerez (vagyis a következő szintlépéséig).',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Ugyesseg],
|
||||||
|
Osztalyok: [Osztaly2E.Tolvaj],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 'k_zsebmetszes',
|
||||||
|
Name: 'Zsebmetszés',
|
||||||
|
Description: 'Őrizetlenül hagyott vagy övön, zsebben található kisebb tárgyak észrevétlen eltulajdonítása. Ha a próba sikertelen, a karaktert észreveszik vagy legalábbis gyanút kelt. Másféle, kézügyességet igénylő fogásokra is alkalmas.',
|
||||||
|
Tulajdonsag: [Tulajdonsag2E.Ugyesseg],
|
||||||
|
Osztalyok: [Osztaly2E.Tolvaj],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export const TolvajKepzettsegList = KepzettsegLista.filter(x => x.Osztalyok?.includes(Osztaly2E.Tolvaj))
|
||||||
|
|
||||||
|
export const Kepzettsegek: Record<KepzettsegId, Kepzettseg> =
|
||||||
|
KepzettsegLista.reduce(
|
||||||
|
(acc: Record<KepzettsegId, Kepzettseg>, k) => { acc[k.Id] = k; return acc; },
|
||||||
|
{} as Record<KepzettsegId, Kepzettseg>);
|
||||||
|
|
||||||
|
export function AvailableKezpettsegList(osztaly: Osztaly2E): Kepzettseg[] {
|
||||||
|
return KepzettsegLista.filter(k => k.Osztalyok == null || k.Osztalyok.includes(osztaly))
|
||||||
|
}
|
||||||
|
|
||||||
|
export function GetNumberOfKepzettsegek(t_int: number, faj: Faj2E, max: number = 11) {
|
||||||
|
//max = 3 + 1 + 3 + 4 // 3 base, 1 human, 3 from max ability modifier, 4 from Thief
|
||||||
|
let numberOfKepzettseg = 3 + Modifier(t_int) + (faj === Faj2E.Ember ? 1 : 0)
|
||||||
|
|
||||||
|
if (numberOfKepzettseg < 1) {
|
||||||
|
numberOfKepzettseg = 1
|
||||||
|
console.log('Adjusted Number of Kepzetsegek = ', numberOfKepzettseg)
|
||||||
|
}
|
||||||
|
if (numberOfKepzettseg > max) {
|
||||||
|
numberOfKepzettseg = max
|
||||||
|
console.log('Adjusted Number of Kepzetsegek = ', numberOfKepzettseg)
|
||||||
|
}
|
||||||
|
return numberOfKepzettseg;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function SetDefaultTolvajKepzettsegek(karakter: Pick<Karakter2E, 'osztaly' | 'tolvajKepzettsegek'>, changeTolvajKepzettsegek: (tolvajKepzettsegek?: KepzettsegId[]) => void) {
|
||||||
|
if (karakter.osztaly !== Osztaly2E.Tolvaj && karakter.tolvajKepzettsegek != null) {
|
||||||
|
changeTolvajKepzettsegek(undefined)
|
||||||
|
}
|
||||||
|
if (karakter.osztaly === Osztaly2E.Tolvaj && (karakter.tolvajKepzettsegek == null || karakter.tolvajKepzettsegek.length === 0)) {
|
||||||
|
const tolvajKepzettsegek = TolvajKepzettsegList.slice(0, 4).map(x => x.Id)
|
||||||
|
changeTolvajKepzettsegek(tolvajKepzettsegek)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function GetKepzettsegListaN(karakter: Pick<Karakter2E, 'osztaly' | 'faj' | 'kepzettsegek' | 'tolvajKepzettsegek'>) {
|
||||||
|
const availableKepzettsegList = AvailableKezpettsegList(karakter.osztaly)
|
||||||
|
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]
|
||||||
|
}
|
||||||
|
if (karakter.faj === Faj2E.Birodalmi && karakter.osztaly !== Osztaly2E.Tolvaj) {
|
||||||
|
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 (karakter.osztaly === Osztaly2E.Druida || karakter.osztaly === Osztaly2E.Vandor) {
|
||||||
|
return [Kepzettsegek.k_vadonjaras]
|
||||||
|
}
|
||||||
|
if (karakter.osztaly === Osztaly2E.Dalnok) {
|
||||||
|
return [Kepzettsegek.k_eloadas]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (n === 1) {
|
||||||
|
if (karakter.osztaly === Osztaly2E.Dalnok
|
||||||
|
&& [Faj2E.Eszaki, Faj2E.Nomad, Faj2E.Birodalmi, Faj2E.Torpe, Faj2E.Elf, Faj2E.Felelf].includes(karakter.faj)) {
|
||||||
|
return [Kepzettsegek.k_eloadas]
|
||||||
|
}
|
||||||
|
if ([Osztaly2E.Druida, Osztaly2E.Vandor].includes(karakter.osztaly)
|
||||||
|
&& [Faj2E.Eszaki, Faj2E.Nomad, Faj2E.Birodalmi, Faj2E.Torpe].includes(karakter.faj)) {
|
||||||
|
return [Kepzettsegek.k_vadonjaras]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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, 'osztaly' | 'faj' | 'tulajdonsagok' | 'kepzettsegek' | 'tolvajKepzettsegek'>, changeKepzettsegek: (k: KepzettsegId[]) => void) {
|
||||||
|
const availableKepzettsegList = AvailableKezpettsegList(karakter.osztaly)
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,376 @@
|
|||||||
|
export enum Osztaly2E {
|
||||||
|
Harcos = 'o_2e_harcos',
|
||||||
|
Ijasz = 'o_2e_ijasz',
|
||||||
|
Amazon = 'o_2e_amazon',
|
||||||
|
Tengeresz = 'o_2e_tengeresz',
|
||||||
|
Barbar = 'o_2e_barbar',
|
||||||
|
|
||||||
|
Pap = 'o_2e_pap',
|
||||||
|
Tolvaj = 'o_2e_tolvaj',
|
||||||
|
Varazslo = 'o_2e_varazslo',
|
||||||
|
Illuzionista = 'o_2e_illuzionista',
|
||||||
|
|
||||||
|
Dalnok = 'o_2e_dalnok',
|
||||||
|
Druida = 'o_2e_druida',
|
||||||
|
Vandor = 'o_2e_vandor',
|
||||||
|
}
|
||||||
|
|
||||||
|
export function OsztalyLabel(osztaly: Osztaly2E) : string {
|
||||||
|
switch (osztaly) {
|
||||||
|
case Osztaly2E.Amazon: return 'Amazon';
|
||||||
|
case Osztaly2E.Barbar: return 'Barbár';
|
||||||
|
case Osztaly2E.Pap: return 'Pap';
|
||||||
|
case Osztaly2E.Illuzionista: return 'Illúzionista';
|
||||||
|
case Osztaly2E.Varazslo: return 'Varázsló';
|
||||||
|
case Osztaly2E.Harcos: return 'Harcos';
|
||||||
|
case Osztaly2E.Ijasz: return 'Íjász';
|
||||||
|
case Osztaly2E.Tengeresz: return 'Tengerész';
|
||||||
|
case Osztaly2E.Tolvaj: return 'Tolvaj';
|
||||||
|
case Osztaly2E.Dalnok: return 'Dalnok';
|
||||||
|
case Osztaly2E.Druida: return 'Druida';
|
||||||
|
case Osztaly2E.Vandor: return 'Vándor';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function OsztalyDescription(osztaly: Osztaly2E) : string {
|
||||||
|
switch (osztaly) {
|
||||||
|
case Osztaly2E.Harcos:
|
||||||
|
case Osztaly2E.Amazon:
|
||||||
|
case Osztaly2E.Barbar:
|
||||||
|
case Osztaly2E.Ijasz:
|
||||||
|
case Osztaly2E.Tengeresz:
|
||||||
|
return 'A harcosok a fegyverhasználat mesterei. Megállják a helyüket a közelharcban és a távolsági összecsapásokban is, és sokkal jobban viselik a sebesüléseket, mint más osztályok képviselői. Ez az osztály mind közül a leggyakoribb, de egyben a legváltozatosabb is – öt alosztállyal rendelkezik.';
|
||||||
|
case Osztaly2E.Tolvaj:
|
||||||
|
return 'A tolvajok a becstelen harcban és a csöndes gyilkolásban járatosak (közülük sokan alkalmaznak mérgeket – őket orgyilkosoknak nevezik). Harci képességeik és életerejük viszonylag gyenge, s nehezebb vértezeteket sem használhatnak. Ezért ha módjukban áll, nem szemtől szembe, hanem lesből támadnak áldozataikra, és ha ez nem sikerülne, gyorsan kereket oldanak. Emellett alvilági pályafutásuk során számos hasznos képzettségben válnak járatossá.';
|
||||||
|
case Osztaly2E.Pap:
|
||||||
|
return 'A papok az istenek militáns varázshasználó szolgái. Hitük parancsait minden körülmények között be kell tartaniuk, s bizonyos rendszerességgel áldozatokat kell bemutatniuk. A papok csak istenükkel azonos vagy attól legfeljebb eggyel különböző jelleműek lehetnek. A papok csak az istenük által kijelölt fegyvereket forgathatják, de szabadon válogathatnak a különféle vértek között.';
|
||||||
|
case Osztaly2E.Varazslo:
|
||||||
|
return 'A varázslók kiemelkedő szellemi fegyelmezettségük segítségével képesek a magasabb fokú mágikus erőket irányító varázsigék memorizálására és fölhasználására. Tudásukat varázskönyvekben rögzítik, s mindent elkövetnek egy ismeretlen formula megszerzéséért. Többségüket a magabiztos önhittség és az alacsonyabb szellemi képességűek megvetése jellemzi. Sem a varázslók, sem az illuzionisták nem képesek bármiféle páncélban varázsolni, és csak kevés fegyvertípus forgatásában járatosak.';
|
||||||
|
case Osztaly2E.Illuzionista:
|
||||||
|
return 'A varázslók kiemelkedő szellemi fegyelmezettségük segítségével képesek a magasabb fokú mágikus erőket irányító varázsigék memorizálására és fölhasználására. Tudásukat varázskönyvekben rögzítik, s mindent elkövetnek egy ismeretlen formula megszerzéséért. Többségüket a magabiztos önhittség és az alacsonyabb szellemi képességűek megvetése jellemzi. Az illuzionisták a varázslók alosztályaként a mágia egy hasonló, de több lényeges területen eltérő fajtáját művelik. Lételemük a káprázat, a megtévesztés és mások elméjének befolyásolása – többségük hipnotizőr vagy ügyes manipulátor. Az illuzionista varázslatok csekélyebb pusztító erőt képviselnek, ellenben egy élelmes illuzionista kezében nagyon sokrétűek. Sem a varázslók, sem az illuzionisták nem képesek bármiféle páncélban varázsolni, és csak kevés fegyvertípus forgatásában járatosak.';
|
||||||
|
case Osztaly2E.Dalnok:
|
||||||
|
return 'A dalnokok a legendák és hősi énekek ismerői, a tolvaj osztályhoz közeli, de tőlük eltérő képességekkel. A legtöbbjük állandóan az úton jár, s csak rövid időre marad egy helyben, hogy újabb dalokkal és legendákkal gyarapítsa repertoárját, és újabb meg újabb közönségek előtt próbálja ki tudását. A dalnok opcionális osztály, és mesélői engedéllyel indítható.';
|
||||||
|
case Osztaly2E.Druida:
|
||||||
|
return 'A druidák a természet erőit szolgáló aszkétikus misztikusok, akiknek rendje az emberi kor elejére néz vissza. Céljaikat titkok köde övezi, amelyet ők maguk sem igyekeznek eloszlatni (s elárulóit ők maguk vadásszák le). Vannak, akik szerint az Egyensúly ügyét képviselik, mások szerint az emberiség visszavadításán és a civilizáció lerombolásán munkálkodnak, vagy emberáldozatoknak hódolnak. Az biztos, munkájuk valamilyen formában a kőkörökhöz, faragott kövekhez, és az ősi vérvonalak fenntartásához fűzi őket. Hitük része a szent eskü, melynek keretén belül megfogadják, hogy csak az ősi druida rend tradicionális fegyvereit használják, és nem viselnek olyan vértet, amely fémet tartalmaz. A druidáknak, szintén fogadalmuk révén, legalább részben Semleges jelleműnek kell lenniük, és nem lehetnek többosztályúak. A druida opcionális osztály, és mesélői engedéllyel indítható.'
|
||||||
|
case Osztaly2E.Vandor:
|
||||||
|
return 'A vándorok a vadonbeli túlélés mestereiként ismert harcosok. Ezen kívül sokat foglalkoznak ősi legendák, főleg régi civilizációk, romok feltárásával. Távoli kapcsolatban állnak a druidák rendjével, és sokan az ő ügynökeiknek tekintik őket, de a kapcsolat sokkal lazább, és gyakran csak a kölcsönös tiszteletig terjed. A vándor opcionális osztály, és mesélői engedéllyel indítható.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function OsztalyProperties(osztaly: Osztaly2E) : string[] {
|
||||||
|
switch (osztaly) {
|
||||||
|
case Osztaly2E.Harcos: return [
|
||||||
|
'Támadásbónusz: Szint x 1',
|
||||||
|
'Mentődobások: Kitartás az első, Reflex és Akaraterő a második oszlop szerint',
|
||||||
|
'Fegyverhasználat: bármilyen',
|
||||||
|
'Páncélhasználat: bármilyen',
|
||||||
|
'Hp: szintenként 1d10, 9. szint („Nagyúr”) fölött 3/szint',
|
||||||
|
'Képzettségek: 3',
|
||||||
|
]
|
||||||
|
case Osztaly2E.Ijasz: return [
|
||||||
|
'Támadásbónusz: Szint x 1',
|
||||||
|
'Mentődobások: Kitartás az első, Reflex és Akaraterő a második oszlop szerint',
|
||||||
|
'Fegyverhasználat: bármilyen',
|
||||||
|
'Páncélhasználat: nehéz vérteken kívül bármilyen',
|
||||||
|
'Hp: szintenként 1d10, 9. szint („Nagyúr”) fölött 3/szint',
|
||||||
|
'Képzettségek: 3',
|
||||||
|
]
|
||||||
|
case Osztaly2E.Amazon: return [
|
||||||
|
'Támadásbónusz: Szint x 1',
|
||||||
|
'Mentődobások: Kitartás az első, Reflex és Akaraterő a második oszlop szerint',
|
||||||
|
'Fegyverhasználat: bármilyen',
|
||||||
|
'Páncélhasználat: csak könnyű vértek',
|
||||||
|
'Hp: szintenként 1d10, 9. szint („Nagyúr”) fölött 3/szint',
|
||||||
|
'Képzettségek: 3',
|
||||||
|
]
|
||||||
|
case Osztaly2E.Tengeresz: return [
|
||||||
|
'Támadásbónusz: Szint x 1',
|
||||||
|
'Mentődobások: Kitartás az első, Reflex és Akaraterő a második oszlop szerint',
|
||||||
|
'Fegyverhasználat: bármilyen',
|
||||||
|
'Páncélhasználat: nehéz vérteken kívül bármilyen',
|
||||||
|
'Hp: szintenként 1d10, 9. szint („Nagyúr”) fölött 3/szint',
|
||||||
|
'Képzettségek: 3',
|
||||||
|
]
|
||||||
|
case Osztaly2E.Barbar: return [
|
||||||
|
'Támadásbónusz: Szint x 1',
|
||||||
|
'Mentődobások: Kitartás az első, Reflex és Akaraterő a második oszlop szerint',
|
||||||
|
'Fegyverhasználat: bármilyen',
|
||||||
|
'Páncélhasználat: bármilyen',
|
||||||
|
'Hp: szintenként 1d12, 9. szint („Nagyúr”) fölött 3/szint',
|
||||||
|
'Képzettségek: 3',
|
||||||
|
]
|
||||||
|
case Osztaly2E.Pap: return [
|
||||||
|
'Támadásbónusz: Szint x 2/3',
|
||||||
|
'Mentődobás: Kitartás és Akaraterő az első, Reflex a második oszlop szerint',
|
||||||
|
'Fegyverhasználat: csak istenük kijelölt fegyvereit használhatják (általában buzogányokat és tőröket)',
|
||||||
|
'Páncélhasználat: bármilyen',
|
||||||
|
'Hp: szintenként 1d8, 9. szint („Főpap”) fölött 2/szint',
|
||||||
|
'Képzettségek: 3',
|
||||||
|
]
|
||||||
|
case Osztaly2E.Tolvaj: return [
|
||||||
|
'Támadásbónusz: Szint x 2/3',
|
||||||
|
'Mentődobás: Reflex az első, Kitartás és Akaraterő a második oszlop szerint',
|
||||||
|
'Fegyverhasználat: egykezes fegyvereket, rövidíjat és számszeríjakat használhatnak',
|
||||||
|
'Páncélhasználat: csak könnyű, pajzs nélkül',
|
||||||
|
'Hp: szintenként 1d6, 9. szint („Mestertolvaj”) fölött 2/szint',
|
||||||
|
'Képzettségek: 7 (ebből legalább 4 minden képpen a „tolvajképzettségek” listájáról); Sokoldalúságuknak köszönhetően 5. és 9. szinten kapnak egy új képzettséget'
|
||||||
|
]
|
||||||
|
case Osztaly2E.Varazslo:
|
||||||
|
case Osztaly2E.Illuzionista: return [
|
||||||
|
'Támadásbónusz: Szint x 1/2',
|
||||||
|
'Mentődobás: Akaraterő az első, Kitartás és Reflex a második oszlop szerint',
|
||||||
|
'Fegyverhasználat: tőrt, botot, dobótűket, bunkót és parittyát használhatnak',
|
||||||
|
'Páncélhasználat: nincs',
|
||||||
|
'Hp: szintenként 1d4, 9. szint („Varázslónagyúr”) fölött 1/szint',
|
||||||
|
'Képzettségek: 3',
|
||||||
|
];
|
||||||
|
case Osztaly2E.Dalnok: return [
|
||||||
|
'Támadásbónusz: Szint x 2/3',
|
||||||
|
'Mentődobások: Reflex az első, Kitartás és Akaraterő a második oszlop szerint',
|
||||||
|
'Fegyverhasználat: egykezes fegyverek, könnyű számszeríj, rövidíj',
|
||||||
|
'Páncélhasználat: könnyű és pajzsok',
|
||||||
|
'Hp: szintenként 1d6, 9. szint („Bárd”) fölött 2/szint',
|
||||||
|
'Képzettségek: 3, az egyik képzettségük mindenképpen az Előadás',
|
||||||
|
];
|
||||||
|
case Osztaly2E.Druida: return [
|
||||||
|
'Támadásbónusz: Szint x 2/3',
|
||||||
|
'Mentődobás: Kitartás és Akaraterő az első, Reflex a második oszlop szerint',
|
||||||
|
'Fegyverhasználat: bot, bunkósbot, tőr, dobótű, szablya, sarlókard, lándzsa, parittya.',
|
||||||
|
'Páncélhasználat: bőrvértet, szőrméket viselhetnek és fapajzsot hordhatnak.',
|
||||||
|
'Hp: szintenként 1d8, 9. szint („Fődruida”) fölött 2/szint.',
|
||||||
|
'Képzettségek: 3, az egyik képzettségük mindenképpen a Vadonjárás',
|
||||||
|
];
|
||||||
|
case Osztaly2E.Vandor: return [
|
||||||
|
'Támadásbónusz: Szint x 1',
|
||||||
|
'Mentődobások: Kitartás az első, Reflex és Akaraterő a második oszlop szerint',
|
||||||
|
'Fegyverhasználat: tetszőleges',
|
||||||
|
'Páncélhasználat: könnyű és pajzsok',
|
||||||
|
'Hp: szintenként 1d10, 9. szint („a Vadak Mestere”) fölött 3/szint',
|
||||||
|
'Képzettségek: 3, az egyik képzettségük mindenképpen a Vadonjárás',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Skill {
|
||||||
|
Id: string
|
||||||
|
Name: string,
|
||||||
|
Description: string
|
||||||
|
ExtendedDescription?: string[]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function OsztalySpecialSkills(osztaly: Osztaly2E) : Skill[] {
|
||||||
|
switch (osztaly) {
|
||||||
|
case Osztaly2E.Harcos: return [
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_harcos',
|
||||||
|
Name: 'Harcos',
|
||||||
|
Description: 'Speciális harci tapasztalatuknak köszönhetően minden páratlan szinten +2-t kapnak egy választott fegyvertípus (pl. kardok, buzogányok, fejszék, dobófegyverek, íjak stb.) sebzésére. 5. szinttől kétszer ugyanarra a típusra választva a sebzésbónusz +4-re emelhető'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
case Osztaly2E.Amazon: return [
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_amazon',
|
||||||
|
Name: 'Amazon',
|
||||||
|
Description: 'Ezek a barbár harcosnők szépségükről és karizmatikus jelenlétükre építő védekező harcmodorukról ismertek',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_amazon_vert',
|
||||||
|
Name: 'MMO vért',
|
||||||
|
Description: 'Az amazonok csak könnyű vérteket viselhetnek, de VO-juk szint/2-vel javul, továbbá Karizma- és Ügyességmódosítóik közül a kedvezőbbet választhatják a VO számításánál'
|
||||||
|
},
|
||||||
|
]
|
||||||
|
case Osztaly2E.Barbar: return [
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_barbar',
|
||||||
|
Name: 'Barbár',
|
||||||
|
Description: 'Pusztaságok, sarkvidéki jégmezők és fülledt őserdők lakói, akiket kegyetlen környezetük nevelt túlélővé'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_barbar_tulelo',
|
||||||
|
Name: 'Túlélő',
|
||||||
|
Description: 'A barbárok 1d12-vel dobják a Hp-jüket, és +1 bónuszt (9. szinttől +2-t) kapnak a mentődobásaikra.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_barbar_szivos',
|
||||||
|
Name: 'Szívós',
|
||||||
|
Description: 'Szintenként -1 Hp-ig öntudatuknál vannak, bár -5 Hp-n halálos sebet kapnak, ami 1d3*10 perc alatt akkor is halálos, ha egyébként győznek a csetepatéban.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_barbar_iras',
|
||||||
|
Name: 'Írástudatlan',
|
||||||
|
Description: 'Minden barbár írástudatlanul kezdi a játékot, de ha kell, később megtanulhatja a betűvetést.'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
case Osztaly2E.Ijasz: return [
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_ijasz',
|
||||||
|
Name: 'Íjász',
|
||||||
|
Description: 'A távolsági harc mesterei. Dobó- és lőfegyverrel (a számszeríjakat kivéve) körönként kapnak egy teljesértékű extra támadást, vagy számszeríj esetén +2-t a célzásra'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_ijasz_vert',
|
||||||
|
Name: 'Kötelező mozgékonyság',
|
||||||
|
Description: 'Az íjászok nem viselhetnek nehéz vérteket'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_ijasz_lovaglas',
|
||||||
|
Name: 'Vágta',
|
||||||
|
Description: 'Lovaglás próbával akár vágtató lóról is tudnak lőni'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
case Osztaly2E.Tengeresz: return [
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_kaloz',
|
||||||
|
Name: 'Tengerész/Kalóz',
|
||||||
|
Description: 'A tengerészek a hajózás mesterei; kereskedők, tengeri rablók és rabszolgavadászok. Egyik képzettségük mindenképpen a Hajózás.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_kaloz_vasmacska',
|
||||||
|
Name: 'Vasmacska',
|
||||||
|
Description: 'A kalózok és tengerészek nem viselhetnek nehéz vértezetet, de VO-juk Szint/3-al javul.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_kaloz_kritikus',
|
||||||
|
Name: 'Kritikus',
|
||||||
|
Description: 'Minden harmadik szinten kiválaszthatnak egy fegyvertípust, amellyel könnyebben okoznak kritikus sebesülést, tehát pl. fejszékkel 20 helyett 19-20-on, hosszú kardokkal 19-20 helyett 18-20-on, görbe kardokkal 18-20 helyett 17-20-on stb. 9. szinttől fegyverenként kétszer is választható.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_harcos_kaloz_trukkos',
|
||||||
|
Name: 'Trükkös',
|
||||||
|
Description: '+2-t kapnak harci manővereikre (HM)'
|
||||||
|
},
|
||||||
|
]
|
||||||
|
case Osztaly2E.Tolvaj: return [
|
||||||
|
{
|
||||||
|
Id: 's_2e_tolvaj_orvtamadas',
|
||||||
|
Name: 'Orvtámadás',
|
||||||
|
Description: 'akkor használható, ha a tolvaj meglepi áldozatát, tehát pl. osonva a hátába kerül, vagy beszélgetés közben tőrt ránt és egyetlen mozdulattal gyomron szúrja. Ekkor a támadásra +4 jár, az orvtámadás pedig minden páratlan szintért +1d6 Hp sebzést okoz (maximuma +5d6). Dobó- és lőfegyverrel is használható, és ha a tolvaj úgy dönt, illetve a használt fegyver lehetővé teszi, az ellenfél elkábítására is alkalmazható.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_tolvaj_kezdemenyezes',
|
||||||
|
Name: 'Jobb kezdeményezés',
|
||||||
|
Description: 'a tolvajok +4-et kapnak kezdeményezési dobásaikra.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_tolvaj_kepzettsegek',
|
||||||
|
Name: 'Tolvajképzettségek',
|
||||||
|
Description: 'minden tolvaj jártas több olyan képzettségben, amely segíti a rejtőzködésben, a jól őrzött értékek eltulajdonításában és hasonló feladatokban.',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
case Osztaly2E.Pap: return [
|
||||||
|
{
|
||||||
|
Id: 's_2e_pap_varazslat',
|
||||||
|
Name: 'Varázslatok',
|
||||||
|
Description: 'a papi varázslatok általában gyógyításra, mások megsegítésére és vallási feladatok ellátására szolgálnak. Minél magasabb szintűek, egy nap annál több varázslatot tudnak alkalmazni a következő oldalon található táblának megfelelően. Például egy 4. szintű, 17-es Bölcsességgel rendelkező pap öt nulladik szintű, négy első szintű és három második szintű varázslatot tarthat naponta elméjében.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_pap_bonusz_varazslat',
|
||||||
|
Name: 'Bónusz varázslatok',
|
||||||
|
Description: 'a magas Bölcsességű papok minden nap további varázslatokat memorizálhatnak, ha erre szintjük eleve képessé tenné őket. Ez a kegy azonban csak azoknak a papoknak jár, akik jó megítélésben állnak istenüknél (a kalandok elején ez a helyzet).'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_pap_gyogyseb',
|
||||||
|
Name: 'Gyógyítás vagy sebokozás',
|
||||||
|
Description: 'a pap az aznap már memorizált (megtanult) varázslatokat gyógyításra vagy sebek okozására is fölhasználhatja. Érintésével a varázslat minden szintjéért 1d8 Hp-t gyógyít vagy sebez – így pl. egy Ómen elhasználásával 2d8 Hp-t. Az így konvertált varázslat természetesen elvész. Az, hogy a képesség sebek gyógyítására vagy okozására szolgál, a pap istenétől függ. A békésebb istenek főleg az elsőt, a harciasabbak főleg a másodikat részesítik előnyben, s vannak olyanok is, akik híveikre bízzák, hogy melyik utat választják. Ha azonban a pap már eldöntötte, melyik képességben járatos, döntését többé nem másíthatja meg!'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_pap_elohalott',
|
||||||
|
Name: 'Élőholtak elűzése vagy irányítása',
|
||||||
|
Description: 'a papok képesek elűzni vagy uralmuk alá vonni az élőholt szörnyeket, például zombikat, lidérceket és vámpírokat. Ez a képesség naponta egyszer (5. szinttől kétszer, 9. szinttől háromszor) használható. A cselekedet a következőképpen működik:',
|
||||||
|
ExtendedDescription: [
|
||||||
|
'A pap [1d20 + Karizma bónusz] próbát tesz. Ennek az értékét összeveti a standard bónusztáblázattal (3-5 = -2, 6-8 = -1, 9-11 = +0, 12-14 = +1, 15-17 = +2, 18 = +3). Az innen kiolvasható módosítót hozzáadja saját szintjéhez (ha negatív, akkor levonja). Az eredmény jelzi, hogy a pap legfeljebb milyen szintű élőholtakra lesz hatással. Ha tehát pl. a próba végeredménye 14 és a pap ötödik szintű, akkor 5+1, azaz 6. szintű a legerősebb élőhalott, amire a kísérlet sikeres. A 20-as dobás itt is automatikus siker, az 1-es automatikus kudarc.',
|
||||||
|
'A pap [2d6+szint] szintű élőhalottat űzhet el vagy irányíthat. Először a leggyengébb élőholtakra hat, azután a következő leggyengébbekre stb. Az elűzött élőholtak elmenekülnek a pap szeme elől, és addig nem is ártanak neki és társainak, amíg a pap csapata meg nem támadja őket! Ezzel szemben a gonosz papok parancsokat adhatnak az irányított szörnyeknek. Mindkét hatás néhány óráig tart, az élőholtak szintjétől és a körülményektől függően.',
|
||||||
|
'Ha az összes szem előtt lévő élőholtat sikerült elűzni vagy irányítani és még maradt „a szent energiából”, akkor ismét el kell kezdeni a hatást a leggyengébb ellenségektől. Az így elűzött szörnyek megsemmisülnek, illetve irányítás esetén végleg a gonosz pap szolgálatába állnak.',
|
||||||
|
'A két hatás egymás ellen is fölhasználható, például egy jó pap kiolthatja egy gonosz pap irányítását, de akár két gonosz pap is versenyezhet egy csapat sírlidérc „megtérítésén”.',
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_pap_invokacio',
|
||||||
|
Name: 'Invokáció',
|
||||||
|
Description: 'az istenség nevének kimondásával kérhetik annak segítségét, ami +2-t ad egy kiválasztott próbadobáshoz. Hetente a Bölcsességbónuszukkal azonos alkalommal (de legalább egyszer) használhatják a képességet.'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
case Osztaly2E.Varazslo: return [
|
||||||
|
{
|
||||||
|
Id: 's_2e_varazslo_varazslatok',
|
||||||
|
Name: 'Varázslatok',
|
||||||
|
Description: 'a varázslók mágiája mind között a legszerteágazóbb. A papokkal ellentétben azonban minden varázslatot külön kell megszerezniük és könyvükben rögzíteniük. A már ismert varázslatokat reggelenként könyvük tanulmányozásával memorizálják a szabálykönyvben leírt táblázat szerinti számban, s ha felhasználják őket, azok eltűnnek elméjükből és aznap már nem használhatók. Így például egy harmadik szintű varázsló négy nulladik, két első és egy második szintű varázslatot tud egyszerre elméjében tárolni. Egy varázslat kétszeres memorizálása két helyet foglal. Az illuzionisták nem képesek a varázslói varázslatok megértésére – és viszont.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_varazslo_varazskonyv',
|
||||||
|
Name: 'Varázskönyv',
|
||||||
|
Description: 'minden varázsló megtanulja és könyvében rögzíti az összes nulladik szintű varázslatot. Ezen kívül harmadik szinten (vagyis a kalandok kezdetén) még 1d3+3 első szintű és 1d3 második szintű varázslatot ismernek. A kezdeti varázslatokat véletlenszerűen, kockadobással kell meghatározni; azonos eredmény esetén nincs lehetőség új dobásra. A további varázslatok mások könyveiből, mágikus tekercsekből vagy más módszerek segítségével sajátíthatók el (lásd a IV. fejezetet).'
|
||||||
|
},
|
||||||
|
]
|
||||||
|
case Osztaly2E.Illuzionista: return [
|
||||||
|
{
|
||||||
|
Id: 's_2e_illuzionista_varazslatok',
|
||||||
|
Name: 'Varázslatok',
|
||||||
|
Description: 'a varázslók mágiája mind között a legszerteágazóbb. A papokkal ellentétben azonban minden varázslatot külön kell megszerezniük és könyvükben rögzíteniük. A már ismert varázslatokat reggelenként könyvük tanulmányozásával memorizálják a szabálykönyvben leírt táblázat szerinti számban, s ha felhasználják őket, azok eltűnnek elméjükből és aznap már nem használhatók. Így például egy harmadik szintű varázsló négy nulladik, két első és egy második szintű varázslatot tud egyszerre elméjében tárolni. Egy varázslat kétszeres memorizálása két helyet foglal. Az illuzionisták nem képesek a varázslói varázslatok megértésére – és viszont.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_illuzionista_varazskonyv',
|
||||||
|
Name: 'Varázskönyv',
|
||||||
|
Description: 'minden varázsló megtanulja és könyvében rögzíti az összes nulladik szintű varázslatot. Ezen kívül harmadik szinten (vagyis a kalandok kezdetén) még 1d3+3 első szintű és 1d3 második szintű varázslatot ismernek. A kezdeti varázslatokat véletlenszerűen, kockadobással kell meghatározni; azonos eredmény esetén nincs lehetőség új dobásra. A további varázslatok mások könyveiből, mágikus tekercsekből vagy más módszerek segítségével sajátíthatók el (lásd a IV. fejezetet).'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
case Osztaly2E.Dalnok: return [
|
||||||
|
{
|
||||||
|
Id: 's_2e_dalnok_zene',
|
||||||
|
Name: 'Zene',
|
||||||
|
Description: 'zenéjük napi egy alkalommal inspiráló hatással van a szövetségeseikre és demoralizáló hatással ellenfeleikre: az előbbiek +1-et, az utóbbiak -1-et kapnak mindenféle dobásukra. Ezt a képzettséget 5. szinttől kétszer, 9. szinttől háromszor használhatják.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_dalnok_legendak',
|
||||||
|
Name: 'Legendák (Böl)',
|
||||||
|
Description: 'ezzel a speciális képzettséggel a karakter megtudhat valamit a kiválasztott hely, család, szervezet stb. hátteréről – ha ez a legendákból vagy hősi énekekből megtudható volna. Közepes próba esetén általános, Nehéz próba esetén specifikus, Hősies próba esetén titkos ismereteket is adhat. Olyan dolgokra alkalmazható, amelyek szerepelhetnének egy közszájon forgó legendában, és az ismeretek is ezt fogják tükrözni. A köznapi, vagy éppenséggel nagyon jól elrejtett dolgok kapcsán nem nyújt segítséget.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_dalnok_varazslatok',
|
||||||
|
Name: 'Varázslatok',
|
||||||
|
Description: 'szintenként 2 db varázslatot tudnak megtanulni a dalnok varázslatlistából, s azt verses rigmusként, dalként vagy zeneműként előadni. További dalok rejtőznek régi könyvekben és más dalnokok ajkán. A dalnokok nem kapnak bónusz varázslatokat.\n A dalnok varázslatok egy része folyamatos, megszakítatlan éneklést igényel (ezek mellett csak mozgásra és egyszerűbb cselekedetekre nyílik lehetőség, de cserébe az énekszó abbamaradtáig hatnak), mások pedig egy rövid dallam után a varázslatleírásokban jelzett határidő lejártáig érvényesek. A dalnok szintenként fél óráig tudja fenntartani énekét.'
|
||||||
|
},
|
||||||
|
];
|
||||||
|
case Osztaly2E.Druida: return [
|
||||||
|
{
|
||||||
|
Id: 's_2e_druida_varazslatok',
|
||||||
|
Name: 'Varázslatok',
|
||||||
|
Description: 'a druida varázslatok általában a természet erőinek kisebb-nagyobb megnyilvánulásai. A naponta memorizálható varázslatok száma a papokéval egyező, és szintén a Bölcsességük alapján kapnak bónusz varázslatokat.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_druida_termeszetjaras',
|
||||||
|
Name: 'Természetjárás',
|
||||||
|
Description: 'szabadon mozoghatnak bármiféle természetes aljnövényzetben (mint például bozótosban, sűrűn benőtt területen, pókhálókban, de nem mágikus kötelékekben). Nem hagynak nyomot természetes környezetben, így – hacsak nem akarják – követni sem lehet őket.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_druida_alakvaltas',
|
||||||
|
Name: 'Alakváltás',
|
||||||
|
Description: 'a tapasztalt druidák 6. szinttől naponta egyszer, 9. szinttől kétszer képesek felvenni a közönséges, helyben honos állatok alakját. A fölvett forma összes fizikai jellemzőjét megkapják (fizikai tulajdonságok, támadási forma, sebzés, speciális képességek stb.), de megtartják Hp-jüket, alap támadásbónuszukat, és szellemi képességeiket. Állati alakban nem képesek varázsolni és eszközöket használni. Minden átalakulás 2/szint Hp-t gyógyít a druidán.'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
case Osztaly2E.Vandor: return [
|
||||||
|
{
|
||||||
|
Id: 's_2e_vandor_kepzettsegek',
|
||||||
|
Name: 'Vándorképzettségek',
|
||||||
|
Description: 'olyan képzettségeket is szabadon tanulhatnak, amelyeket csak varázshasználók ismernének.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_vandor_termeszetjaras',
|
||||||
|
Name: 'Természetjárás',
|
||||||
|
Description: 'szabadon mozoghatnak bármiféle természetes aljnövényzetben (mint például bozótosban, sűrűn benőtt területen, pókhálókban, de nem mágikus kötelékekben). Nem hagynak nyomot természetes környezetben, így – hacsak nem akarják – követni sem lehet őket.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_vandor_vadon_sugallata',
|
||||||
|
Name: 'A vadon sugallata',
|
||||||
|
Description: 'ha számukra új, vagy rég nem látott vadonbéli területre érkeznek, játékalkalmanként egyszer sikeres Vadonjárás próbával értelmezhetik a környezetükben elrejtett jeleket: ez lehet figyelmeztetés a környék veszélyeiről („valami nincs rendjén a hely vizeivel”), rejtélyeiről („régen emberek éltek itt – de ez már a múlt”), az ott történtek lenyomata („itt hadak jártak!”), vagy más praktikus, de csak utalásszerű információ, amit a mesélő gondol.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: 's_2e_vandor_varazslatok',
|
||||||
|
Name: 'Varázslatok',
|
||||||
|
Description: 'első szinten 2 + Bölcsességmódosítónyi 0. szintű varázslatot ismernek, majd szintenként további egy varázslatot tanulhatnak a druida listából. További varázslatok titokzatos kőkörökből és a druida hit más helyszínein ismerhetők meg. A vándorok nem kapnak bónusz varázslatokat.'
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
import {d6} from "../../shared/domain-models/kockak";
|
||||||
|
|
||||||
|
export enum Tulajdonsag2E {
|
||||||
|
Ero = 't_ero',
|
||||||
|
Ugyesseg = 't_ugy',
|
||||||
|
Egeszseg = 't_egs',
|
||||||
|
Intelligencia = 't_int',
|
||||||
|
Bolcsesseg = 't_bol',
|
||||||
|
Karizma = 't_kar',
|
||||||
|
}
|
||||||
|
|
||||||
|
export type KarakterTulajdonsagok = Record<Tulajdonsag2E, number>
|
||||||
|
|
||||||
|
export const TulajdonsagIDs = [
|
||||||
|
Tulajdonsag2E.Ero,
|
||||||
|
Tulajdonsag2E.Ugyesseg,
|
||||||
|
Tulajdonsag2E.Egeszseg,
|
||||||
|
Tulajdonsag2E.Intelligencia,
|
||||||
|
Tulajdonsag2E.Bolcsesseg,
|
||||||
|
Tulajdonsag2E.Karizma
|
||||||
|
]
|
||||||
|
|
||||||
|
export const TulajdonsagDefaults: KarakterTulajdonsagok = {
|
||||||
|
t_ero: 10,
|
||||||
|
t_ugy: 10,
|
||||||
|
t_egs: 10,
|
||||||
|
t_int: 10,
|
||||||
|
t_bol: 10,
|
||||||
|
t_kar: 10,
|
||||||
|
}
|
||||||
|
|
||||||
|
export function TulajdonsagLabel(tul: Tulajdonsag2E) : string {
|
||||||
|
switch (tul) {
|
||||||
|
case Tulajdonsag2E.Bolcsesseg: return 'Bölcsesség';
|
||||||
|
case Tulajdonsag2E.Ero: return 'Erő';
|
||||||
|
case Tulajdonsag2E.Ugyesseg: return 'Ügyesség';
|
||||||
|
case Tulajdonsag2E.Egeszseg: return 'Egészség';
|
||||||
|
case Tulajdonsag2E.Intelligencia: return 'Intelligencia';
|
||||||
|
case Tulajdonsag2E.Karizma: return 'Karizma';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function rollAbility() {
|
||||||
|
let min = 6;
|
||||||
|
let sum = 0;
|
||||||
|
let rolls: number[] = []
|
||||||
|
for (let i = 0; i < 4; i++) {
|
||||||
|
const roll = d6();
|
||||||
|
if (roll < min) {
|
||||||
|
min = roll;
|
||||||
|
}
|
||||||
|
sum += roll;
|
||||||
|
rolls.push(roll)
|
||||||
|
}
|
||||||
|
const result = sum - min;
|
||||||
|
console.log("Rolled: " + rolls + " got: " + result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function RollAllAbilities() : KarakterTulajdonsagok {
|
||||||
|
const response = {...TulajdonsagDefaults}
|
||||||
|
for (const key of TulajdonsagIDs) {
|
||||||
|
response[key] = rollAbility()
|
||||||
|
}
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Modifier = (val : number) => Math.floor(val / 3) - 3
|
||||||
|
|
||||||
|
export function TulajdonsagModosito(tulajdonsagok: KarakterTulajdonsagok): KarakterTulajdonsagok {
|
||||||
|
let response: KarakterTulajdonsagok = { ...tulajdonsagok }
|
||||||
|
for (const key of TulajdonsagIDs) {
|
||||||
|
response[key] = Modifier(tulajdonsagok[key])
|
||||||
|
}
|
||||||
|
return response
|
||||||
|
}
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
import React, {useState} from 'react'
|
||||||
|
import {useParams} from "react-router-dom";
|
||||||
|
import {Toast, ToastContainer} from "react-bootstrap";
|
||||||
|
import {DefaultKarakter} from "../domain-models/karakter2E";
|
||||||
|
import {KarakterTulajdonsagok} from "../domain-models/tulajdonsag2E";
|
||||||
|
import FajSelector2E from "../components/FajSelector2E";
|
||||||
|
import Tulajdonsagok2E from "../components/Tulajdonsagok2E";
|
||||||
|
import OsztalySelector2E from "../components/OsztalySelector2E";
|
||||||
|
import {Osztaly2E} from "../domain-models/osztaly2E";
|
||||||
|
import {
|
||||||
|
GetKepzettsegListaN,
|
||||||
|
GetNumberOfKepzettsegek,
|
||||||
|
KepzettsegId, SetDefaultKepzettsegek,
|
||||||
|
SetDefaultTolvajKepzettsegek
|
||||||
|
} from "../domain-models/kepzettsegek2E";
|
||||||
|
import KarakterKepzettsegek from "../components/KarakterKepzettsegek2E";
|
||||||
|
import {TulajdonsagokFajjal} from "../domain-models/faj2E";
|
||||||
|
import JellemSelector from "../components/JellemSelector";
|
||||||
|
|
||||||
|
function CreateCharacter2E(props: {}) {
|
||||||
|
|
||||||
|
const { id } = useParams();
|
||||||
|
|
||||||
|
const [karakter, setKarakter] = useState(DefaultKarakter)
|
||||||
|
const tulajdonsagokFajjal = TulajdonsagokFajjal(karakter.tulajdonsagok, karakter.faj)
|
||||||
|
const changeKepzettseg = (k: KepzettsegId[]) => setKarakter({...karakter, kepzettsegek: k})
|
||||||
|
const changeTolvajKepzettseg = (tk?: KepzettsegId[]) => setKarakter({...karakter, tolvajKepzettsegek: tk})
|
||||||
|
SetDefaultTolvajKepzettsegek(karakter, changeTolvajKepzettseg)
|
||||||
|
SetDefaultKepzettsegek({...karakter, tulajdonsagok: tulajdonsagokFajjal}, changeKepzettseg)
|
||||||
|
|
||||||
|
let [showSaved, setShowSaved] = useState(false);
|
||||||
|
const hideSaved = () => setShowSaved(false);
|
||||||
|
|
||||||
|
return <div>
|
||||||
|
<div className='container-fluid p-5 bg-black text-white text-center'>
|
||||||
|
<h1>Karakter {!!id ? "szerkesztése" : "létrehozása"}</h1>
|
||||||
|
</div>
|
||||||
|
<ToastContainer className="position-fixed" position="top-end">
|
||||||
|
<Toast show={showSaved} onClose={hideSaved} bg="success">
|
||||||
|
<Toast.Header><strong>Karakter mentve!</strong></Toast.Header>
|
||||||
|
</Toast>
|
||||||
|
</ToastContainer>
|
||||||
|
<div className='p-3'>
|
||||||
|
<form onSubmit={async (event) => event.preventDefault()}>
|
||||||
|
<div className='row'>
|
||||||
|
<h5 className='col align-self-center'>Származás</h5>
|
||||||
|
</div>
|
||||||
|
<div className='row m-2'>
|
||||||
|
<label className='col-md-2 col-sm-3 col-form-label'>Név</label>
|
||||||
|
<input className='col form-control'
|
||||||
|
value={karakter.name}
|
||||||
|
onChange={(e) => setKarakter({...karakter, name: e.target.value})}/>
|
||||||
|
{!karakter.name &&
|
||||||
|
<span className='form-field-error'>A karaktered nem mászkálhat névtelenül a világban!</span>}
|
||||||
|
</div>
|
||||||
|
<div className='row m-2'>
|
||||||
|
<label className='col-md-2 col-sm-3 col-form-label'>Nem</label>
|
||||||
|
<input className='col form-control'
|
||||||
|
value={karakter.nem}
|
||||||
|
onChange={(e) => setKarakter({...karakter, nem: e.target.value})}/>
|
||||||
|
</div>
|
||||||
|
<div className='row m-2'>
|
||||||
|
<label className='col-md-2 col-sm-3 col-form-label'>Kor</label>
|
||||||
|
<input className='col form-control'
|
||||||
|
value={karakter.kor}
|
||||||
|
type={"number"}
|
||||||
|
onChange={(e) => setKarakter({...karakter, kor: Number(e.target.value)})}/>
|
||||||
|
</div>
|
||||||
|
<JellemSelector selected={karakter.jellem}
|
||||||
|
changeJellem={(val) => setKarakter({...karakter, jellem: val})}/>
|
||||||
|
<div className='row m-2'>
|
||||||
|
<label className='col-md-2 col-sm-3 col-form-label'>Választott istenség</label>
|
||||||
|
<input className='col form-control'
|
||||||
|
value={karakter.isten}
|
||||||
|
onChange={(e) => setKarakter({...karakter, isten: e.target.value})}/>
|
||||||
|
</div>
|
||||||
|
<FajSelector2E
|
||||||
|
changeFaj={faj => setKarakter({...karakter, faj})}
|
||||||
|
faj={karakter.faj}
|
||||||
|
/>
|
||||||
|
<hr/>
|
||||||
|
<Tulajdonsagok2E
|
||||||
|
currentFaj={karakter.faj}
|
||||||
|
tulajdonsagok={karakter.tulajdonsagok}
|
||||||
|
changeTulajdonsagok={(tul: KarakterTulajdonsagok) => setKarakter({
|
||||||
|
...karakter,
|
||||||
|
tulajdonsagok: tul
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
<hr/>
|
||||||
|
<div className='row'>
|
||||||
|
<h5 className='col align-self-center'>Tanult</h5>
|
||||||
|
</div>
|
||||||
|
<OsztalySelector2E
|
||||||
|
currentFaj={karakter.faj}
|
||||||
|
currentOsztaly={karakter.osztaly}
|
||||||
|
changeOsztaly={osztaly => setKarakter({...karakter, osztaly})}
|
||||||
|
/>
|
||||||
|
{karakter.osztaly === Osztaly2E.Harcos &&
|
||||||
|
<div className='mb-6'>
|
||||||
|
TODO: Harcos fegyver specializaciok!!
|
||||||
|
</div>}
|
||||||
|
<KarakterKepzettsegek
|
||||||
|
getKepzettsegListaN={GetKepzettsegListaN(karakter)}
|
||||||
|
numberOfKepzettsegek={GetNumberOfKepzettsegek(tulajdonsagokFajjal.t_int, karakter.faj)}
|
||||||
|
kepzettsegek={karakter.kepzettsegek}
|
||||||
|
changeKepzettsegek={changeKepzettseg}
|
||||||
|
tolvajKepzettsegek={karakter.tolvajKepzettsegek || []}
|
||||||
|
changeTolvajKepzettsegek={changeTolvajKepzettseg}
|
||||||
|
/>
|
||||||
|
<hr />
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<hr/>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CreateCharacter2E;
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export function SignedNumberToText(val: number) : string {
|
||||||
|
return val === 0 ? " 0" : (val > 0 ? '+'+val : val.toString())
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user