Jasně, to dává smysl. Takže v tomto případě by byl nejlepší nůž, i kdyby ve hře reálně fungoval příkaz jen na jeden objekt, protože by mohly existovat další situace, ve kterých by dávalo smysl, že chci něco uříznout, i kdyby to mělo hodit jen odezvu, že to nejde.
V podstatě ano. Ale pro úplnost i zde platí, že je zároveň potřeba se řídit knihovnou. Akce CutWith je zakázaná verify metodou dobj i iobj, takže verify je nutné přetížit prázdným tělem v rámci dobj liány i iobj nože, čili na obou místech. Právě ty verify() metody zobrazují hlášku, že to nejde.
Sladění synonym u CutWithWhat a CutWith pomohlo. Jen odezva na uřízni lianu odpoví - Co jí chceš uříznout.
Mě to tu funguje, asi bychom se museli bavit o konkrétním testcase. Mám tu něco jako:
+ PreferredIobj, Thing 'nůž' 'nůž' *2
iobjFor(CutWith)
{
verify() { }
}
gcName = 'nože, noži, nůž, noži, nožem'
gcVocab = 'nože/noži/nožem'
;
+ Thing 'liána' 'liána' *3
dobjFor(CutWith)
{
verify() { }
action() { "{Kýmčím iobj} jsi přeřízl {kohoco dobj}."; }
}
gcName = 'liány, liáně, liánu, liáně, liánou'
gcVocab = 'liány/liáně/liánu/liánou'
;
Ještě jsem přemýšlel, o takové vychytávce, že by ta akce pouze s přímým objektem automaticky vybrala vhodný objekt. Zjistilo by to např. jestli mám objekt odpovídající třídy a akci provedl s ním, případně by se zeptal, který pokud by jich bylo více. No, to už je taková pomalu zbytečnost.
To není problém, to tak funguje automaticky. Pokud je jen jediný nůž, tak příkaz "uřízni liánu" ho zvolí automaticky, pokud mám víc nožů, zeptá se "Čím ji chceš uříznout?"
S čím mám problém je příkaz "uřízni nožem", na to není TADS v anglickém originálu stavěný a já zatím nepřišel na to, jak v situaci s chybějícím objektem prohodit roli iobj a dobj, jinýmy slovy TADS předpokládá, že vždy chybí iobj.
Ještě pro úplnost k třídě PreferredIobj. Ještě by se mělo do VerbRule(CutWith) přidat: preferredIobj = PreferredIobj
Ano, už jsem si toho také všiml. Ono by to spíš mělo být tak, že v cs_cz.t by podmínka:
if (preferredIobj != nil && dobjInfo.obj_.ofKind(preferredIobj))
Měla být změněna na:
if (preferredIobj != nil && dobjInfo.obj_.ofKind(preferredIobj)
|| dobjInfo.obj_.ofKind(PreferredIobj))
Ty akce bez předložek (MoveWith, TurnWith, BurnWith, CutWith, CleanWith, (Un)LockWith, (Un)ScrewWith) nemám zatím moc prozkoušené a doladěné.