From 894b3de9493d26d7dec33aac7b820783c108803b Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Tue, 27 Jun 2017 16:11:13 -0400 Subject: [PATCH] Travel tables are all done from YAML now. Leaves only Section 4 from asventure.text still relevant. --- dungeon.c | 63 ++----------------------------------------------------- init.c | 6 +++--- linenoise | 2 +- main.c | 36 +++++++++++++++---------------- 4 files changed, 24 insertions(+), 83 deletions(-) diff --git a/dungeon.c b/dungeon.c index a553147..725152d 100644 --- a/dungeon.c +++ b/dungeon.c @@ -5,7 +5,6 @@ /* Current limits: * 12600 words of message text (LINES, LINSIZ). - * 885 travel options (TRAVEL, TRVSIZ). * 330 vocabulary words (KTAB, ATAB, TABSIZ). * There are also limits which cannot be exceeded due to the structure of * the database. (E.G., The vocabulary uses n/1000 to determine word type, @@ -21,37 +20,6 @@ * The data file contains several sections. Each begins with a line containing * a number identifying the section, and ends with a line containing "-1". * - * Section 3: Travel table. Each line contains a location number (X), a second - * location number (Y), and a list of motion numbers (see section 4). - * each motion represents a verb which will go to Y if currently at X. - * Y, in turn, is interpreted as follows. Let M=Y/1000, N=Y mod 1000. - * If N<=300 it is the location to go to. - * If 300500 message N-500 from section 6 is printed, - * and he stays wherever he is. - * Meanwhile, M specifies the conditions on the motion. - * If M=0 it's unconditional. - * If 0 @@ -88,12 +53,8 @@ static long OLDLOC; static long LINUSE; // Storage for what comes out of the database -long TRVS; -long TRNVLS; long TABNDX; -long TKEY[NLOCATIONS + 1]; long LINES[LINSIZ + 1]; -long TRAVEL[TRVSIZ + 1]; long KTAB[TABSIZ + 1]; long ATAB[TABSIZ + 1]; @@ -244,7 +205,7 @@ static void read_messages(FILE* database) } /* The stuff for section 3 is encoded here. Each "from-location" gets a - * contiguous section of the "TRAVEL" array. Each entry in travel is + * contiguous section of the "travel" array. Each entry in travel is * newloc*1000 + KEYWORD (from section 4, motion verbs), and is negated if * this is the last entry for this location. KEY(N) is the index in travel * of the first option at location N. */ @@ -252,20 +213,7 @@ static void read_section3_stuff(FILE* database) { long loc; while ((loc = GETNUM(database)) != -1) { - long newloc = GETNUM(NULL); - long L; - if (TKEY[loc] == 0) { - TKEY[loc] = TRVS; - } else { - TRAVEL[TRVS - 1] = -TRAVEL[TRVS - 1]; - } - while ((L = GETNUM(NULL)) != 0) { - TRAVEL[TRVS] = newloc * 1000 + L; - TRVS = TRVS + 1; - if (TRVS == TRVSIZ) - BUG(TOO_MANY_TRAVEL_OPTIONS); - } - TRAVEL[TRVS - 1] = -TRAVEL[TRVS - 1]; + /* Now done from YAML */ } } @@ -347,13 +295,8 @@ static int read_database(FILE* database) * pointer-words in lines. PTEXT(N) points to * message for game.prop(N)=0. Successive prop messages are * found by chasing pointers. */ - for (int I = 1; I <= NLOCATIONS; I++) { - TKEY[I] = 0; - } LINUSE = 1; - TRVS = 1; - TRNVLS = 0; /* Start new data section. Sect is the section number. */ @@ -457,8 +400,6 @@ static void write_file(FILE* header_file) fprintf(header_file, "\n"); // content variables - write_1d(header_file, TKEY, NLOCATIONS + 1, "TKEY"); - write_1d(header_file, TRAVEL, TRVSIZ + 1, "TRAVEL"); write_1d(header_file, KTAB, TABSIZ + 1, "KTAB"); write_1d(header_file, ATAB, TABSIZ + 1, "ATAB"); diff --git a/init.c b/init.c index d3823db..66ef59e 100644 --- a/init.c +++ b/init.c @@ -23,9 +23,9 @@ void initialise(void) for (int i = 1; i <= NLOCATIONS; i++) { game.abbrev[i] = 0; - if (!(locations[i].description.big == 0 || TKEY[i] == 0)) { - int k = TKEY[i]; - if (MOD(labs(TRAVEL[k]), 1000) == 1) + if (!(locations[i].description.big == 0 || tkey[i] == 0)) { + int k = tkey[i]; + if (MOD(labs(travel[k]), 1000) == 1) conditions[i] |= (1 << COND_FORCED); } game.atloc[i] = 0; diff --git a/linenoise b/linenoise index 2105ce4..c894b9e 160000 --- a/linenoise +++ b/linenoise @@ -1 +1 @@ -Subproject commit 2105ce445821381cf1bca87b6d386d4ea88ee20d +Subproject commit c894b9e59f02203dbe4e2be657572cf88c4230c3 diff --git a/main.c b/main.c index f6209d4..b7219d1 100644 --- a/main.c +++ b/main.c @@ -30,7 +30,7 @@ /* Abstract out the encoding of words in the travel array. Gives us * some hope of getting to a less cryptic representation than we * inherited from FORTRAN, someday. To understand these, read the - * encoding description for TRAVEL. + * encoding description for travel. */ #define T_DESTINATION(entry) MOD(labs(entry) / 1000, 1000) #define T_NODWARVES(entry) labs(entry) / 1000000 == 100 @@ -406,10 +406,10 @@ static bool dwarfmove(void) continue; /* Fill tk array with all the places this dwarf might go. */ unsigned int j = 1; - kk = TKEY[game.dloc[i]]; + kk = tkey[game.dloc[i]]; if (kk != 0) do { - game.newloc = T_DESTINATION(TRAVEL[kk]); + game.newloc = T_DESTINATION(travel[kk]); /* Have we avoided a dwarf encounter? */ bool avoided = (SPECIAL(game.newloc) || !INDEEP(game.newloc) || @@ -419,13 +419,13 @@ static bool dwarfmove(void) game.newloc == game.dloc[i] || FORCED(game.newloc) || (i == PIRATE && CNDBIT(game.newloc, COND_NOARRR)) || - T_NODWARVES(TRAVEL[kk])); + T_NODWARVES(travel[kk])); if (!avoided) { tk[j++] = game.newloc; } ++kk; } while - (TRAVEL[kk - 1] >= 0); + (travel[kk - 1] >= 0); tk[j] = game.odloc[i]; if (j >= 2) --j; @@ -529,7 +529,7 @@ static void croak(void) static bool playermove(token_t verb, int motion) { - int scratchloc, k2, kk = TKEY[game.loc]; + int scratchloc, k2, kk = tkey[game.loc]; game.newloc = game.loc; if (kk == 0) BUG(LOCATION_HAS_NO_TRAVEL_ENTRIES); @@ -549,13 +549,13 @@ static bool playermove(token_t verb, int motion) if (CNDBIT(game.loc, COND_NOBACK))k2 = TWIST_TURN; if (k2 == 0) { for (;;) { - scratchloc = T_DESTINATION(TRAVEL[kk]); + scratchloc = T_DESTINATION(travel[kk]); if (scratchloc != motion) { if (!SPECIAL(scratchloc)) { - if (FORCED(scratchloc) && T_DESTINATION(TRAVEL[TKEY[scratchloc]]) == motion) + if (FORCED(scratchloc) && T_DESTINATION(travel[tkey[scratchloc]]) == motion) k2 = kk; } - if (TRAVEL[kk] >= 0) { + if (travel[kk] >= 0) { ++kk; /* go to next travel entry for this location */ continue; } @@ -567,8 +567,8 @@ static bool playermove(token_t verb, int motion) } } - motion = T_MOTION(TRAVEL[kk]); - kk = TKEY[game.loc]; + motion = T_MOTION(travel[kk]); + kk = tkey[game.loc]; break; /* fall through to ordinary travel */ } } else { @@ -598,9 +598,9 @@ static bool playermove(token_t verb, int motion) /* Look for a way to fulfil the motion - kk indexes the beginning * of the motion entries for here (game.loc). */ for (;;) { - if (T_TERMINATE(TRAVEL[kk]) || T_MOTION(TRAVEL[kk]) == motion) + if (T_TERMINATE(travel[kk]) || T_MOTION(travel[kk]) == motion) break; - if (TRAVEL[kk] < 0) { + if (travel[kk] < 0) { /* FIXME: Magic numbers! */ /* Couldn't find an entry matching the motion word passed * in. Various messages depending on word given. */ @@ -617,7 +617,7 @@ static bool playermove(token_t verb, int motion) } ++kk; } - scratchloc = labs(TRAVEL[kk]) / 1000; + scratchloc = labs(travel[kk]) / 1000; do { /* @@ -642,10 +642,10 @@ static bool playermove(token_t verb, int motion) } else if (game.prop[motion] != game.newloc / 100 - 3) break; do { - if (TRAVEL[kk] < 0) + if (travel[kk] < 0) BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION); ++kk; - game.newloc = labs(TRAVEL[kk]) / 1000; + game.newloc = labs(travel[kk]) / 1000; } while (game.newloc == scratchloc); scratchloc = game.newloc; @@ -676,10 +676,10 @@ static bool playermove(token_t verb, int motion) * pretend he wasn't carrying it after all. */ drop(EMERALD, game.loc); do { - if (TRAVEL[kk] < 0) + if (travel[kk] < 0) BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION); ++kk; - game.newloc = labs(TRAVEL[kk]) / 1000; + game.newloc = labs(travel[kk]) / 1000; } while (game.newloc == scratchloc); scratchloc = game.newloc; -- 2.31.1