Jettison MAKEWD(), GETTXT(), vocab(), GETIN(), and the old db compiler.
This commit is contained in:
parent
c4ceca3db9
commit
83fb64b5a8
8 changed files with 9 additions and 189 deletions
26
Makefile
26
Makefile
|
@ -38,7 +38,7 @@ endif
|
||||||
|
|
||||||
OBJS=main.o init.o actions.o score.o misc.o saveresume.o common.o
|
OBJS=main.o init.o actions.o score.o misc.o saveresume.o common.o
|
||||||
CHEAT_OBJS=cheat.o init.o actions.o score.o misc.o saveresume.o common.o
|
CHEAT_OBJS=cheat.o init.o actions.o score.o misc.o saveresume.o common.o
|
||||||
SOURCES=$(OBJS:.o=.c) dungeon.c advent.h common.h adventure.text adventure.yaml Makefile control linenoise/linenoise.[ch] newdungeon.py
|
SOURCES=$(OBJS:.o=.c) advent.h common.h adventure.text adventure.yaml Makefile control linenoise/linenoise.[ch] newdungeon.py
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(CC) $(CCFLAGS) $(DBX) -c $<
|
$(CC) $(CCFLAGS) $(DBX) -c $<
|
||||||
|
@ -46,41 +46,33 @@ SOURCES=$(OBJS:.o=.c) dungeon.c advent.h common.h adventure.text adventure.yaml
|
||||||
advent: $(OBJS) linenoise.o newdb.o
|
advent: $(OBJS) linenoise.o newdb.o
|
||||||
$(CC) $(CCFLAGS) $(DBX) -o advent $(OBJS) newdb.o linenoise.o $(LDFLAGS) $(LIBS)
|
$(CC) $(CCFLAGS) $(DBX) -o advent $(OBJS) newdb.o linenoise.o $(LDFLAGS) $(LIBS)
|
||||||
|
|
||||||
main.o: advent.h database.h common.h newdb.h
|
main.o: advent.h common.h newdb.h
|
||||||
|
|
||||||
init.o: advent.h database.h common.h newdb.h
|
init.o: advent.h common.h newdb.h
|
||||||
|
|
||||||
actions.o: advent.h database.h common.h newdb.h
|
actions.o: advent.h common.h newdb.h
|
||||||
|
|
||||||
score.o: advent.h database.h common.h newdb.h
|
score.o: advent.h common.h newdb.h
|
||||||
|
|
||||||
misc.o: advent.h database.h common.h newdb.h
|
misc.o: advent.h common.h newdb.h
|
||||||
|
|
||||||
cheat.o: advent.h database.h common.h newdb.h
|
cheat.o: advent.h common.h newdb.h
|
||||||
|
|
||||||
saveresume.o: advent.h database.h common.h newdb.h
|
saveresume.o: advent.h common.h newdb.h
|
||||||
|
|
||||||
common.o: common.h
|
common.o: common.h
|
||||||
|
|
||||||
dungeon.o: common.h newdb.h
|
|
||||||
|
|
||||||
newdb.o: newdb.c newdb.h
|
newdb.o: newdb.c newdb.h
|
||||||
$(CC) $(CCFLAGS) $(DBX) -c newdb.c
|
$(CC) $(CCFLAGS) $(DBX) -c newdb.c
|
||||||
|
|
||||||
database.h: dungeon
|
|
||||||
./dungeon
|
|
||||||
|
|
||||||
newdb.c newdb.h: newdungeon.py adventure.yaml
|
newdb.c newdb.h: newdungeon.py adventure.yaml
|
||||||
python3 newdungeon.py
|
python3 newdungeon.py
|
||||||
|
|
||||||
linenoise.o: linenoise/linenoise.h
|
linenoise.o: linenoise/linenoise.h
|
||||||
$(CC) $(CCFLAGS) -c linenoise/linenoise.c
|
$(CC) $(CCFLAGS) -c linenoise/linenoise.c
|
||||||
|
|
||||||
dungeon: dungeon.o common.o
|
|
||||||
$(CC) $(CCFLAGS) -o $@ dungeon.o common.o
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o advent cheat *.html database.h dungeon *.gcno *.gcda
|
rm -f *.o advent cheat *.html *.gcno *.gcda
|
||||||
rm -f newdb.c newdb.h
|
rm -f newdb.c newdb.h
|
||||||
rm -f README advent.6 MANIFEST *.tar.gz
|
rm -f README advent.6 MANIFEST *.tar.gz
|
||||||
rm -f *~
|
rm -f *~
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "advent.h"
|
#include "advent.h"
|
||||||
#include "database.h"
|
|
||||||
#include "newdb.h"
|
#include "newdb.h"
|
||||||
|
|
||||||
static int fill(token_t, token_t);
|
static int fill(token_t, token_t);
|
||||||
|
|
1
cheat.c
1
cheat.c
|
@ -5,7 +5,6 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "advent.h"
|
#include "advent.h"
|
||||||
#include "database.h"
|
|
||||||
#include "linenoise/linenoise.h"
|
#include "linenoise/linenoise.h"
|
||||||
#include "newdb.h"
|
#include "newdb.h"
|
||||||
|
|
||||||
|
|
1
init.c
1
init.c
|
@ -4,7 +4,6 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "advent.h"
|
#include "advent.h"
|
||||||
#include "database.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialisation
|
* Initialisation
|
||||||
|
|
1
main.c
1
main.c
|
@ -22,7 +22,6 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "advent.h"
|
#include "advent.h"
|
||||||
#include "database.h"
|
|
||||||
#include "linenoise/linenoise.h"
|
#include "linenoise/linenoise.h"
|
||||||
#include "newdb.h"
|
#include "newdb.h"
|
||||||
|
|
||||||
|
|
166
misc.c
166
misc.c
|
@ -7,7 +7,6 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
#include "advent.h"
|
#include "advent.h"
|
||||||
#include "database.h"
|
|
||||||
#include "linenoise/linenoise.h"
|
#include "linenoise/linenoise.h"
|
||||||
#include "newdb.h"
|
#include "newdb.h"
|
||||||
|
|
||||||
|
@ -251,42 +250,6 @@ void rspeak(vocab_t i, ...)
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GETIN(FILE *input,
|
|
||||||
long *pword1, long *pword1x,
|
|
||||||
long *pword2, long *pword2x)
|
|
||||||
/* Get a command from the adventurer. Snarf out the first word, pad it with
|
|
||||||
* blanks, and return it in WORD1. Chars 6 thru 10 are returned in WORD1X, in
|
|
||||||
* case we need to print out the whole word in an error message. Any number of
|
|
||||||
* blanks may follow the word. If a second word appears, it is returned in
|
|
||||||
* WORD2 (chars 6 thru 10 in WORD2X), else WORD2 is -1. */
|
|
||||||
{
|
|
||||||
long junk;
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
if (game.blklin)
|
|
||||||
fputc('\n', stdout);;
|
|
||||||
if (!MAPLIN(input))
|
|
||||||
return false;
|
|
||||||
*pword1 = GETTXT(true, true, true);
|
|
||||||
if (game.blklin && *pword1 < 0)
|
|
||||||
continue;
|
|
||||||
*pword1x = GETTXT(false, true, true);
|
|
||||||
do {
|
|
||||||
junk = GETTXT(false, true, true);
|
|
||||||
} while
|
|
||||||
(junk > 0);
|
|
||||||
*pword2 = GETTXT(true, true, true);
|
|
||||||
*pword2x = GETTXT(false, true, true);
|
|
||||||
do {
|
|
||||||
junk = GETTXT(false, true, true);
|
|
||||||
} while
|
|
||||||
(junk > 0);
|
|
||||||
if (GETTXT(true, true, true) <= 0)
|
|
||||||
return true;
|
|
||||||
rspeak(TWO_WORDS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void echo_input(FILE* destination, char* input_prompt, char* input)
|
void echo_input(FILE* destination, char* input_prompt, char* input)
|
||||||
{
|
{
|
||||||
size_t len = strlen(input_prompt) + strlen(input) + 1;
|
size_t len = strlen(input_prompt) + strlen(input) + 1;
|
||||||
|
@ -453,109 +416,8 @@ bool yes(const char* question, const char* yes_response, const char* no_response
|
||||||
return (outcome);
|
return (outcome);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Line-parsing routines (GETTXT, MAKEWD, PUTTXT, SHFTXT) */
|
|
||||||
|
|
||||||
long GETTXT(bool skip, bool onewrd, bool upper)
|
|
||||||
/* Take characters from an input line and pack them into 30-bit words.
|
|
||||||
* Skip says to skip leading blanks. ONEWRD says stop if we come to a
|
|
||||||
* blank. UPPER says to map all letters to uppercase. If we reach the
|
|
||||||
* end of the line, the word is filled up with blanks (which encode as 0's).
|
|
||||||
* If we're already at end of line when TEXT is called, we return -1. */
|
|
||||||
{
|
|
||||||
long text;
|
|
||||||
static long splitting = -1;
|
|
||||||
|
|
||||||
if (LNPOSN != splitting)
|
|
||||||
splitting = -1;
|
|
||||||
text = -1;
|
|
||||||
while (true) {
|
|
||||||
if (LNPOSN > LNLENG)
|
|
||||||
return (text);
|
|
||||||
if ((!skip) || INLINE[LNPOSN] != 0)
|
|
||||||
break;
|
|
||||||
++LNPOSN;
|
|
||||||
}
|
|
||||||
|
|
||||||
text = 0;
|
|
||||||
for (int I = 1; I <= TOKLEN; I++) {
|
|
||||||
text = text * 64;
|
|
||||||
if (LNPOSN > LNLENG || (onewrd && INLINE[LNPOSN] == 0))
|
|
||||||
continue;
|
|
||||||
char current = INLINE[LNPOSN];
|
|
||||||
if (current < ascii_to_advent['%']) {
|
|
||||||
splitting = -1;
|
|
||||||
if (upper && current >= ascii_to_advent['a'])
|
|
||||||
current = current - 26;
|
|
||||||
text = text + current;
|
|
||||||
++LNPOSN;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (splitting != LNPOSN) {
|
|
||||||
text = text + ascii_to_advent['%'];
|
|
||||||
splitting = LNPOSN;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
text = text + current - ascii_to_advent['%'];
|
|
||||||
splitting = -1;
|
|
||||||
++LNPOSN;
|
|
||||||
}
|
|
||||||
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
token_t MAKEWD(long letters)
|
|
||||||
/* Combine TOKLEN (currently 5) uppercase letters (represented by
|
|
||||||
* pairs of decimal digits in lettrs) to form a 30-bit value matching
|
|
||||||
* the one that GETTXT would return given those characters plus
|
|
||||||
* trailing blanks. Caution: lettrs will overflow 31 bits if
|
|
||||||
* 5-letter word starts with V-Z. As a kludgey workaround, you can
|
|
||||||
* increment a letter by 5 by adding 50 to the next pair of
|
|
||||||
* digits. */
|
|
||||||
{
|
|
||||||
long i = 1, word = 0;
|
|
||||||
|
|
||||||
for (long k = letters; k != 0; k = k / 100) {
|
|
||||||
word = word + i * (MOD(k, 50) + 10);
|
|
||||||
i = i * 64;
|
|
||||||
if (MOD(k, 100) > 50)word = word + i * 5;
|
|
||||||
}
|
|
||||||
i = 64L * 64L * 64L * 64L * 64L / i;
|
|
||||||
word = word * i;
|
|
||||||
return word;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Data structure routines */
|
/* Data structure routines */
|
||||||
|
|
||||||
long vocab(long id, long init)
|
|
||||||
/* Look up ID in the vocabulary (ATAB) and return its "definition" (KTAB), or
|
|
||||||
* -1 if not found. If INIT is positive, this is an initialisation call setting
|
|
||||||
* up a keyword variable, and not finding it constitutes a bug. It also means
|
|
||||||
* that only KTAB values which taken over 1000 equal INIT may be considered.
|
|
||||||
* (Thus "STEPS", which is a motion verb as well as an object, may be located
|
|
||||||
* as an object.) And it also means the KTAB value is taken modulo 1000. */
|
|
||||||
{
|
|
||||||
long lexeme;
|
|
||||||
|
|
||||||
for (long i = 1; i <= TABSIZ; i++) {
|
|
||||||
if (KTAB[i] == -1) {
|
|
||||||
lexeme = -1;
|
|
||||||
if (init < 0)
|
|
||||||
return (lexeme);
|
|
||||||
BUG(REQUIRED_VOCABULARY_WORD_NOT_FOUND); // LCOV_EXCL_LINE
|
|
||||||
}
|
|
||||||
if (init >= 0 && KTAB[i] / 1000 != init)
|
|
||||||
continue;
|
|
||||||
if (ATAB[i] == id) {
|
|
||||||
lexeme = KTAB[i];
|
|
||||||
if (init >= 0)
|
|
||||||
lexeme = MOD(lexeme, 1000);
|
|
||||||
return (lexeme);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
BUG(RAN_OFF_END_OF_VOCABULARY_TABLE); // LCOV_EXCL_LINE
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_motion_vocab_id(const char* word)
|
int get_motion_vocab_id(const char* word)
|
||||||
// Return the first motion number that has 'word' as one of its words.
|
// Return the first motion number that has 'word' as one of its words.
|
||||||
{
|
{
|
||||||
|
@ -777,34 +639,6 @@ long randrange(long range)
|
||||||
return range * get_next_lcg_value() / game.lcg_m;
|
return range * get_next_lcg_value() / game.lcg_m;
|
||||||
}
|
}
|
||||||
|
|
||||||
long rndvoc(long second, long force)
|
|
||||||
/* Searches the vocabulary ATAB 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 rnd = force;
|
|
||||||
|
|
||||||
if (rnd == 0) {
|
|
||||||
for (int i = 1; i <= 5; i++) {
|
|
||||||
long j = 11 + randrange(26);
|
|
||||||
if (i == 2)
|
|
||||||
j = second;
|
|
||||||
rnd = rnd * 64 + j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
long div = 64L * 64L * 64L;
|
|
||||||
for (int i = 1; i <= TABSIZ; i++) {
|
|
||||||
if (MOD(ATAB[i] / div, 64L) == second) {
|
|
||||||
ATAB[i] = rnd;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rnd;
|
|
||||||
}
|
|
||||||
|
|
||||||
void make_zzword(char zzword[6])
|
void make_zzword(char zzword[6])
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 5; ++i)
|
for (int i = 0; i < 5; ++i)
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "advent.h"
|
#include "advent.h"
|
||||||
#include "database.h"
|
|
||||||
#include "newdb.h"
|
#include "newdb.h"
|
||||||
#include "linenoise/linenoise.h"
|
#include "linenoise/linenoise.h"
|
||||||
|
|
||||||
|
|
1
score.c
1
score.c
|
@ -1,6 +1,5 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "advent.h"
|
#include "advent.h"
|
||||||
#include "database.h"
|
|
||||||
#include "newdb.h"
|
#include "newdb.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue