-#include "funcs.h"
-#include "database.h"
-
-/* hack to ignore GCC Unused Result */
-#define IGNORE(r) do{if(r){}}while(0)
-
-/* I/O routines (SPEAK, PSPEAK, RSPEAK, SETPRM, GETIN, YES) */
-
-void SPEAK(vocab_t N) {
-long BLANK, CASE, I, K, L, NEG, NPARMS, PARM, PRMTYP, STATE;
-
-/* Print the message which starts at LINES(N). Precede it with a blank line
- * unless game.blklin is false. */
-
- if(N == 0)return;
- BLANK=game.blklin;
- K=N;
- NPARMS=1;
-L10: L=labs(LINES[K])-1;
- K=K+1;
- LNLENG=0;
- LNPOSN=1;
- STATE=0;
- for (I=K; I<=L; I++) {
- PUTTXT(LINES[I],STATE,2);
- } /* end loop */
- LNPOSN=0;
-L30: LNPOSN=LNPOSN+1;
-L32: if(LNPOSN > LNLENG) goto L40;
- if(INLINE[LNPOSN] != 63) goto L30;
- {long x = LNPOSN+1; PRMTYP=INLINE[x];}
-/* 63 is a "%"; the next character determine the type of parameter: 1 (!) =
- * suppress message completely, 29 (S) = NULL If PARM=1, else 'S' (optional
- * plural ending), 33 (W) = word (two 30-bit values) with trailing spaces
- * suppressed, 22 (L) or 31 (U) = word but map to lower/upper case, 13 (C) =
- * word in lower case with first letter capitalised, 30 (T) = text ending
- * with a word of -1, 65-73 (1-9) = number using that many characters,
- * 12 (B) = variable number of blanks. */
- if(PRMTYP == 1)return;
- if(PRMTYP == 29) goto L320;
- if(PRMTYP == 30) goto L340;
- if(PRMTYP == 12) goto L360;
- if(PRMTYP == 33 || PRMTYP == 22 || PRMTYP == 31 || PRMTYP == 13) goto
- L380;
- PRMTYP=PRMTYP-64;
- if(PRMTYP < 1 || PRMTYP > 9) goto L30;
- SHFTXT(LNPOSN+2,PRMTYP-2);
- LNPOSN=LNPOSN+PRMTYP;
- PARM=labs(PARMS[NPARMS]);
- NEG=0;
- if(PARMS[NPARMS] < 0)NEG=9;
- /* 390 */ for (I=1; I<=PRMTYP; I++) {
- LNPOSN=LNPOSN-1;
- INLINE[LNPOSN]=MOD(PARM,10)+64;
- if(I == 1 || PARM != 0) goto L390;
- INLINE[LNPOSN]=NEG;
- NEG=0;
-L390: PARM=PARM/10;
- } /* end loop */
- LNPOSN=LNPOSN+PRMTYP;
-L395: NPARMS=NPARMS+1;
- goto L32;
-
-L320: SHFTXT(LNPOSN+2,-1);
- INLINE[LNPOSN]=55;
- if(PARMS[NPARMS] == 1)SHFTXT(LNPOSN+1,-1);
- goto L395;
-
-L340: SHFTXT(LNPOSN+2,-2);
- STATE=0;
- CASE=2;
-L345: if(PARMS[NPARMS] < 0) goto L395;
- {long x = NPARMS+1; if(PARMS[x] < 0)CASE=0;}
- PUTTXT(PARMS[NPARMS],STATE,CASE);
- NPARMS=NPARMS+1;
- goto L345;
-
-L360: PRMTYP=PARMS[NPARMS];
- SHFTXT(LNPOSN+2,PRMTYP-2);
- if(PRMTYP == 0) goto L395;
- for (I=1; I<=PRMTYP; I++) {
- INLINE[LNPOSN]=0;
- LNPOSN=LNPOSN+1;
- } /* end loop */
- goto L395;
-
-L380: SHFTXT(LNPOSN+2,-2);
- STATE=0;
- CASE= -1;
- if(PRMTYP == 31)CASE=1;
- if(PRMTYP == 33)CASE=0;
- I=LNPOSN;
- PUTTXT(PARMS[NPARMS],STATE,CASE);
- {long x = NPARMS+1; PUTTXT(PARMS[x],STATE,CASE);}
- if(PRMTYP == 13 && INLINE[I] >= 37 && INLINE[I] <=
- 62)INLINE[I]=INLINE[I]-26;
- NPARMS=NPARMS+2;
- goto L32;
-
-L40: if(BLANK)TYPE0();
- BLANK=false;
- TYPE();
- K=L+1;
- if(LINES[K] >= 0) goto L10;
- return;
-}
-
-void PSPEAK(vocab_t MSG,int SKIP)
-/* Find the skip+1st message from msg and print it. MSG should be
- * the index of the inventory message for object. (INVEN+N+1 message
- * is game.prop=N message). */
-{
- long I, M;
-
- M=PTEXT[MSG];
- if(SKIP < 0)
- goto L9;
- for (I=0; I<=SKIP; I++) {
-L1: M=labs(LINES[M]);
- if(LINES[M] >= 0)
- goto L1;
- }
-L9: SPEAK(M);
- return;
-}
-void RSPEAK(vocab_t i)
-/* Print the i-th "random" message (section 6 of database). */
+#include "linenoise/linenoise.h"
+#include "dungeon.h"
+
+const char new_advent_to_ascii[] = {
+ ' ', '!', '"', '#', '$', '%', '&', '\'',
+ '(', ')', '*', '+', ',', '-', '.', '/',
+ '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', ':', ';', '<', '=', '>', '?',
+ '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', '\0', '\0', '\0', '\0', '\0',
+};
+
+const char new_ascii_to_advent[] = {
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+};
+
+char* xstrdup(const char* s)