return (ptr);
}
-char* xstrdup(const char* s)
-{
- char* ptr = strdup(s);
- if (ptr == NULL) {
- fprintf(stderr, "Out of memory!\n");
- exit(EXIT_FAILURE);
- }
- return (ptr);
-}
-
void packed_to_token(long packed, char token[6])
{
// Unpack and map back to ASCII.
size--;
} else {
long arg = va_arg(ap, long);
+ if (arg == -1)
+ arg = 0;
i++;
// Integer specifier. In order to accommodate the fact that PARMS can have both legitimate integers *and* packed tokens, stringify everything. Future work may eliminate the need for this.
if (msg[i] == 'd') {
va_end(ap);
}
-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). */
+void pspeak(vocab_t msg, enum speaktype mode, int skip, ...)
+/* Find the skip+1st message from msg and print it. Modes are:
+ * feel = for inventory, what you can touch
+ * look = the long description for the state the object is in
+ * listen = the sound for the state the object is in
+ * study = text on the object. */
{
va_list ap;
va_start(ap, skip);
- if (skip >= 0)
- vspeak(object_descriptions[msg].longs[skip], ap);
- else
- vspeak(object_descriptions[msg].inventory, ap);
+ switch (mode) {
+ case touch:
+ vspeak(objects[msg].inventory, ap);
+ break;
+ case look:
+ vspeak(objects[msg].longs[skip], ap);
+ break;
+ case hear:
+ vspeak(objects[msg].sounds[skip], ap);
+ break;
+ case study:
+ vspeak(objects[msg].texts[skip], ap);
+ break;
+ }
va_end(ap);
}
return (input);
}
-bool YES(const char* question, const char* yes_response, const char* no_response)
+bool yes(const char* question, const char* yes_response, const char* no_response)
/* Print message X, wait for yes/no answer. If yes, print Y and return true;
* if no, print Z and return false. */
{
/* Data structure routines */
-long VOCAB(long id, long init)
+long vocab(long id, long init)
/* Look up ID in the vocabulary (ATAB) and return its "definition" (KTAB), or
* -1 if not found. If INIT is positive, this is an initialisation call setting
* up a keyword variable, and not finding it constitutes a bug. It also means
BUG(RAN_OFF_END_OF_VOCABULARY_TABLE);
}
-void JUGGLE(long object)
+void juggle(long object)
/* Juggle an object by picking it up and putting it down again, the purpose
* being to get the object to the front of the chain of things at its loc. */
{
i = game.place[object];
j = game.fixed[object];
- MOVE(object, i);
- MOVE(object + NOBJECTS, j);
+ move(object, i);
+ move(object + NOBJECTS, j);
}
-void MOVE(long object, long where)
+void move(long object, long where)
/* Place any object anywhere by picking it up and dropping it. May
* already be toting, in which case the carry is a no-op. Mustn't
* pick up objects which are not at any loc, since carry wants to
else
from = game.place[object];
if (from != LOC_NOWHERE && from != CARRIED && !SPECIAL(from))
- CARRY(object, from);
- DROP(object, where);
+ carry(object, from);
+ drop(object, where);
}
-long PUT(long object, long where, long pval)
+long put(long object, long where, long pval)
/* PUT is the same as MOVE, except it returns a value used to set up the
* negated game.prop values for the repository objects. */
{
- MOVE(object, where);
+ move(object, where);
return (-1) - pval;;
}
-void CARRY(long object, long where)
+void carry(long object, long where)
/* Start toting an object, removing it from the list of things at its former
* location. Incr holdng unless it was already being toted. If object>NOBJECTS
* (moving "fixed" second loc), don't change game.place or game.holdng. */
game.link[temp] = game.link[object];
}
-void DROP(long object, long where)
+void drop(long object, long where)
/* Place an object at a given loc, prefixing it onto the game.atloc list. Decr
* game.holdng if the object was being toted. */
{
game.atloc[where] = object;
}
-long ATDWRF(long where)
+long atdwrf(long where)
/* Return the index of first dwarf at the given location, zero if no dwarf is
* there (or if dwarves not active yet), -1 if all dwarves are dead. Ignore
* the pirate (6th dwarf). */
/* Utility routines (SETBIT, TSTBIT, set_seed, get_next_lcg_value,
* randrange, RNDVOC) */
-long SETBIT(long bit)
+long setbit(long bit)
/* Returns 2**bit for use in constructing bit-masks. */
{
return (1 << bit);
}
-bool TSTBIT(long mask, int bit)
+bool tstbit(long mask, int bit)
/* Returns true if the specified bit is set in the mask. */
{
return (mask & (1 << bit)) != 0;
return range * get_next_lcg_value() / game.lcg_m;
}
-long RNDVOC(long second, long force)
+long rndvoc(long second, long force)
/* Searches the vocabulary ATAB for a word whose second character is
* char, and changes that word such that each of the other four
* characters is a random letter. If force is non-zero, it is used
}
}
-void DATIME(long* d, long* t)
+void datime(long* d, long* t)
{
struct timeval tv;
gettimeofday(&tv, NULL);