#include <stdio.h>
#include <stdbool.h>
-#include "sizes.h"
+#include "common.h"
#define LINESIZE 100
#define NDWARVES 6
extern struct game_t game;
extern long LNLENG, LNPOSN, PARMS[];
-extern char rawbuf[LINESIZE], INLINE[LINESIZE+1], MAP1[], MAP2[];
+extern char rawbuf[LINESIZE], INLINE[LINESIZE+1];
+extern const char ascii_to_advent[];
+extern const char advent_to_ascii[];
extern FILE *logfp;
-extern bool oldstyle;
+extern bool oldstyle, editline, prompt;
extern lcg_state lcgstate;
/* b is not needed for POSIX but harmless */
#define READ_MODE "rb"
#define WRITE_MODE "wb"
-
-extern void SPEAK(vocab_t);
+extern void* xmalloc(size_t);
+extern char* xstrdup(const char*);
+extern void packed_to_token(long, char token[6]);
+extern void newspeak(char*);
extern void PSPEAK(vocab_t,int);
extern void RSPEAK(vocab_t);
extern void SETPRM(long,long,long);
-
-extern bool fGETIN(FILE *,token_t*,token_t*,token_t*,token_t*);
-#define GETIN(input,WORD1,WORD1X,WORD2,WORD2X) fGETIN(input,&WORD1,&WORD1X,&WORD2,&WORD2X)
-
+extern bool GETIN(FILE *,token_t*,token_t*,token_t*,token_t*);
extern long YES(FILE *,vocab_t,vocab_t,vocab_t);
extern long GETTXT(bool,bool,bool);
extern token_t MAKEWD(long);
-
-extern void fPUTTXT(token_t,long*,long);
-#define PUTTXT(WORD,STATE,CASE) fPUTTXT(WORD,&STATE,CASE)
-
-extern void SHFTXT(long,long);
extern void TYPE0(void);
-
-extern void fSAVWDS(long*,long*,long*,long*,long*,long*,long*);
-#define SAVWDS(W1,W2,W3,W4,W5,W6,W7) fSAVWDS(&W1,&W2,&W3,&W4,&W5,&W6,&W7)
-extern void fSAVARR(long*,long);
-#define SAVARR(ARR,N) fSAVARR(ARR,N)
-extern void fSAVWRD(long,long*);
-#define SAVWRD(OP,WORD) fSAVWRD(OP,&WORD)
-
extern long VOCAB(long,long);
extern void DSTROY(long);
extern void JUGGLE(long);
extern bool TSTBIT(long,int);
extern long RNDVOC(long,long);
extern void BUG(long) __attribute__((noreturn));
-extern void MAPLIN(FILE *);
+extern bool MAPLIN(FILE *);
extern void TYPE(void);
-extern void MPINIT(void);
-
-extern void fSAVEIO(long,long,long*);
-#define SAVEIO(OP,IN,ARR) fSAVEIO(OP,IN,ARR)
extern void DATIME(long*, long*);
-extern long MOD(long,long);
-
extern void set_seed(long);
extern unsigned long get_next_lcg_value(void);
extern long randrange(long);
extern void score(long);
+extern int saveresume(FILE *, bool);
-/* Statement functions
- *
+/*
+ * MOD(N,M) = Arithmetic modulus
* AT(OBJ) = true if on either side of two-placed object
* CNDBIT(L,N) = true if COND(L) has bit n set (bit 0 is units bit)
- * DARK(DUMMY) = true if location "LOC" is dark
+ * DARK(LOC) = true if location "LOC" is dark
* FORCED(LOC) = true if LOC moves without asking for input (COND=2)
- * FOREST(LOC) = true if LOC is part of the forest
- * GSTONE(OBJ) = true if OBJ is a gemstone
+ * FOREST(LOC) = true if LOC is part of the forest
+ * GSTONE(OBJ) = true if OBJ is a gemstone
* HERE(OBJ) = true if the OBJ is at "LOC" (or is being carried)
- * LIQ(DUMMY) = object number of liquid in bottle
+ * LIQUID() = object number of liquid in bottle
* LIQLOC(LOC) = object number of liquid (if any) at LOC
- * PCT(N) = true N% of the time (N integer from 0 to 100)
+ * PCT(N) = true N% of the time (N integer from 0 to 100)
* TOTING(OBJ) = true if the OBJ is being carried */
+#define MOD(N,M) ((N) % (M))
#define TOTING(OBJ) (game.place[OBJ] == -1)
#define AT(OBJ) (game.place[OBJ] == game.loc || game.fixed[OBJ] == game.loc)
#define HERE(OBJ) (AT(OBJ) || TOTING(OBJ))
#define LIQ2(PBOTL) ((1-(PBOTL))*WATER+((PBOTL)/2)*(WATER+OIL))
-#define LIQ(DUMMY) (LIQ2(game.prop[BOTTLE]<0 ? -1-game.prop[BOTTLE] : game.prop[BOTTLE]))
+#define LIQUID() (LIQ2(game.prop[BOTTLE]<0 ? -1-game.prop[BOTTLE] : game.prop[BOTTLE]))
#define LIQLOC(LOC) (LIQ2((MOD(COND[LOC]/2*2,8)-5)*MOD(COND[LOC]/4,2)+1))
#define CNDBIT(L,N) (TSTBIT(COND[L],N))
#define FORCED(LOC) (COND[LOC] == 2)
RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
STEPS, STICK, STREAM, THROW, TRIDNT, TROLL, TROLL2,
URN, VASE, VEND, VOLCAN, WATER;
-/* everything else */
-extern long I, K, SPK, WD1, WD1X, WD2, WD2X;
+
+enum speechpart {unknown, intransitive, transitive};
+
+/* Phase codes for action returns.
+ * These were at one time FORTRAN line numbers.
+ * The values don't matter, but perturb their order at your peril.
+ */
+#define GO_TERMINATE 2
+#define GO_MOVE 8
+#define GO_TOP 2000
+#define GO_CLEAROBJ 2012
+#define GO_CHECKHINT 2600
+#define GO_CHECKFOO 2607
+#define GO_CLOSEJUMP 2610
+#define GO_DIRECTION 2620
+#define GO_LOOKUP 2630
+#define GO_WORD2 2800
+#define GO_SPECIALS 1900
+#define GO_UNKNOWN 8000
+#define GO_ACTION 40000
+#define GO_DWARFWAKE 19000
+
+/* hack to ignore GCC Unused Result */
+#define IGNORE(r) do{if (r){}}while(0)
+
+/* end */