Difference between revisions of "Talk:Slash'EM Extended"

From NetHackWiki
Jump to navigation Jump to search
(Bug Report)
(Bug Report)
Line 157: Line 157:
 
:::Almost forgot, the source code hasn't been updated yet but it will be in the near future.
 
:::Almost forgot, the source code hasn't been updated yet but it will be in the near future.
 
Also, dass es nur einmal ersetzt wird, liegt daran, dass es in der ursprünglichen Version nur einmal (pro wort) geprüft wird, und das war auch schon vorher so (Im Wizard-Mode "You You You You" in den Staub schreiben, und beim Lesen kommt "Ye read : You You You You"). Wobei die Tatsache, dass sie was man auf den Boden schreibt übersetzt auch nicht umbedingt gut ist, denn wenn man "eyelbereth" auf den Boden schreibt, liest man "deadlightlbereth" und trotzdem müsste das Elbereth funktionieren. Es mehrmals zu ersetzten hat aber auch Nachteile, da man so mit der Fruit Option oder Engrave Strings erzeugen könnte "eyeeyeeyeeye..." die den Puffer zum Überlauf bringen (was mit panic() abgefangen wird, aber ohne panic() wäre es gefährlicher). Um es mehrmals zu überstzen, wäre es denkbar, am Schluss nochmal mit strncmp() zu prüfen, ob der String immernoch vorhanden ist, und wenn ja, *st auf *buffer setzen, und mit goto an den Anfang der Funktion zu springen. Dazu müsste man aber genau prüfen, ob das Ergebnis länger als BUFSZ ist. Ich werde mich mal drum kümmern. Eventuell auch strings in Anführungszeichen ignorieren, um Probleme mit "eyelbereth" zu vermeiden -- CK [[Special:Contributions/79.225.101.242|79.225.101.242]] 12:27, 13 June 2014 (UTC)
 
Also, dass es nur einmal ersetzt wird, liegt daran, dass es in der ursprünglichen Version nur einmal (pro wort) geprüft wird, und das war auch schon vorher so (Im Wizard-Mode "You You You You" in den Staub schreiben, und beim Lesen kommt "Ye read : You You You You"). Wobei die Tatsache, dass sie was man auf den Boden schreibt übersetzt auch nicht umbedingt gut ist, denn wenn man "eyelbereth" auf den Boden schreibt, liest man "deadlightlbereth" und trotzdem müsste das Elbereth funktionieren. Es mehrmals zu ersetzten hat aber auch Nachteile, da man so mit der Fruit Option oder Engrave Strings erzeugen könnte "eyeeyeeyeeye..." die den Puffer zum Überlauf bringen (was mit panic() abgefangen wird, aber ohne panic() wäre es gefährlicher). Um es mehrmals zu überstzen, wäre es denkbar, am Schluss nochmal mit strncmp() zu prüfen, ob der String immernoch vorhanden ist, und wenn ja, *st auf *buffer setzen, und mit goto an den Anfang der Funktion zu springen. Dazu müsste man aber genau prüfen, ob das Ergebnis länger als BUFSZ ist. Ich werde mich mal drum kümmern. Eventuell auch strings in Anführungszeichen ignorieren, um Probleme mit "eyelbereth" zu vermeiden -- CK [[Special:Contributions/79.225.101.242|79.225.101.242]] 12:27, 13 June 2014 (UTC)
 +
 +
So, hab mich jetzt noch mal drum gekümmert, dass replace() mehrere ersetzen kann und zahlreiche Sonderfälle abfängt, und gleichzeitig pline() auf Geschwindigkeit optimiert (da replace() jetzt langsamer ist). Um zu vermeiden, dass der Rechner abstürzt, wenn man versehentlich replace() mit parametern, die sich selbst enthalten aufruft {replace(line,"old","ye olde")} ersetzt sie das gleicher Wort maximal 20 mal. Trotzdem sollten sich selbst enthaltende Ersatzwörter nicht verwendet werden, da man dann etwas wie "ye ye ye ... oldeeeeee" erhalten würde. Das tritt bei den jetzigen Beispielen aber sowieso nicht auf.
 +
 +
In folgenden Fällen wird das Wort nicht ersetzt :
 +
* Der string beginnt mit '"' - Das wäre nämlich eine wörtliche Rede von einem nich-Piraten. (und Questmonster haben sowieso individuelle Texte)
 +
* Vor dem gefundenen Wort kommt '"' vor. - Ebenfalls wörtliche Rede
 +
* Vor dem gefundenen Wort kommt "read","called" oder "named" vor - das wäre eine Eingabe des Spielers, die nicht verändert werden sollte (Problem : Fruit kann nicht erkannt werden). Wörter davor werden aber nicht beeinflusst (You read wird trotzdem zu Ye read, aber der gelesene Text bleibt unverändert)
 +
* Es kommt "tiger" im String vor, da "tiger eye ring" im Inventar-Menü sowieso unverändert ist, sollte es auch in der oberen Zeile sein.
 +
* Das Wort ist "Eye" und es kommt nach dem Wort "Aethiopica" oder "Overworld" vor, um Eye of the Aethiopica und Eyes of the Overworld nicht zu verändern.
 +
* Der String wäre länger als der Puffer, und würde zu panic() führen.
 +
 +
Bei pline habe ich folgendes verändert :
 +
* Wenn der String zu lang oder zu kurz (<9 z.B. "It hits.") ist, mit '"' anfängt oder wir in impossible() sind tritt sie gar nicht erst in Role_if(PM_PIRATE) ein.
 +
* Die vielen Abfragen, ob zorkmid in verschiedenen Schreibweisen durch doublon ersetzt werden soll, sind in einem if-block, so dass sie nur gemacht werden, wenn "orkmid" im String enthalten ist.
 +
* Gleiches gilt auch für "old coin" und "old piece"
 +
 +
Ich schicke es dann mal per E-mail.
 +
-- CK [[Special:Contributions/79.225.101.242|79.225.101.242]] 20:45, 13 June 2014 (UTC)

Revision as of 20:45, 13 June 2014

Is there going to be a windows binary release that supports graphical tiles?

Only if someone makes tiles, since I don't use them, and I also suck at making new ones for all the new monsters. New versions often add new monsters/items/other things too, so they would all need new tiles as well... anyway, if someone wants to take their time making tiles, they may be included in a future release, but I certainly can't make them myself. --Bluescreenofdeath (talk) 05:58, 12 May 2014 (UTC)
Dear Amy, I'm impressed of your efforts and energy and sadistic humor you put in this fork, really appreciate it. It's whole new era of Slash'em since 2006! I will definitely continue playing S'EX (and maybe sometimes ascend)))). Usually I play roguelikes in ascii although tiles are nice to have. How much new tiles do you need? Maybe I could do some pixelart. But probably making tiles would be more productive after several major versions when most of new content would be added. --Transcendreamer (talk) 10:02, 19 May 2014 (UTC)
Are you thinking to port to android? (I used to play unnethack on my phone.) --Transcendreamer (talk) 10:02, 19 May 2014 (UTC)
Glad that you like it! Unfortunately there would have to be many hundreds of tiles for the monsters alone, and also some for new items; the sourcecode (especially monst.c) shows what's been added. Compared to vanilla SLASH'EM, there are about twice as many monsters now. About an Android port, I'd do that if only I knew how... maybe there is a step-by-step guide on how to compile the game for Android (or other platforms)? --Bluescreenofdeath (talk) 11:26, 19 May 2014 (UTC)
Wow, twice compared to slashem, it rocks. Probably they will not even fit in a single file. Maybe is it possible to group monsters/items and make them using shared tiles? E.g. Kobolt uses Kobold tile, Ogro - Ogre tile, Trollor - Troll tile, etc. So we will need some kind of mapping table for those monsters/items which could be mapped on shared tiles. And for the rest unique monster/items I will draw a new tiles. What do you think? Or they all are mostly unique? --Transcendreamer (talk) 12:15, 19 May 2014 (UTC)
I'm not a programmer but it seems to me that there's a bundle for android and at least 2 nethack ports are using it: https://code.google.com/p/android-nethack-port/ Inside source repository there is a svn/trunk/sys/android folder, and readme file contains build instructions accompanied with android specific resource files. --Transcendreamer (talk) 12:15, 19 May 2014 (UTC)
Well I did take a look at the android code, but it seems the compilation instructions are for Linux/Ubuntu systems, and all the PCs that I use are running Windows. Maybe there would be some way to make it work, but it's certainly not going to be easy. And also, real life is currently limiting the amount of time I can spend on Slash'EM Extended, unfortunately... Of course some tiles could be shared, but there's also lots of all-new stuff (like wall/rub monsters), and I'd also need to figure out how to add new tiles to the game in the first place. But if you really want to make them, I'll see what I can do. --Bluescreenofdeath (talk) 07:02, 20 May 2014 (UTC)

Version History

BsoD,

Could we get a Version History?

Useful information might include - version (your version #), date released, what did you change and/or add, are previous version Bones files supported

--Diesalot (talk) 20:16, 27 May 2014 (UTC)

I fear that's not very easy for me to do, since I didn't really take notes on which versions added/changed what. The main Slash'EM Extended page mentions for a few features when they were added (mainly new races/classes), and the other thing that I can do is to make a chronological list showing the order in which most of the new stuff was added, but without exact version numbers unfortunately. Currently, most of the time old savegames and bones files will no longer work upon updating; I hope that if some day all the items, monsters and roles/races that I want in the game have been added, compatibility will be better. However the variant is still in a WIP state; the current release version is stable and playable, but new versions are appearing often.
Also, I got your logfile and analyzed it a bit. Your version of the game is more than a month old, however; I remember that being the version where enemies with firearms were grossly overpowered, as evidenced by the fact that most of your characters died to bullets. Enemy gunslingers have been nerfed quite a bit since then, and there will (probably) be a new version soon that improves the player's chances of surviving their attacks even more. What amazes me is that the lycanthropic Knight was actually your best run; my own lycanthropic characters seem to die a lot earlier, despite my efforts to make that race not suck... Many of the harder races (insectoid, mould, ungenomold etc.) have also been improved, so they should be more playable now. Some of your most obscure deaths were the following ones: "killed by a petty black widow" - this must obviously have been a polytrap abomination, since that is a level 24 creature that shouldn't be normally generated on dlvl5. "poisoned by a brown pudding" - yeah, pudding farming is a lot harder to do, and puddings have some evil disease-inflicting attacks so it's probably best to take them out with ranged attacks or spells. And "killed by a died" is actually a bug; I suppose it was some sort of disintegration attack, which have the weird tendency to give that message instead of "killed by an antimatter vortex" or similar. Of course, if it actually was an antimatter vortex that killed you, it was another outta-depth spawn (probably a polytrap abomination) on dlvl4.
Thanks for the feedback, I'll keep on working to make Slash'EM Extended more enjoyable (especially by making the early game a bit less deadly while late game remains dangerous) and also try to create some sort of version history. --Bluescreenofdeath (talk) 06:12, 28 May 2014 (UTC)

Thanks for the feedback, I appreciate it all. I am now using your most recent version and will log as many games as I am able until your next update (I'll be sure to dump the 50 games I sent you from the next log file). My current Snake Valkyrie just found the first Noble artifact in Minetown - I have not wielded it (yet), but it could prove pretty helpful. --Diesalot (talk) 15:58, 28 May 2014 (UTC)

A rudimentary version history has been created. It's very incomplete though, as I unfortunately didn't take enough notes to see which version changed what. Still, I guess it's better than nothing. --Bluescreenofdeath (talk) 09:51, 6 June 2014 (UTC)

Bug Report

Perhaps you have already squashed this - it is from your End of May 2014 version. When selling a crude short sword in a shop: "Manlobbi offers 4 pieces of eightghtghtghtghtghtghtghtghtghtghtghtghtghtghtghtght" (that's "ght" 16 times) --Diesalot (talk) 17:10, 10 June 2014 (UTC)

This is a side effect of the Pirate role; actually I don't know why the game is doing this, since it's supposed to simply transform "zorkmids" into "pieces of eight", but since I don't know how to fix it and it's (hopefully) not crashing the game, it hasn't yet been fixed. Of course it is a bug though; I recall floating eyes also giving similarly weird messages... --Bluescreenofdeath (talk) 05:56, 11 June 2014 (UTC)
I found out why the game does this. That happens if you copy a string unto himself. Appearently there is a failsafe feature in this C-Compilers sprintf() funktion, beacause the "normal" effect would be that your computer crashes. During the course of this day, I will write a Bugfix, and post it here or write an E-mail to Amy (if I find your adress). Until when better don't play a pirate. -- CK 79.225.101.242 07:24, 13 June 2014 (UTC)

OK, it is done. As you are German, like me, this makes things a lot of easier. Der Fehler ist in der Funktion replace() in PLINE.C . Die erzeugt einen String und Schreibt ihn immer in den gleichen globalen char vektor buffer[]. Wenn ein String, mit dem replace() mehrmals aufgerufen wird als Parameter von pline() auftritt, wird beim ersten Aufruf das Ergebnis in buffer zurückgeliefert, und beim zweiten Aufruf ist buffer somit der Parameter *st der Funktion replace(). Die Funktion replace() muss also einen String an Ort und Stelle verändern. Das geht solange gut, wie der einzusetzende String *repl kleiner als der zu ersetzende String *orig ist. Ist jedoch *repl größer, wird beim einsetzen von *repl, der zu erhaltende Schwanz von *st (das ja identisch mit buffer[] ist) überschrieben. Danach versucht sprintf() den Schwanz, der ja bereits überschrieben ist, an eine Stelle nach seinem Anfang kopiert. Es werden also in der Mitte des Strings Buchstaben gelesen, die ans Ende angefügt werden. Der String wird also immer länger, da der Lesezeiger von printf() immer wieder die bereits geschriebenen Buchstaben einliest und den String weiter verlängert, und somit den String bis ins Unendliche verlängert.

"You hit the floating eye.",0
"Ye hit the floating eye.",0
;/------------------------------------- String
;|                              /------ Terminator
;|                              |  /--- Schrott am Ende
;v                              v  v
"Ye hit the floating deadlight",0,"qwertzuiopü..."
;                       ^       ^
;                       |       \- Destiny
;                       \--------- Source
;                              /--- Schrott am Ende
;                              |
;                              v
"Ye hit the floating deadlightdqwertzuiopü..."
"Ye hit the floating deadlightdlwertzuiopü..."
"Ye hit the floating deadlightdliertzuiopü..."
"Ye hit the floating deadlightdligrtzuiopü..."
"Ye hit the floating deadlightdlightzuiopü..."
"Ye hit the floating deadlightdlightzuiopü..."
;                             ^     ^
;                             |     \- Destiny
;                             \------- Source
"Ye hit the floating deadlightdlightduiopü..."
"Ye hit the floating deadlightdlightdliopü..."
"Ye hit the floating deadlightdlightdliopü..."
"Ye hit the floating deadlightdlightdligpü..."
"Ye hit the floating deadlightdlightdlighü..."
"Ye hit the floating deadlightdlightdlight..."
;                                   ^     ^
;                                   |     \- Destiny
;                                   \------- Source

; Das ganze geht weiter bis beim Zeiger Source ein Terminato (0)
; gefunden wird, was aber niemals passiert

--CK 79.225.101.242 09:12, 13 June 2014 (UTC)

Okay, danke für die Erklärung, ich habe jetzt ein Workaround geschrieben, aber ein echter Bugfix wäre besser (das Workaround sorgt lediglich dafür, daß Meldungen, in denen "eye" und "zorkmid" genau 1mal vorkommen, richtig funktionieren); meine E-Mail-Adresse ist failureclockATgmxDOTde (AT durch Klammeraffe und DOT durch Punkt ersetzen :-). Oder einfach die berichtigte Funktion hier posten. Der Bugfix würde dann von mir in die nächste Version eingefügt werden. Vielen Dank! --Bluescreenofdeath (talk) 09:39, 13 June 2014 (UTC)

Nun, der Ansatz das ganze zu korrigieren. Man muss dafür sorgen dass die Quelle von replace() niemals der Puffer ist. Dafür gäbe es mehrere Möglichkeit. replace() könnte mit strdup() eine Kopie erzeugen, die dann vom Aufrufer gelöscht werden muss, so wie es BASIC oder JAVA intern machen, diese Methode ist aber (wie BASIC und JAVA) extrem langsam. Der Aufrufer könnte nach jedem Aufruf eine Kopie mit strcpy() machen, das würde aber bedeuten, das bei jedem Aufruf von pline() massenhaft daten bewegt werden müssen, was noch langsamer ist. Mein Ansatz hingegen nutzt die Tatsache aus, dass es lediglich darum geht, das Quelle und Ziel unterschiedlich sind, also grundsätzlich nur zwei Puffer gebraucht werden. Damit garantiert wird, dass der Puffer bei einem Aufruf niemals der gleiche Puffer wie beim letzten Aufruf ist, reicht es aus, bei jedem Aufruf zwischen den beiden Puffern zu wechseln. Dazu nehmen wir einen globales char vektor buffer[], der 2*BUFSZ groß ist, und eine globale Variable flipflop, die angibt, ob wir die vordere oder die hintere Hälfte nehmen. Gleichzeitig dient flipflop als Wächter, der beim Pufferüberlauf von buffer[] überschrieben wird, und somit einen ungültigen Wert enthält, bei dem panic() aufgerufen wird. Sollte doch mal der Störfall auftreten, dass replace() mit dem Puffer, den sie jetzt nehmen würde als Quelle aufgerufen wird, dann ruft sie im Wizard-mode impossible() auf und liefert ansonsten den unveränderten String zurück. Weiterhin habe ich dafür gesorgt, dass replace() nicht wirksam ist, wenn program_state.in_impossible wahr ist, den impossible() ruft pline() auf. Ich habe die Funktion jetzt so geschrieben, dass sie auf Geschwindigkeit und Sicherheit optimiert ist, also warscheinliche Abbruchbedingungen und Störfälle zuerst geprüft werden, die Reihenfolge ist also für die Effizienz der Funktion entscheidend. Weiterhin ist wichtig, dass die lokalen Variablen von replace() nicht initialisiert werden, sonder ihren Wert erst erhalten, wenn wir wissen, dass sie auch gebraucht werden, also ein zu ersetztendes Wort aufgetreten ist. Weiterhin ist es Absicht, dass &replace_buffer[] mit (flipflop^=1)?BUFSZ:0 indiziert wird, und nicht mit (flipflop^=1)*BUFSZ, denn erstens würde das bei flipflop werten, die im Störfall größer als 1 sind eine Adresse auserhalb des Vektors zurückliefern und andere Aten zerstören, und zweitens dauert eine Multiplikation etwa 50 Rechenschritte, währen eine Fallunterscheidung etwa 10 Rechenschritte benötigt (Auch wenn die CISP-Architektur des 8086 Prozessors einen Assembler-Befehl zur Multiplikation ermöglicht, heist das noch lange nicht, dass eine Multiplikation schnell geht). Ich konnte die Funktion jetzt nicht ausprobieren, da ich keinen C-Compiler für WIN32 habe, aber es müsste funktionieren (Ansonsten bitte melden).

#if 0 /* code from Amy */
char *replace(st, orig, repl)
const char *st, *orig, *repl;
{
	static char buffer[BUFSZ];
	char *ch;
	if (!(ch = strstr(st, orig)))
		return st;
	strncpy(buffer, st, ch-st);  
	buffer[ch-st] = 0;
	sprintf(buffer+(ch-st), "%s%s", repl, ch+strlen(orig));
	return buffer;
}
#endif /* code from Amy */

/* code from CK */

/*Consecutive calls to replace would result in strings copied onto itselves*/
/*So we alternate between two buffers*/
char            replace_buffer[BUFSZ*2]; /* two buffers */
unsigned int    flipflop=0;              /* which one ? */
/* flipflop must be unsigned int (not int or boolean) to act as senitel */
/* If it wrote beyond the end of buffer, flipflop is >1 ... */
/* ... then you can panic */

char *replace(st, orig, repl)
const char *st, *orig, *repl;
{
        char *buffer;
	char *ch;

        /*Most calls won't match, so do the match first.*/
	if (!(ch = strstr(st, orig)))
		return st;

        /* get a buffer */
        buffer = &replace_buffer[(flipflop^=1)?BUFSZ:0];

        /* Don't convert disorder messages into pirate slang ! */
        /* Nested calls of impossible() call panic(). */
        if(program_state.in_impossible) return st;

        /* If it is the same buffer, something went wrong. */
        /* This may happen if you work with two strings at the same time */
        /* and make intersecting calls to replace */
        if(buffer==st)
        {
         /* Assert a disorder if in wizard mode */
         /* otherwise do it silently */
         if(wizard)
           impossible("Intersecting calls to replace() in pline.c !");
         return st;
        }

        strncpy(buffer, st, ch-st);  
	buffer[ch-st] = 0;
        sprintf(buffer+(ch-st), "%s%s", repl, ch+strlen(orig));

        /* we don't know how much data was destroyed, so assume the worst */
        if(flipflop>1)
          panic("Memory leak in replace() !");

        /* The return value is one of the buffers. */
	return buffer;
}
/* code from CK */

-- CK 79.225.101.242 09:47, 13 June 2014 (UTC)

Scheint zu funktionieren, vielen Dank! Allerdings ist es jetzt anscheinend so: wenn ein zu ersetzender Begriff mehrfach im String vorkommt, z.B. "a floating eye corpse named floating eye", wird nur die erste Instanz von "eye" durch "deadlight" ersetzt. Oder vielleicht war das schon vorher so? Jedenfalls kommen keine "pieces of eightghtghtghtghtght"-Fehler mehr. :-) Translation for non-German speakers: thanks to CK's help the bug has been removed now, and the next uploaded version will have the Pirate slang working as intended. --Bluescreenofdeath (talk) 10:25, 13 June 2014 (UTC)
Okay, new version upload complete! For the sake of it I'll write down what exactly got changed: Kick attacks done by the player can be stronger, gremlins have increased odds of stealing intrinsics at night, couatls and certain other enemies can also drown the player in lava (as opposed to water only) - be careful, eating poisonous corpses has a lower chance to reduce strength, enlightenment can show the player's exercised/abused stats and when to expect the next stat-ups, lycanthrope characters do extra melee damage so they don't completely suck, bashing enemies with bows or polearms isn't as useless as it used to be, and the pirate slang shouldn't be bugged anymore. --Bluescreenofdeath (talk) 10:47, 13 June 2014 (UTC)
Almost forgot, the source code hasn't been updated yet but it will be in the near future.

Also, dass es nur einmal ersetzt wird, liegt daran, dass es in der ursprünglichen Version nur einmal (pro wort) geprüft wird, und das war auch schon vorher so (Im Wizard-Mode "You You You You" in den Staub schreiben, und beim Lesen kommt "Ye read : You You You You"). Wobei die Tatsache, dass sie was man auf den Boden schreibt übersetzt auch nicht umbedingt gut ist, denn wenn man "eyelbereth" auf den Boden schreibt, liest man "deadlightlbereth" und trotzdem müsste das Elbereth funktionieren. Es mehrmals zu ersetzten hat aber auch Nachteile, da man so mit der Fruit Option oder Engrave Strings erzeugen könnte "eyeeyeeyeeye..." die den Puffer zum Überlauf bringen (was mit panic() abgefangen wird, aber ohne panic() wäre es gefährlicher). Um es mehrmals zu überstzen, wäre es denkbar, am Schluss nochmal mit strncmp() zu prüfen, ob der String immernoch vorhanden ist, und wenn ja, *st auf *buffer setzen, und mit goto an den Anfang der Funktion zu springen. Dazu müsste man aber genau prüfen, ob das Ergebnis länger als BUFSZ ist. Ich werde mich mal drum kümmern. Eventuell auch strings in Anführungszeichen ignorieren, um Probleme mit "eyelbereth" zu vermeiden -- CK 79.225.101.242 12:27, 13 June 2014 (UTC)

So, hab mich jetzt noch mal drum gekümmert, dass replace() mehrere ersetzen kann und zahlreiche Sonderfälle abfängt, und gleichzeitig pline() auf Geschwindigkeit optimiert (da replace() jetzt langsamer ist). Um zu vermeiden, dass der Rechner abstürzt, wenn man versehentlich replace() mit parametern, die sich selbst enthalten aufruft {replace(line,"old","ye olde")} ersetzt sie das gleicher Wort maximal 20 mal. Trotzdem sollten sich selbst enthaltende Ersatzwörter nicht verwendet werden, da man dann etwas wie "ye ye ye ... oldeeeeee" erhalten würde. Das tritt bei den jetzigen Beispielen aber sowieso nicht auf.

In folgenden Fällen wird das Wort nicht ersetzt :

  • Der string beginnt mit '"' - Das wäre nämlich eine wörtliche Rede von einem nich-Piraten. (und Questmonster haben sowieso individuelle Texte)
  • Vor dem gefundenen Wort kommt '"' vor. - Ebenfalls wörtliche Rede
  • Vor dem gefundenen Wort kommt "read","called" oder "named" vor - das wäre eine Eingabe des Spielers, die nicht verändert werden sollte (Problem : Fruit kann nicht erkannt werden). Wörter davor werden aber nicht beeinflusst (You read wird trotzdem zu Ye read, aber der gelesene Text bleibt unverändert)
  • Es kommt "tiger" im String vor, da "tiger eye ring" im Inventar-Menü sowieso unverändert ist, sollte es auch in der oberen Zeile sein.
  • Das Wort ist "Eye" und es kommt nach dem Wort "Aethiopica" oder "Overworld" vor, um Eye of the Aethiopica und Eyes of the Overworld nicht zu verändern.
  • Der String wäre länger als der Puffer, und würde zu panic() führen.

Bei pline habe ich folgendes verändert :

  • Wenn der String zu lang oder zu kurz (<9 z.B. "It hits.") ist, mit '"' anfängt oder wir in impossible() sind tritt sie gar nicht erst in Role_if(PM_PIRATE) ein.
  • Die vielen Abfragen, ob zorkmid in verschiedenen Schreibweisen durch doublon ersetzt werden soll, sind in einem if-block, so dass sie nur gemacht werden, wenn "orkmid" im String enthalten ist.
  • Gleiches gilt auch für "old coin" und "old piece"

Ich schicke es dann mal per E-mail. -- CK 79.225.101.242 20:45, 13 June 2014 (UTC)