Mimochodem kde se používájí slova z gcVocab?
gcVocab resp. vocabWords, který se obvykle zapisuje pomocí šablony jako ta první sada slovíček, se používá pro naplnění slovníku parseru, tj. té části programu, která se snaží analyzovat, co hráč napsal, a dát tomu nějaký význam a provést jeho příkaz. Použijí se tedy k porovnání s tím, co hráč napsal a z toho se odvodí, jestli s tímto objektem hráč chce manipulovat.
Naproti tomu název objektu, tj. vlastnost gcName a name, která se obvykle píše jako druhý řetězec v apostrofech na začátku objektu, je název, který hra použije při výpisu zpráv na obrazovce, ať už se jedná o hlášení, že jsi něco zvednul, výpisu inventáře atd., zkrátka kdykoliv hra tiskne název objektu na obrazovku.
+ cDoor: Door 'vnitřní tlakové dveře dveře/těsnění*dveře'
'vnitřní tlakové dveře' *3
"Jsou to mohutné dveře schopné udržet atmosféru v oddělené části lodi. Po
obvodu je měkké těsnění, které občas prověřuješ. Z obou stran jsou
výrazné tlakoměry ukazující tlak na druhé straně dveří. V případě
potřeby tlakový uzávěr může lehce zaklapnout a udrží i velmi prudkou
změnu tlaku. "
/* Dveře jsou pomnožné, tj. mají vždy tvar množného čísla. */
isPlural = true
gcName = 'vnitřních tlakových dveří, vnitřním tlakovým dveřím, vnitřní
tlakové dveře, vnitřních tlakových dveřích, vnitřními tlakovými dveřmi'
gcVocab = 'vnitřních vnitřním tlakových vnitřními tlakovým tlakové tlakovými
dveří/dveřím/dveřích/dveřmi'
;
Tyhle dvě role se důsledně rozlišují a ve slovníku pochopitelně člověk uvede i mnoho různých synonym, aby hráč nemusel uhodnout jeden přesný název. A pochopitelně i všechny důležité pády, nemusejí se však opakovat ani být seřazené, což naopak u názvu potřeba je, aby si TADS uměl vybrat. U slovníku parseru stačí jen poznat.
Jak tedy zadat správně "diamant u stropu"? A kam zapsat "u"? Nebo ho mám vynechat?
gcVocab = 'diamant diamantu diamantem (u) (stropu)/diamant/diamantu/diamantem'
Tohle je trochu složitější název objektu a jak jsem řekl přídavné a podstatné jméno, tak zde úplně neodpovídá. Řekl jsem to trochu zjednodušeně a teď je příležitost dovysvětlit. Pro TADS není úplně důležité, co to je v rámci mluvnice českého jazyka, ale jak slovo chápat a kde se může vyskytnout. Tedy základní pravidla zní, že poznáme objekt tehdy, když:
- Hráč použije jen jedno slovo ze slovníku podstatných jmen.
- Hráč použije jedno či více slov za sebou ze slovníku přídavných jmen v libovolném pořadí.
- Hráč použije kombinaci předchozích, ale přídavná jména musí vždy stát před jediným z podstatných jmen, ne naopak.
Tedy když mám velký červený míč, napíšu asi 'velký červený míč/míček' a z toho se vygenerují všechny smysluplné kombinace, např. bude fungovat
>vem červený i
>vem míček, libovolné pořadí, třeba
>vem červený velký i
>vem velký červený míč. Nebude ale fungovat
>vem míč červený, protože přídavné jméno má vždy stát před podstatným.
Protože diamant i strop je podstatné jméno, tak ten diamant zopakuji i jako přídavné (že může stát před druhým podstatným jménem) a i zvlášť jako skutečné podstatné jméno, když hráč jen řekne
>vem diamant. To opakování není úplně nezbytné, fungovalo by to i bez něj, ale TADS vždy bere samotné přídavné jméno jako méně hodnotnou shodu, když posuzuje více možností, o jaký objekt jde.
Ta slova v závorce pak jsou taková, která mohou být v příkazu zadaná, ale pokud jsou samotná, tak je bude TADS ignorovat. Jde o to, že třeba "u" je tak obecné slovíčko, že by ho hráč nenapsal samo o sobě a že je příliš nevýznamné, než aby se měl parser domnívat, že hráč hovoří o daném objektu. Podobně i to "stropu", je mnohem větší šance, že hráč chce prozkoumat strop a ne diamant u stropu, když napíše
>prozkoumej strop.
Ještě poznámka - gcVocab je duplicitní a záměnné se slovníkem, který lze zapsat rovnou pomocí šablony v úvodu definice objektu. Ale při všech těch pádech je to takové delší, tak se hodí mít na to samostatný řádek - já třeba v záhlaví objektu uvedu jen první pád a ty ostatní pak dávám do gcVocab, ale mohl bych to nacpat všechno jen nahoru.
A ještě otázka k akci MoveWith. Jak je zapsat aby bylo možné použít obě jak MoveWith tak i AttackWith?
Mám je napsat pod sebe jako akci AttackWith nebo je lze nějak spojit?
Jednu uděláš tak, jak potřebuješ a u druhé přesměruješ, např.:
dobjFor(LookThrough)
{
verify()
{
if(location.isOpen())
illogicalNow('Dveře jsou zasunuty ve stěně komory, takže okénko
je teď schované. ');
}
action ()
{ "Odsud je jím vidět do kupole. "; }
}
dobjFor(LookIn) asDobjFor(LookThrough)