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:
parent
5581175840
commit
d6cb6f0d8d
10 changed files with 124 additions and 10 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -12,3 +12,4 @@ MANIFEST
|
||||||
.*~
|
.*~
|
||||||
newdb.h
|
newdb.h
|
||||||
newdb.c
|
newdb.c
|
||||||
|
cheat
|
|
@ -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:
|
||||||
|
|
10
Makefile
10
Makefile
|
@ -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
|
||||||
|
|
1
advent.h
1
advent.h
|
@ -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
64
cheat.c
Normal 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;
|
||||||
|
}
|
|
@ -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"]),
|
||||||
|
|
22
saveresume.c
22
saveresume.c
|
@ -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);
|
||||||
|
|
|
@ -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
24
tests/cheatresume.chk
Normal 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
4
tests/cheatresume.log
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
## Resume from absurd save file with numdie = -1000
|
||||||
|
n
|
||||||
|
resume
|
||||||
|
cheat_numdie.adv
|
Loading…
Add table
Add a link
Reference in a new issue