Create a cheater to test strange save/resume cases.

Patch due to Aaron Traas, but needed modification because of code
drift since submission.
This commit is contained in:
Eric S. Raymond 2017-06-26 15:03:37 -04:00
parent 5581175840
commit d6cb6f0d8d
10 changed files with 124 additions and 10 deletions

1
.gitignore vendored
View file

@ -12,3 +12,4 @@ MANIFEST
.*~ .*~
newdb.h newdb.h
newdb.c newdb.c
cheat

View file

@ -21,6 +21,7 @@ binary:debug:
artifacts: artifacts:
paths: paths:
- advent - advent
- cheat
- "*.gcda" - "*.gcda"
- "*.gcno" - "*.gcno"
# cache outputs to reduce the build time # cache outputs to reduce the build time
@ -35,10 +36,11 @@ binary:release:
- apk add make gcc musl-dev python3 - apk add make gcc musl-dev python3
- pip3 install PyYAML - pip3 install PyYAML
script: script:
- make advent - make advent cheat
artifacts: artifacts:
paths: paths:
- advent - advent
- cheat
# cache outputs to reduce the build time # cache outputs to reduce the build time
cache: cache:
paths: paths:

View file

@ -37,6 +37,7 @@ ifeq ($(UNAME_S),Linux)
endif 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
SOURCES=$(OBJS:.o=.c) dungeon.c advent.h common.h adventure.text Makefile control linenoise/linenoise.[ch] newdungeon.py SOURCES=$(OBJS:.o=.c) dungeon.c advent.h common.h adventure.text Makefile control linenoise/linenoise.[ch] newdungeon.py
.c.o: .c.o:
@ -55,6 +56,8 @@ score.o: advent.h database.h common.h newdb.h
misc.o: advent.h database.h common.h newdb.h misc.o: advent.h database.h common.h newdb.h
cheat.o: advent.h database.h common.h newdb.h
saveresume.o: advent.h database.h common.h newdb.h saveresume.o: advent.h database.h common.h newdb.h
common.o: common.h common.o: common.h
@ -84,7 +87,11 @@ clean:
rm -f .*~ rm -f .*~
cd tests; $(MAKE) --quiet clean cd tests; $(MAKE) --quiet clean
check: advent
cheat: $(CHEAT_OBJS) linenoise.o newdb.o
$(CC) $(CCFLAGS) $(DBX) -o cheat $(CHEAT_OBJS) linenoise.o newdb.o $(LDFLAGS) $(LIBS)
check: advent cheat
cd tests; $(MAKE) --quiet cd tests; $(MAKE) --quiet
.SUFFIXES: .adoc .html .6 .SUFFIXES: .adoc .html .6
@ -144,3 +151,4 @@ linty: advent
debug: CCFLAGS += -O0 --coverage -ggdb debug: CCFLAGS += -O0 --coverage -ggdb
debug: linty debug: linty
debug: cheat

View file

@ -127,6 +127,7 @@ extern unsigned long get_next_lcg_value(void);
extern long randrange(long); extern long randrange(long);
extern long score(enum termination); extern long score(enum termination);
extern void terminate(enum termination) __attribute__((noreturn)); extern void terminate(enum termination) __attribute__((noreturn));
extern int savefile(FILE *);
extern int suspend(void); extern int suspend(void);
extern int resume(void); extern int resume(void);
extern int restore(FILE *); extern int restore(FILE *);

64
cheat.c Normal file
View file

@ -0,0 +1,64 @@
#define DEFINE_GLOBALS_FROM_INCLUDES
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <time.h>
#include "advent.h"
#include "database.h"
#include "linenoise/linenoise.h"
#include "newdb.h"
struct game_t game;
long LNLENG, LNPOSN;
char rawbuf[LINESIZE], INLINE[LINESIZE + 1];
long AMBER, AXE, BACK, BATTERY, BEAR, BIRD, BLOOD,
BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
CLAM, COINS, DOOR, DPRSSN, DRAGON, DWARF, EGGS,
EMERALD, ENTER, ENTRNC, FIND, FISSURE, FOOD,
GRATE, HINT, INVENT, JADE, KEYS,
KNIFE, LAMP, LOCK, LOOK, MAGAZINE,
MESSAG, MIRROR, NUGGET, NUL, OGRE, OIL, OYSTER,
PEARL, PILLOW, PLANT, PLANT2, PYRAMID, RESER, ROD, ROD2,
RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
STEPS, STREAM, THROW, TRIDENT, TROLL, TROLL2,
URN, VASE, VEND, VOLCANO, WATER;
FILE *logfp = NULL, *rfp = NULL;
bool oldstyle = false;
bool editline = true;
bool prompt = true;
int main(int argc, char *argv[])
{
FILE *fp = NULL;
game.lcg_a = 1093;
game.lcg_c = 221587;
game.lcg_m = 1048576;
srand(time(NULL));
long seedval = (long)rand();
set_seed(seedval);
/* Initialize game variables */
initialise();
game.zzword = rndvoc(3, 0);
game.newloc = LOC_START;
game.loc = LOC_START;
game.limit = GAMELIMIT;
game.numdie = -1000;
game.saved = 1;
fp = fopen("cheat_numdie.adv", WRITE_MODE);
if (fp == NULL)
{
printf("Can't open file. Exiting.\n");
exit(0);
}
savefile(fp);
printf("cheat: tests/cheat_numdie.adv created.\n");
return 0;
}

View file

@ -442,7 +442,7 @@ if __name__ == "__main__":
len(db["locations"])-1, len(db["locations"])-1,
len(db["objects"])-1, len(db["objects"])-1,
len(db["hints"]), len(db["hints"]),
len(db["classes"]), len(db["classes"])-1,
len(db["obituaries"]), len(db["obituaries"]),
len(db["turn_thresholds"]), len(db["turn_thresholds"]),
len(db["actspk"]), len(db["actspk"]),

View file

@ -27,6 +27,20 @@ struct save_t {
}; };
struct save_t save; struct save_t save;
int savefile(FILE *fp)
/* Save game to file. No input or output from user. */
{
long i, k;
datime(&i, &k);
k = i + 650 * k;
save.savetime = k;
save.mode = -1;
save.version = VRSION;
memcpy(&save.game, &game, sizeof(struct game_t));
IGNORE(fwrite(&save, sizeof(struct save_t), 1, fp));
return(0);
}
/* Suspend and resume */ /* Suspend and resume */
int suspend(void) int suspend(void)
{ {
@ -38,7 +52,6 @@ int suspend(void)
#ifdef ADVENT_NOSAVE #ifdef ADVENT_NOSAVE
return GO_UNKNOWN; return GO_UNKNOWN;
#endif #endif
long i, k;
FILE *fp = NULL; FILE *fp = NULL;
rspeak(SUSPEND_WARNING); rspeak(SUSPEND_WARNING);
@ -55,12 +68,7 @@ int suspend(void)
linenoiseFree(name); linenoiseFree(name);
} }
datime(&i, &k); savefile(fp);
k = i + 650 * k;
save.savetime = k;
save.mode = -1;
save.version = VRSION;
memcpy(&save.game, &game, sizeof(struct game_t));
IGNORE(fwrite(&save, sizeof(struct save_t), 1, fp)); IGNORE(fwrite(&save, sizeof(struct save_t), 1, fp));
fclose(fp); fclose(fp);
rspeak(RESUME_HELP); rspeak(RESUME_HELP);

View file

@ -37,6 +37,8 @@ buildregress:
done; \ done; \
rm -f scratch.tmp rm -f scratch.tmp
regress: regress:
$(ECHO) -n "Generate cheat file: "
../cheat
@for file in $(TESTLOADS); do \ @for file in $(TESTLOADS); do \
$(ECHO) -n " $${file} "; grep '##' $${file}.log || echo ' ## (no description)'; \ $(ECHO) -n " $${file} "; grep '##' $${file}.log || echo ' ## (no description)'; \
OPTS=`sed -n /#options:/s///p <$${file}.log`; \ OPTS=`sed -n /#options:/s///p <$${file}.log`; \

24
tests/cheatresume.chk Normal file
View file

@ -0,0 +1,24 @@
Welcome to Adventure!! Would you like instructions?
> n
You are standing at the end of a road before a small brick building.
Around you is a forest. A small stream flows out of the building and
down a gully.
> resume
You are standing at the end of a road before a small brick building.
Around you is a forest. A small stream flows out of the building and
down a gully.
Now let's see you do it without suspending in mid-Adventure.
You scored 10031 out of a possible 430, using 0 turn.
You just went off my scale!!
To achieve the next higher rating would be a neat trick!
Congratulations!!

4
tests/cheatresume.log Normal file
View file

@ -0,0 +1,4 @@
## Resume from absurd save file with numdie = -1000
n
resume
cheat_numdie.adv