create character: faj, tulajdonsagok basic

This commit is contained in:
2023-07-23 17:22:29 +02:00
parent 450a4702e5
commit bed580960d
2 changed files with 290 additions and 32 deletions
+99
View File
@@ -47,3 +47,102 @@ export function OsztalyLabel(osztaly: Osztaly) : string {
case Osztaly.Tolvaj: return 'Tolvaj'
}
}
export function FajLabel(faj: Faj) : string {
switch (faj) {
case Faj.Ember: return 'Ember';
case Faj.Amazon: return 'Amazon';
case Faj.Birodalmi: return 'Birodalmi';
case Faj.Etuniai: return 'Etúniai';
case Faj.Eszaki: return 'Északi';
case Faj.Osember: return 'Ősember';
case Faj.Elf: return 'Elf';
case Faj.Felelf: return 'Félelf';
case Faj.Felork: return 'Félork';
case Faj.Felszerzet: return 'Félszerzet';
case Faj.Gnom: return 'Gnóm';
case Faj.Torpe: return 'Törpe';
}
}
export function FajDescription(faj: Faj) : string {
switch (faj) {
case Faj.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 Faj.Amazon: return "Bár az amazonok 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 fegyverviselést. 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 Faj.Birodalmi: return "Bár a Birodalom történelemelőtti kora már évezredek óta elmúlt, a nép maradékai még megtalálhatók. Az irántuk érzett gyűlölet miatt sokan rejtőzködni kényszerülnek közülük, pedig hatalmuk már meg sem közelíti a régit életüket többnyire dekadens élvezetek habzsolásával, kábítószeres mámorban töltik. Bőrük lilás, a tisztavérűek esetén padlizsánszínű, szemük ibolyaszín. A fajtiszta birodalmiak között 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 Faj.Etuniai: return "Az etúniai lovas nomádok kultúrája mindmáig megőrizte primitívségét. Akár földművelésből, akár lovas portyázásból, akár rablásból és kereskedésből élnek, nem fogékonyak a finomságok iránt. Eszközeik is egyszerűek: fegyvereik főleg hosszú lándzsák, é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 bár azok, akik otthonuktól elszakadva kénytelenek megélni, inkább a gonosz felé hajlanak. Az etúniaiak 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 Faj.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ú élű 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 Faj.Osember: return "Az Ősemberek vad földek primitív őslakói. Máig merizté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élisteneént tisztelik hátasaikat, a hatalmas mamutokat.";
case Faj.Elf: return "Az elfek szépségükről, hosszú életükrő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óak, 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 Faj.Felelf: return "A félelfek elf és ember szülők gyermekei. Kis számuk miatt nem alkotnak külön közösségeket.";
case Faj.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 a disznóéra emlékeztetnek), 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. A legtöbb félork gonosz jellemű.";
case Faj.Felszerzet: return "A félszerzetek általában megelégszenek a nyugodt vidéki élettel. Termetük az emberi fele. 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 Faj.Gnom: return "A gnómok különösen ritka, elsősorban emberi városokban megtalálható alacsony termetű faj. A gnómokat alacsony termetükről, vékony végtagjaikról és tömpe, húsos orrukról lehet fölismerni. 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.";
case Faj.Torpe: return "A törpék elsősorban hegyek között és dombvidékeken élnek. Termetük kicsi (1,2 m), 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 : Faj) : string[] {
switch (faj) {
case Faj.Ember: return [
"A játék kezdetén egy extra képzettséggel kezdenek",
"Korlátlanul fejlődhetnek minden osztályban",
];
case Faj.Amazon: return [
"Ha két vagy több amazon együttesen harcol, VO-juk 2-vel nő pszionikus képességeik miatt",
"Szintkorlátok: Harcos -, Pap 5, Tolvaj 0, Varázsló 0",
];
case Faj.Birodalmi: return [
"+1 Int, -1 Egs",
"Egyik kezdő képzettségük mindenképpen az Alkímia vagy a Méregkeverés",
"Szintkorlátok: Harcos 7, Pap 5, Tolvaj 5, Varázsló -",
];
case Faj.Etuniai: return [
"+1 Egs, -1 Böl",
"Az egyik kezdő képzettségük mindenképpen a Lovaglás",
"Szintkorlátok: Harcos -, Pap 5, Tolvaj -, Varázsló 4",
];
case Faj.Eszaki: return [
"+1 Erő, -1 Böl",
"Az egyik kezdő képzettségük mindenképpen a Hajózás",
"Szintkorlátok: Harcos -, Pap 7, Tolvaj -, Varázsló 5",
];
case Faj.Osember: return [
"+1 Erő, +1 Egészség, -1 Int, -1 Böl",
"Szintkorlátok: Harcos -, Pap 5, Tolvaj 4, Varázsló 0",
];
case Faj.Elf: return [
"+1 Ügy, -1 Egs",
"Immunisak az altató mágiára, +2 mentődobás bűbáj ellen",
"Automatikusan képzettek az íjak és a hoszszúkard használatában akkor is, ha osztályuk ezt nem adná meg nekik",
"Nem támaszthatók föl közönséges mágiával",
"Szintkorlátok: Harcos 9, Pap 7, Tolvaj 6, Varázsló 9",
];
case Faj.Felelf: return [
"Automatikusan képzettek az íjak és a hoszszúkard használatában",
"Szintkorlátok: Harcos 9, Pap 5, Tolvaj 9, Varázsló 9",
];
case Faj.Felork: return [
"+1 Erő, +1 Egs, -2 Kar",
"Szintkorlátok: Harcos 9, Pap 5, Tolvaj 9, Varázsló 5",
];
case Faj.Felszerzet: return [
"+1 Ügy, -1 Erő",
"+1 VO kis méretük miatt",
"+1 támadást kapnak dobófegyverekre és parittyákra",
"Szintkorlátok: Harcos 6, Pap 6, Tolvaj 9, Varázsló 4",
];
case Faj.Gnom: return [
"+1 Int, -1 Erő",
"Szintkorlátok: Harcos 6, Pap 6, Tolvaj 8, Varázsló 7",
];
case Faj.Torpe: return [
"+1 Egs, -1 Kar",
"Lassabban mozognak az embereknél (alapsebességük 20)",
"+2 mentődobást kapnak mérgek és varázslatok hatásai ellen",
"Szintkorlátok: Harcos 9, Pap 9, Tolvaj 6, Varázsló 4",
];
}
return [];
}
+180 -21
View File
@@ -1,13 +1,50 @@
import React, {ReactNode} from 'react';
import React from 'react';
import './CreateCharacter.css'
import {useForm} from "react-hook-form";
import {Osztaly, OsztalyLabel} from "../domain-models/enums";
import {randomInt} from "crypto";
import {Faj, FajDescription, FajLabel, FajSpecials, Osztaly, OsztalyLabel} from "../domain-models/enums";
function getRandomInt(max: number) {
return Math.ceil(Math.random() * max);
}
function rollAbility() {
let min = 6;
let sum = 0;
let rolls: number[] = []
for (let i = 0; i < 4; i++) {
const roll = getRandomInt(6);
if (roll < min) {
min = roll;
}
sum += roll;
rolls = [...rolls, roll]
}
const result = sum - min;
console.log("Rolled: " + rolls + " got: " + result)
return result;
}
function rollAllAbilities(setValue: (ability: string, value: number) => void) {
setValue('ero', rollAbility())
setValue('ugy', rollAbility())
setValue('egs', rollAbility())
setValue('int', rollAbility())
setValue('bol', rollAbility())
setValue('kar', rollAbility())
}
function CreateCharacterPage() {
const { register, handleSubmit, setValue, formState : { errors} } = useForm()
const {
register,
handleSubmit,
setValue,
watch,
formState: {errors}
} = useForm()
const sendForm = (data: any) => console.log(data)
const currentFaj = () => watch().faj || Faj.Ember
return (
<div className='row'>
<div className='container-fluid p-5 bg-black text-white text-center'>
@@ -15,30 +52,152 @@ function CreateCharacterPage() {
</div>
<div className='p-3'>
<form onSubmit={handleSubmit(sendForm)} className='col-12'>
<div className='row p-3'>
<label className='col-sm-4'>Név</label>
<input className='col-sm-4' {...register('nev', {required: true})} />
<div className='row m-2'>
<label className='col-lg-1 col-sm-2'>Név</label>
<input className='col'
defaultValue='Névtelen Kalandozó' {...register('nev', {required: true})} />
{errors.nev && <span className='form-field-error'>A karaktered nem mászkálhat névtelenül a világban!</span>}
</div>
<div className='row p-3'>
<label className='col-sm-4'>Osztály</label>
<select className='col-sm-4' {...register('osztaly', {required: true})}>
{Object.values(Osztaly).map((oszt) : ReactNode =>
(<option key={oszt} value={oszt}>{OsztalyLabel(oszt)}</option>)
<div className='row m-2'>
<label className='col-lg-1 col-sm-2'>Faj</label>
<div className='col-sm-10'>
<select className='row' {...register('faj', {required: true})}>
<option key={Faj.Ember} selected={true} value={Faj.Ember}>{FajLabel(Faj.Ember)}</option>
<optgroup label='más emberi népek'>
<option key={Faj.Amazon} value={Faj.Amazon}>{FajLabel(Faj.Amazon)}</option>
<option key={Faj.Birodalmi} value={Faj.Birodalmi}>{FajLabel(Faj.Birodalmi)}</option>
<option key={Faj.Eszaki} value={Faj.Eszaki}>{FajLabel(Faj.Eszaki)}</option>
<option key={Faj.Etuniai} value={Faj.Etuniai}>{FajLabel(Faj.Etuniai)}</option>
<option key={Faj.Osember} value={Faj.Osember}>{FajLabel(Faj.Osember)}</option>
</optgroup>
<optgroup label='nem emberi fajok'>
<option key={Faj.Elf} value={Faj.Elf}>{FajLabel(Faj.Elf)}</option>
<option key={Faj.Felelf} value={Faj.Felelf}>{FajLabel(Faj.Felelf)}</option>
<option key={Faj.Felork} value={Faj.Felork}>{FajLabel(Faj.Felork)}</option>
<option key={Faj.Felszerzet}
value={Faj.Felszerzet}>{FajLabel(Faj.Felszerzet)}</option>
<option key={Faj.Gnom} value={Faj.Gnom}>{FajLabel(Faj.Gnom)}</option>
<option key={Faj.Torpe} value={Faj.Torpe}>{FajLabel(Faj.Torpe)}</option>
</optgroup>
</select>
<p className='row pt-2'>
{FajDescription(currentFaj())}
</p>
<ul>
{FajSpecials(currentFaj()).map(((special) => (<li>{special}</li>)))}
</ul>
</div>
</div>
<div className='row m-2'>
<label className='col-lg-1 col-sm-2'>Osztály</label>
<select className='col' {...register('osztaly', {required: true})}>
<optgroup label='Harcos'>
<option key={Osztaly.Harcos}
value={Osztaly.Harcos}>{OsztalyLabel(Osztaly.Harcos)}</option>
<option key={Osztaly.Amazon}
value={Osztaly.Amazon}>{OsztalyLabel(Osztaly.Amazon)}</option>
<option key={Osztaly.Barbar}
value={Osztaly.Barbar}>{OsztalyLabel(Osztaly.Barbar)}</option>
<option key={Osztaly.Ijjasz}
value={Osztaly.Ijjasz}>{OsztalyLabel(Osztaly.Ijjasz)}</option>
<option key={Osztaly.Kaloz} value={Osztaly.Kaloz}>{OsztalyLabel(Osztaly.Kaloz)}</option>
</optgroup>
<option key={Osztaly.Pap} value={Osztaly.Pap}>{OsztalyLabel(Osztaly.Pap)}</option>
{currentFaj() !== Faj.Amazon && (<option key={Osztaly.Tolvaj}
value={Osztaly.Tolvaj}>{OsztalyLabel(Osztaly.Tolvaj)}</option>)}
{![Faj.Osember, Faj.Amazon].includes(currentFaj()) && (
<optgroup label='Varázsló'>
<option key={Osztaly.Varazslo}
value={Osztaly.Varazslo}>{OsztalyLabel(Osztaly.Varazslo)}</option>
<option key={Osztaly.Illuzionista}
value={Osztaly.Illuzionista}>{OsztalyLabel(Osztaly.Illuzionista)}</option>
</optgroup>
)}
</select>
</div>
<hr />
<p>Tulajdonságok</p>
<div className='row p-3'>
<label className='col-sm-4'>Erő</label>
<input className='col-sm-4' {...register('ero', {required: true, min: 1, max: 20, pattern: /[0-9]{1,2}/})} />
{errors.ero && (<span className='form-field-error'>Az erődnek 0 és 20 között kell lennie</span>)}
<button className='btn btn-secondary, col-sm-4' type='button' onClick={() => setValue('ero', randomInt(1,6))}>Dobás</button>
<hr/>
<div className='row'>
<h5 className='col-lg-2 col-sm-4 text-center align-self-center'>Tulajdonságok</h5>
<div className='col-sm-2 m-2'>
<button className='btn btn-dark' type='button'
onClick={() => rollAllAbilities(setValue)}>Dobás
</button>
</div>
</div>
<div className='row m-2'>
<label className='col-lg-1 col-sm-2'>Erő</label>
<input className='col-sm-1 m-2' type='number' {...register('ero', {
required: true,
min: 3,
max: 18,
})} />
{errors.ero && Number(watch('ero')) < 3 && (
<span className='form-field-error'>Túl gyenge vagy, nem bírtad felemelni a kezed a jelentkezéshez!</span>)}
{errors.ero && Number(watch('ero')) > 18 && (
<span className='form-field-error'>Szét szakadtak az izmaid!</span>)}
</div>
<div className='row m-2'>
<label className='col-lg-1 col-sm-2'>Ügyesség</label>
<input className='col-sm-1 m-2' type='number' {...register('ugy', {
required: true,
min: 3,
max: 18,
})} />
{errors.ugy && Number(watch('ugy')) < 3 && (
<span className='form-field-error'>Orrabuktál jelentkezés helyett!</span>)}
{errors.ugy && Number(watch('ugy')) > 18 && (
<span className='form-field-error'>Emberfeletti zsonglörködésedre záptojással válaszoltak a helyiek!</span>)}
</div>
<div className='row m-2'>
<label className='col-lg-1 col-sm-2'>Egészség</label>
<input className='col-sm-1 m-2' type='number' {...register('egs', {
required: true,
min: 3,
max: 18
})} />
{errors.egs && Number(watch('egs')) < 3 && (
<span className='form-field-error'>Túl beteg vagy ahhoz, hogy kalandozni menj!</span>)}
{errors.egs && Number(watch('egs')) > 18 && (
<span className='form-field-error'>Kicsattanó egészségedet csak a diambroid állíthatja meg, minő véletlen, hogy pont az arcodba robbant...</span>)}
</div>
<div className='row m-2'>
<label className='col-lg-1 col-sm-2'>Intelligencia</label>
<input className='col-sm-1 m-2' type='number' {...register('int', {
required: true,
min: 3,
max: 18
})} />
{errors.int && Number(watch('int')) < 3 && (
<span className='form-field-error'>Elfelejtetted, hogy mikor is kéne kalandozni indulni!</span>)}
{errors.int && Number(watch('int')) > 18 && (
<span className='form-field-error'>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.</span>)}
</div>
<div className='row m-2'>
<label className='col-lg-1 col-sm-2'>Bölcsesség</label>
<input className='col-sm-1 m-2' type='number' {...register('bol', {
required: true,
min: 3,
max: 18
})} />
{errors.bol && Number(watch('bol')) < 3 && (
<span className='form-field-error'>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...</span>)}
{errors.bol && Number(watch('bol')) > 18 && (
<span className='form-field-error'>Hatalmas bölcsességedben beláttad a kalandozás veszélyeit és inkább más tevékenységbe fogtál.</span>)}
</div>
<div className='row m-2'>
<label className='col-lg-1 col-sm-2'>Karizma</label>
<input className='col-sm-1 m-2' type='number' {...register('kar', {
required: true,
min: 3,
max: 18,
})} />
{errors.kar && Number(watch('kar')) < 3 && (
<span className='form-field-error'>Mintha taszítanád az embereket, sose sikerült kalandozó csapatot találnod.</span>)}
{errors.kar && Number(watch('kar')) > 18 && (
<span className='form-field-error'>Az ellenkező nem tagjai nem engedték, hogy útnak indulj.</span>)}
</div>
<div>
<button type='submit'>Létrehozás</button>
<button className='btn btn-danger' type='submit'>Létrehozás</button>
</div>
</form>
</div>