webbed 28 april 2021 (Laatste aanpassing 18 augustus 2023)  checked 12 juli 2021

NetHack messagecount.


Back on track.

NetHack unieke messages.           ––more–––
Het is een uitgebreid spel. Ik speel nu NetHack (vanilla) 3.6.6. en SLEX.

Ik heb in eerste instantie op 1000 unieke messages gegokt.
1000 unieke boodschappen die gegeven kunnen worden.

Unieke messages:
– komen één keer voor.
– zijn in bepaalde situaties uit te lokken.
– zijn normaliter éénregelig. Al zal ik dat niet als star criterium gebruiken.
– met dingen als “You see … “ en dan één van de 350 monsters, of “You drop … “ en dan één van de 350 items, tel ik het als 1 message (2 dus).

Simpel dus, zou je denken. Maar nu nog even tellen. Voor een (groot) aantal situaties weet ik zo´n beetje wel welke message je krijgt. Voor een ander (groot) aantal messages weet ik bij welke situatie ze horen. Maar er zijn ook voldoende messages die ik nog voor het eerst zou moeten tegenkomen. Ofwel omdat ik andere strategieën speel dan anderen, ofwel omdat ik (nog) niet op het idee ben gekomen om iets uit te proberen.
Maar ik zou niet weten hoe ik iets zou kunnen zeggen over hoeveel messages ik ken en al helemaal niet over hoeveel ik er niet ken…

Ik ben nu dus al een tijdje aan het denken of ik toch op de een of andere manier iets kan zeggen over het aantal unieke messages (boodschappen, meldingen) dat NetHack kan genereren.
In elk geval kan ik er niet echt iets over vinden. Ook geen discussie of zo.


Is 1000 veel? Weinig?
Hoe kan ik er nu eens iets zinvols over zeggen.
Er zijn verschillende aanpakken mogelijk:

– Om te kunnen inschatten of 1000 op zichzelf veel of weinig is, kan ik misschien vergelijken hoeveel ondertiteling er zoal in films, of hoeveel messages in andere bekende spellen worden gebruikt.

– Voor de precieze heelveelheid (ja, waarschijnlijk wel…) zou ik de code gewoon kunnen doorspitten.

– Als ik soorten messages kan classificeren, kan ik zo wellicht beter schatten.

– Ik kreeg een goede tip. Hoeveel messages denk ik dat één commando kan opleveren? En kan ik dan meer over zeggen?

– Ik kan voor een aantal bekende situaties het precieze aantal messages bepalen met behulp van de NetHackWiki Pages, en dan extrapoleren.

Okee… Klinkt als een plan.


1000 dus.

Maar eerder meer dan minder. En dan zijn er in NetHack ook nog verschillende messages voor hetzelfde als je in een andere toestanden bent (blind of doof, confused of hallucinating). Dus nog eens een goede factor erbij voor de verschillende toestanden.


1000 is dat veel?

De ondertiteling van een film is opgedeeld in één– of tweeregelige stukjes. Stel ik vergelijk die éénregelige messages met de messages die je in NetHack kunt krijgen. De lengte van de ondertitelingsregels klopt zo´n beetje… Ze zijn ook vaak uniek of verwaarloosbaar overlappend. Wat wel kan is dat de twee regels in ondertiteling ook twee messages bevatten die op hetzelfde tijdstip worden weergegeven. Daarvoor moet ik een beetje corrigeren.
Laat me er eens een paar ondertitelingen bij pakken:
Down Periscope (1995) 962 keer ondertiteling, Slumdog Millionaire (2008) 900. Kill Bill (I) 700. Beavis and Butt–Head do America (1996) 700 (waarvan overigens 580 classic one–liners).
Doe dat x 1,5 als compensatie voor meerdere messages op gelijke tijdstippen.
Je zit dan dik aan duizend. Maar is dat veel tekst? Je kunt er wel een verhaaltje mee vertellen als je het beeld erbij hebt (net als NetHack). Maar is het veel?
Wel voor King´s Quest. Dat herinner ik me nog wel. En ook voor Wolfenstein 3d. Hoeveel zou een spel als World of Warcraft aan unieke messages hebben? Daar wordt veel tekst gegenereerd door players. Als dat meetelt loopt het snel op, al blijkt dat ze voornamelijk hetzelfde zeggen.
lol.
lol.
lol.


1000 even tellen

Ik begrijp dat er een functie in NetHack wordt gebruikt die You("") heet en die dus op het scherm een unieke regel laat zien die begint met You. You("sure are noisy.") bijvoorbeeld.
Ik zou die 'You("' met kunnen zoeken en tellen met een Find of zo….
Maar ik wil de code nu net niet op die manier doorlopen en bovendien zijn er ook zat meldingen die juist net niet met You beginnen, natuurlijk.
En ik heb geen manier om dan eventuele gelijke messages te herkennen.
Voorlopig valt deze methode dus even af. Uiteindelijk is dat de enige echt zuivere, ben ik wel bang… Maar het wordt dan wel meer ploegen dan spitten.


1000 in delen

Als ik de soorten messages een beetje classificeer, dan zijn de messages:
a– samenvoegsels van verschillende voorwaarden die dan een unieke melding on the fly genereren. Daar zijn er veel van.
b– complete messages die in specifieke situaties van toepassing zijn, daar zijn er ook veel van.
c– complete meestal grappige en leerzame meldingen, meer quotes, met een randomizer gekozen. De hoeveelheid daarvan lijkt mij in eerst instantie mee te vallen, maar schijn kan bedriegen.

Allemaal leuk en aardig, maar onkwantificeerbaar. Die quotes zijn dan nog het makkelijkste… Die zijn opzoekbaar.


1000 tips

Maar die tip. Om in gedachten even in te schatten hoeveel messages je mogelijk kunt krijgen als je een actie doet.
Even uit mijn hoofd. Dat is ook het elegante aan deze methode. Je kunt ca 50 acties doen. Stel je krijgt per actie 1 message, dan dus 50 messages.
Maar zulke acties bestaan niet. Er zijn altijd verschillende uitkomsten mogelijk per actie. 4 unieke messages dan? Voor àlle mogelijke acties 4 unieke messages? Makkelijk! 200.

200! al bij 4. En dan alleen directe commands! Aha.

1 seconde denken. 1000 is véél te conservatief geschat.
Maar hier kan ik inderdaad mee door.


1000 geëxtrapoleerd

Zitten op een throne en offeren op een altar kunnen een heel scala aan messages opleveren. In de NetHackWiki pages kan ik opzoeken van een aantal specifieke situaties wat je echt kunt krijgen. En van daaruit kan ik dan proberen te schatten.

Tijd voor een weloverwogen gok. Ik begin met dat gedachtenexperiment.

a– Het wordt een soort gok, niet een gefundamenteerde berekening.
b– Er zijn dubbelen, maar ik ga ervan uit dat die zullen blijven hangen in het “gokmarge”deel.
c– Ik richt me eerst op normale toestand (niet hallucinating of zo).
d– En dus steeds hetzelfde, maar dan met een ander ding of monster, tel ik als 1 message ( “You hit (a monster).” of “You drop (an item).”

Er is grappig genoeg ook een exact deel! Het deel van de quotes.
A– T–shirt teksten (ca 75)
B– rumors (ten minste 370)
C– oracle consultations (30 of zo)
D– engravings op gravestones (ook 30?)
E– een scala aan beledigingen of bedreigingen (ca 30)
F– en extra info (700) over van alles en nog wat. Er zijn zo´n 700 ! dichten of strofen daaruit opgenomen over monsters en dingen en je omgeving.

Dit alleen al is toch nog 1200! Dat valt me toch niet zo heel erg mee… Of is het 6? “You read (en dan één van de 6 hierboven).”
Of tellen de oracles en de extra info niet mee omdat ze te lang zijn (soms strofen lang…?) Nee! Onzin, het is 1200!

Ik moet bij het schatten wel even goed op blijven passen.
Messages komen van interacties. Een actie en een item. Of een item en een plaats. Of een monster en een itemtoestand. Ik moet uitkijken dat ik de messages niet zowel bij het éne als bij het andere tel. En dat is aanzienlijker makkelijker gezegd dan gedaan. Stel je krijgt: “Having fun sitting on the floor?”
Komt dat bij floor (zeg dungeon features) of bij sit (commando´s)? Het maakt mij niet echt uit, als het maar niet bij de ander ook wordt meegenomen.
Dit is nu lastig in te schatten. Ik denk dat ik er een factor voor moet besluiten aan het eind.

Stel dat ik de messages opdeel in soorten en daar dan een modifier over:
a– commands en extended commands (70+) “inventory”, waarvan acties “tip” 50
           Ik stel voor: x4 dat is 200
b– dungeon features “fountain” 20
           Ik stel voor: x4 dat is 80
c– dungeon spec rooms “Beehive” 8
           Ik stel voor: x2 dat is 16
d– dungeon branches “Sokoban” 20
           Ik stel voor: x2 dat is 40
e– items “tallow candle” 350 (waarvan 50 tools, 150 weapons en armor)
           Ik stel voor: x4 dat is 1400
e– itemtoestanden “blessed thoroughly rusty gloves” (blessed, cursed, corroded, enz.) 10
           Ik stel voor: x2 dat is 20
f– monsters “The nymph smiles seductively…” 380
           Ik stel voor: x0,5? dat is 190
g– polymorphed 25 “Stormbringer tastes delicious!”
           Ik stel voor: x4 dat is 100
h– food “This monster corpse tastes okay.” (75)
           Ik stel voor: x4 dat is 300
h– see hear feel 6 “You notice an attractive smell.”
           Ik stel voor: x10 dat is 60


Waarom zijn er zoveel messages op items? Het zijn er veel. Ze geven niet allemaal even veel messages.
Hou in je achterhoofd dat NetHack een spel is waarbij je, als moordende reiziger probeert je spullen zo netjes, snel en duidelijk mogelijk te organiseren.
Maar het is een belangrijk deel van het spel om er met omwegen achter te komen wat welk item is, om te zorgen dat je minimaal effect hebt van slechte effecten. Sommige items zijn erg gunstig, anderen erg onhandig. Om het uit te kunnen vinden zijn verschillende manieren voorradig. Met dus verschillende messages voor verschillende effecten. En ja, het duurt even voordat je al die determinatiemethoden uit je hoofd weet. Maar de tijd vliegt…

Misschien is een betere vraag: Waarom zijn er zo weinig op monsters?
Tja, zeker niet elk monster heeft een aparte messagepool. Maar een aantal heeft een hele serie messages, zoals de shopkeeper. Het is een inschatting.

Nou, dat is dan 2400.
mmm. a– factor voor dubbelen: Er zijn dubbelen maar ik heb voorzichtig geschat. Ik denk binnen de gokmarge. (x1)
c– factor voor blind (x1,05)
d– confused (x1,05)
e– hallucinating voorzichtige schatting (x1,2)

En let op: dat is echt niet maximaal, eerder minimaal. Ik weet dat er nog legio messages zijn voor losse, naar het mij voorkomt betrekkelijk weinig voorkomende situaties. Die reken ik ook maar deels mee bij e– items x4 en f– monsters x0,5.
Vanzelf kun je geraakt worden door een gnome, maar ook door een angel, en hoewel het commentaar dan dus anders is “The gnome hits.” vs “The angel hits.”, tel ik dat hier als 1.

Dat is dan ca 3150 unieke messages voor specifieke situaties. Doe daar de 1200 spreuken en andere info bij en dan zitten we op 4350.


Okee. 4400. Ik houd het voorlopig eens op 4400. Het is aanzienlijk meer dan 1000. En 1000 is al aanzienlijk. Ga maar eens een stroom diagram uitschrijven voor 1000 unieke meldingen.

SLASH´EM is een aangepaste versie van NetHack. Zeg maar, de uitgebreide versie voor mensen die ook eens wat moeilijks willen (doe ff bleeder waarbij je over het hele spel dubbel damage vangt en altijd (dood)bloed). Het is mij niet duidelijk hoe je die ooit uit moet spelen, maar goed, dat vind ik van vegan ook al…
Het lijkt me helemaal niet eenvoudig om één en ander dan nog een beetje in balans te houden. Maar Balans is overrated.
Alles is meer. Veel meer. Meer commands, items, monsters, special rooms, enz, enz. Ik gok ten minste x1,25.
5600 minimaal.
Mmm. Ik heb even gekeken naar de roles en de races. Ik dacht dat het nog wel meeviel, maar om maar eens wat te noemen: In NetHack kies je je role (class) en daarna je ras. Je kunt kiezen uit wel 13 verschillende rollen en uit 6 rassen. Al kan je niet alle rassen spelen met alle rollen.

In de laatste versie van Slash, Slash´EM Extended (also known as “Sadistic Levels of Endless X–Citement”, SLEX for short) kies je uit 163! rollen en mag je daarbij ieder ras spelen. En dat zijn er –hou je vast– 262!! En als ik het goed heb ook nog gecombineerde rassen ook. Ik sta eigenlijk paf. Maar dat, gecombineerd met een dubbel aantal dungeons (100…) en wat extra branches, extra commands, extra items, extra quests, extra alles, maakt dat het z´n naam wel eer aandoet. Als ik het goed las bestaat het DEV–Team van SLEX uit één vrouw. (Vooruit en nu met ook één man erbij.) Ongelooflijk. Maar 1,25 lijkt me een echt niet te hoog.

Wacht eens even.
Nee, ik moet het anders doen. Ik kan weldegelijk om die dubbelen heen als ik er een beetje tijd insteek. (Tot nu toe nog geen tijd ingestoken, moet je maar denken).
Vrijwel geen commando staat geheel op zichzelf. Er is altijd iets anders bij: “You kick the altar.” Zelfs “chat” vraagt nog “in welke richting?”
Als ik categoriën maak van combineerbare dingen, kan ik die schatten en zo dan wellicht die 4500 dubbelchecken.
Ik maak een schemaatje met alles wat samen met wat anders een boodschap kan geven. Steeds twee dingen: command-dungeon feature of monster-item, enz. Dat is een nog net overzichtelijk aantal categorieën waar nooit dubbelen in kunnen zitten. En dan maar gokken.

Ik ga uit van de volgende dingen:
commands (ca. 70, waarvan 50 met spelgerelateerde messages.)
dungeon features, branches, special rooms (ca. 20 + 20 + 8)
items (scrolls 23, potions 28, rings 28, wands 24 , amulets 12, books 40, gems 36, food 33, weapons 75, armor 80, tools 56, rest =4 -> ca 440)
(Hé, dat zijn er meer dan hier wat hoger!…)
itemtoestanden (blessed, uncursed, cursed, greased, invisible, rustproof, burned, enz. 7)
monsters (ca 380)
gepolymorphed (mogelijk 320, waarvan 25 met eigen (nieuwe) acties)

En daar gaan we dan: Heeft elk dungeon feature één of meer unieke messages bij elk command? Dat zou dan worden: 50x20 = 1000 En dat zou hard gaan.
Gelukkig weet ik nu al dat sit en dan de muur geen unieke message gaat geven.
En eat – door ook niet. Hoewel… Als je in een houteter verandert… Eat throne dan? Ik denk het niet.
Dus wat te schatten…? Drop – dungeon feature? Kan ik nu zo gauw even niets bij bedenken.
De helft van 20x50 = 500. Dat lijkt me in elk geval eens niet te weinig.
Command-item. Ik denk dip, read, wield, engrave, apply. Maar nu hoeveel?

Ja. Dat was leuk bedacht. Maar daar ga ik er niet mee komen. Ten eerste is echt lastig voor een een aantal gecombineerde categorieën te bepalen hoeveel messages die zou kunnen opleveren, maar er zijn ook veel messages die meer dan twee voorwaarden nodig hebben en dan loopt het al snel uit de hand.

Jammer, maar ik houd het dus op 4500. En dat is niet te veel.


Okee.
Dat was juli 2021. Het is vandaag 18 augustus 2023.
Tot gisteren had ik nog geen betere grip gevonden op het probleem.
Maar zocht ik nog even iets op, kwam ik op github een lijst tegen met (bijna) alle NetHack messages.
Dat is de druppel. Nog één keer dan…

Het gaat om de volgende lijst: (Almost) all Nethack messages, more gooder version (much better).
De programmeur (of euze) heeft (blijkbaar) een soort programmaatje geknutseld dat alle code doorspit en iedere keer als er iets van een message wordt genoemd, die dan doorspeelt naar txt.
Wat het ook moge doen, het is in elk geval wel een echt getal.

Dus alle (vrijwel alle) NetHack messages! Doorgespit. Bravo!
Het zijn 4112 regels!

Maar de lijst geeft samengestelde messages ook weer op één regel.
Stel dat NetHack wil zeggen dat je je ring niet aan je linker ringvinger kan doen, staat hier dat “het monster dat je bent (wie zegt dat je in human vorm bent?) de ring niet aan de ring–extremiteit (afhankelijk van soort monster) kan doen”.
Je kunt een paar honderd monsters zijn, en een aantal daarvan heeft geen vingers maar tentakels of hoeven of weet ik het. Die ene zin kan misschien wel 50 (aantal monsters met problemen) x 3 (aantal soorten ringvinger–extremiteiten) = 50 (!) unieke vormen hebben. Pas op: één (probleem)monster heeft één extremiteit.
Maar alle monsters op één hoop is 1 message, de extremiteiten 2 of meer. Ik reken dan 2, soms meer dan twee.
Dus zo´n beetje (schattend) verrekend: + ca 1800 uniekige messages. Dat rond ik af op 1800 volledig unieke messages.

Dan nog de standaardteksten, dat zijn er (nu) ca 1900 in NetHack 3.6.7
En dat levert dan meer dan 7800 messages op.

En dan: …

Het is natuurlijk wel van 9 jaar geleden. Dat was het einde van 3.4.3, de start van 3.6.0. Er zijn veel, heel, heel veel veranderingen.
Zou dubbel aantal messages kunnen? De lijst monsters is vrijwel gelijk gebleven. De lijst items is vrijwel gelijk. Dubbel lijkt me wel heel veel.
Mmm…

factor 1,5 zou zijn: iets van 11.250. Wie weet, maar laat ik voorzichtiger zijn.

Ik houd het vanaf nu op 10.000!
Het is nog steeds een (gefundeerde) gok.
Maar deze keer niet (veel) te laag gegokt.

Ik zeg zo´n factor 10 naast mijn eerste schatting.

Maar goed. Zoveel beter is het spel ook dan ik denk.