projects
/
open-adventure.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Resume from file on startup
[open-adventure.git]
/
main.c
diff --git
a/main.c
b/main.c
index 1c1b299017a91b740e9b8def7cef69d04eb1ac09..a6fea59070fffdc6d5e3cc6ec759862f3b61ae46 100644
(file)
--- a/
main.c
+++ b/
main.c
@@
-43,20
+43,20
@@
long AMBER, AXE, BACK, BATTER, BEAR, BIRD, BLOOD,
URN, VASE, VEND, VOLCAN, WATER;
long WD1, WD1X, WD2, WD2X;
URN, VASE, VEND, VOLCAN, WATER;
long WD1, WD1X, WD2, WD2X;
-FILE *logfp;
+FILE *logfp
= NULL, *rfp = NULL
;
bool oldstyle = false;
bool editline = true;
bool prompt = true;
extern void initialise();
bool oldstyle = false;
bool editline = true;
bool prompt = true;
extern void initialise();
-extern void score(long);
extern int action(FILE *, long, long, long);
void sig_handler(int signo)
{
extern int action(FILE *, long, long, long);
void sig_handler(int signo)
{
- if (signo == SIGINT)
+ if (signo == SIGINT)
{
if (logfp != NULL)
fflush(logfp);
if (logfp != NULL)
fflush(logfp);
+ }
exit(0);
}
exit(0);
}
@@
-80,7
+80,7
@@
int main(int argc, char *argv[])
/* Options. */
/* Options. */
- while ((ch = getopt(argc, argv, "l:os")) != EOF) {
+ while ((ch = getopt(argc, argv, "l:o
r:
s")) != EOF) {
switch (ch) {
case 'l':
logfp = fopen(optarg, "w");
switch (ch) {
case 'l':
logfp = fopen(optarg, "w");
@@
-94,6
+94,14
@@
int main(int argc, char *argv[])
oldstyle = true;
editline = prompt = false;
break;
oldstyle = true;
editline = prompt = false;
break;
+ case 'r':
+ rfp = fopen(optarg, "r");
+ if (rfp == NULL)
+ fprintf(stderr,
+ "advent: can't open save file %s for read\n",
+ optarg);
+ signal(SIGINT, sig_handler);
+ break;
case 's':
editline = false;
break;
case 's':
editline = false;
break;
@@
-126,11
+134,15
@@
int main(int argc, char *argv[])
/* Start-up, dwarf stuff */
game.zzword=RNDVOC(3,0);
/* Start-up, dwarf stuff */
game.zzword=RNDVOC(3,0);
- game.novice=YES(stdin, WELCOME_YOU,CAVE_NEARBY,ARB_0);
game.newloc = LOC_START;
game.loc = LOC_START;
game.limit=330;
game.newloc = LOC_START;
game.loc = LOC_START;
game.limit=330;
- if (game.novice)game.limit=1000;
+ if (!rfp){
+ game.novice=YES(stdin, WELCOME_YOU,CAVE_NEARBY,NO_MESSAGE);
+ if (game.novice)game.limit=1000;
+ } else {
+ restore(rfp);
+ }
if (logfp)
fprintf(logfp, "seed %ld\n", seedval);
if (logfp)
fprintf(logfp, "seed %ld\n", seedval);
@@
-141,7
+153,7
@@
int main(int argc, char *argv[])
break;
}
/* show score and exit */
break;
}
/* show score and exit */
- score(
1
);
+ score(
quitgame
);
}
static bool fallback_handler(char *buf)
}
static bool fallback_handler(char *buf)
@@
-244,13
+256,13
@@
static void checkhints(FILE *cmdin)
/* Fall through to hint display */
game.hintlc[hint]=0;
/* Fall through to hint display */
game.hintlc[hint]=0;
- if (!YES(cmdin,HINTS[hint][3],
ARB_0
,OK_MAN))
+ if (!YES(cmdin,HINTS[hint][3],
NO_MESSAGE
,OK_MAN))
return;
SETPRM(1,HINTS[hint][2],HINTS[hint][2]);
RSPEAK(HINT_COST);
game.hinted[hint]=YES(cmdin,WANT_HINT,HINTS[hint][4],OK_MAN);
return;
SETPRM(1,HINTS[hint][2],HINTS[hint][2]);
RSPEAK(HINT_COST);
game.hinted[hint]=YES(cmdin,WANT_HINT,HINTS[hint][4],OK_MAN);
- if (game.hinted[hint] && game.limit >
30
)
- game.limit
=game.limit+30
*HINTS[hint][2];
+ if (game.hinted[hint] && game.limit >
WARNTIME
)
+ game.limit
+= WARNTIME
*HINTS[hint][2];
}
}
}
}
}
}
@@
-263,8
+275,8
@@
bool spotted_by_pirate(int i)
/* The pirate's spotted him. He leaves him alone once we've
* found chest. K counts if a treasure is here. If not, and
/* The pirate's spotted him. He leaves him alone once we've
* found chest. K counts if a treasure is here. If not, and
- * tally=1 for an unseen chest, let the pirate be spotted.
- *
Note that game.place[CHEST]=0
might mean that he's thrown
+ * tally=1 for an unseen chest, let the pirate be spotted.
Note
+ *
that game.place[CHEST] = NOWHERE
might mean that he's thrown
* it to the troll, but in that case he's seen the chest
* (game.prop=0). */
if (game.loc == game.chloc || game.prop[CHEST] >= 0)
* it to the troll, but in that case he's seen the chest
* (game.prop=0). */
if (game.loc == game.chloc || game.prop[CHEST] >= 0)
@@
-285,7
+297,7
@@
bool spotted_by_pirate(int i)
}
}
/* Force chest placement before player finds last treasure */
}
}
/* Force chest placement before player finds last treasure */
- if (game.tally == 1 && snarfed == 0 && game.place[CHEST] ==
0
&& HERE(LAMP) && game.prop[LAMP] == 1) {
+ if (game.tally == 1 && snarfed == 0 && game.place[CHEST] ==
NOWHERE
&& HERE(LAMP) && game.prop[LAMP] == 1) {
RSPEAK(PIRATE_SPOTTED);
movechest = true;
}
RSPEAK(PIRATE_SPOTTED);
movechest = true;
}
@@
-475,15
+487,14
@@
static void croak(FILE *cmdin)
/* He died during closing time. No resurrection. Tally up a
* death and exit. */
RSPEAK(DEATH_CLOSING);
/* He died during closing time. No resurrection. Tally up a
* death and exit. */
RSPEAK(DEATH_CLOSING);
- score(0);
- } else {
- /* FIXME: Arithmetic on message numbers */
- if (!YES(cmdin,WATCH_IT+game.numdie*2,WHICH_WAY+game.numdie*2,OK_MAN))
- score(0);
- if (game.numdie == MAXDIE)
- score(0);
- game.place[WATER]=0;
- game.place[OIL]=0;
+ score(endgame);
+
+ }
+ /* FIXME: Arithmetic on message numbers */
+ else if (game.numdie == MAXDIE || !YES(cmdin,WATCH_IT+game.numdie*2,WHICH_WAY+game.numdie*2,OK_MAN))
+ score(endgame);
+ else {
+ game.place[WATER] = game.place[OIL] = NOWHERE;
if (TOTING(LAMP))
game.prop[LAMP]=0;
for (int j=1; j<=NOBJECTS; j++) {
if (TOTING(LAMP))
game.prop[LAMP]=0;
for (int j=1; j<=NOBJECTS; j++) {
@@
-755,7
+766,7
@@
static bool closecheck(void)
MOVE(TROLL2,PLAC[TROLL]);
MOVE(TROLL2+NOBJECTS,FIXD[TROLL]);
JUGGLE(CHASM);
MOVE(TROLL2,PLAC[TROLL]);
MOVE(TROLL2+NOBJECTS,FIXD[TROLL]);
JUGGLE(CHASM);
- if (game.prop[BEAR] != 3)DSTROY(BEAR);
+ if (game.prop[BEAR] != 3)D
E
STROY(BEAR);
game.prop[CHAIN]=0;
game.fixed[CHAIN]=0;
game.prop[AXE]=0;
game.prop[CHAIN]=0;
game.fixed[CHAIN]=0;
game.prop[AXE]=0;
@@
-808,7
+819,7
@@
static bool closecheck(void)
for (int i=1; i<=NOBJECTS; i++) {
if (TOTING(i))
for (int i=1; i<=NOBJECTS; i++) {
if (TOTING(i))
- DSTROY(i);
+ D
E
STROY(i);
}
RSPEAK(CAVE_CLOSED);
}
RSPEAK(CAVE_CLOSED);
@@
-832,7
+843,7
@@
static void lampcheck(void)
* Second is for other cases of lamp dying. 12400 is when it
* goes out. Even then, he can explore outside for a while
* if desired. */
* Second is for other cases of lamp dying. 12400 is when it
* goes out. Even then, he can explore outside for a while
* if desired. */
- if (game.limit
<=30
&& HERE(BATTER) && game.prop[BATTER]==0 && HERE(LAMP))
+ if (game.limit
<= WARNTIME
&& HERE(BATTER) && game.prop[BATTER]==0 && HERE(LAMP))
{
RSPEAK(REPLACE_BATTERIES);
game.prop[BATTER]=1;
{
RSPEAK(REPLACE_BATTERIES);
game.prop[BATTER]=1;
@@
-845,11
+856,11
@@
static void lampcheck(void)
game.prop[LAMP]=0;
if (HERE(LAMP))
RSPEAK(LAMP_OUT);
game.prop[LAMP]=0;
if (HERE(LAMP))
RSPEAK(LAMP_OUT);
- } else if (game.limit <=
30
) {
+ } else if (game.limit <=
WARNTIME
) {
if (!game.lmwarn && HERE(LAMP)) {
game.lmwarn=true;
int spk=GET_BATTERIES;
if (!game.lmwarn && HERE(LAMP)) {
game.lmwarn=true;
int spk=GET_BATTERIES;
- if (game.place[BATTER] ==
0
)spk=LAMP_DIM;
+ if (game.place[BATTER] ==
NOWHERE
)spk=LAMP_DIM;
if (game.prop[BATTER] == 1)spk=MISSING_BATTERIES;
RSPEAK(spk);
}
if (game.prop[BATTER] == 1)spk=MISSING_BATTERIES;
RSPEAK(spk);
}
@@
-1059,7
+1070,7
@@
static bool do_command(FILE *cmdin)
if (i == -1) {
/* Gee, I don't understand. */
if (fallback_handler(rawbuf))
if (i == -1) {
/* Gee, I don't understand. */
if (fallback_handler(rawbuf))
-
return tr
ue;
+
contin
ue;
SETPRM(1,WD1,WD1X);
RSPEAK(DONT_KNOW);
goto L2600;
SETPRM(1,WD1,WD1X);
RSPEAK(DONT_KNOW);
goto L2600;
@@
-1107,7
+1118,7
@@
static bool do_command(FILE *cmdin)
case GO_DWARFWAKE:
/* Oh dear, he's disturbed the dwarves. */
RSPEAK(DWARVES_AWAKEN);
case GO_DWARFWAKE:
/* Oh dear, he's disturbed the dwarves. */
RSPEAK(DWARVES_AWAKEN);
- score(
0
);
+ score(
endgame
);
return true;
default:
BUG(99);
return true;
default:
BUG(99);