From: Jason S. Ninneman Date: Mon, 29 May 2017 21:22:52 +0000 (-0700) Subject: Fix a bug in RNDVOC() that prevented the reservoir magic word for working. X-Git-Tag: seed~9 X-Git-Url: https://jxself.org/git/?p=open-adventure.git;a=commitdiff_plain;h=650575394f17f561db2919005fffc28c0fa1f94e Fix a bug in RNDVOC() that prevented the reservoir magic word for working. To do this, I first had to refactor the code into proper C, just so I could understand it. Then I found another layer of encryption around the value itself. Finally, I discovered that the line to actually set the new magic word was placed such that it was using a global index instead of the local one. --- diff --git a/misc.c b/misc.c index e95439c..93dce3b 100644 --- a/misc.c +++ b/misc.c @@ -778,35 +778,33 @@ long randrange(long range) #undef RNDVOC long fRNDVOC(long CHAR, long FORCE) { -long DIV, J, RNDVOC; - /* Searches the vocabulary for a word whose second character is char, and * changes that word such that each of the other four characters is a * random letter. If force is non-zero, it is used as the new word. * Returns the new word. */ + long RNDVOC; RNDVOC=FORCE; if (RNDVOC == 0) { for (int I = 1; I <= 5; I++) { - J = 11 + randrange(26); + long J = 11 + randrange(26); if (I == 2) J = CHAR; RNDVOC = RNDVOC * 64 + J; } } - J = 10000; - DIV = 64L * 64L * 64L; - + long DIV = 64L * 64L * 64L; for (int I = 1; I <= TABSIZ; I++) { - J = J + 7; - if (MOD((ATAB[I]-J*J)/DIV, 64L) == CHAR) - break; + if (MOD(ATAB[I]/DIV, 64L) == CHAR) + { + ATAB[I] = RNDVOC; + break; + } } - ATAB[I] = RNDVOC + J * J; return(RNDVOC); }