Four kinds of timers are defined but only two have ever been used. Have sanity checking complain if the other two occur or if 'kind' doesn't match any of the four. Also, replacing a perfectly normal use of isok() with an inline test just to pacify static analysis feels like a slippery slope, so handle that a little differently. I reordered the shrink_glob timer to put all object timers together. Unfortunately that warrants incrementing EDITLEVEL which invalidates existing save files.
70 lines
2.5 KiB
C
70 lines
2.5 KiB
C
/* NetHack 3.7 timeout.h $NHDT-Date: 1703294874 2023/12/23 01:27:54 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.22 $ */
|
|
/* Copyright 1994, Dean Luick */
|
|
/* NetHack may be freely redistributed. See license for details. */
|
|
|
|
#ifndef TIMEOUT_H
|
|
#define TIMEOUT_H
|
|
|
|
/* generic timeout function */
|
|
typedef void (*timeout_proc)(ANY_P *, long);
|
|
|
|
/* kind of timer */
|
|
enum timer_type {
|
|
TIMER_LEVEL = 0, /* event specific to level [melting ice] */
|
|
TIMER_GLOBAL = 1, /* event follows current play [not used] */
|
|
TIMER_OBJECT = 2, /* event follows an object [various] */
|
|
TIMER_MONSTER = 3, /* event follows a monster [not used] */
|
|
NUM_TIMER_KINDS /* 4 */
|
|
};
|
|
|
|
/* save/restore timer ranges */
|
|
#define RANGE_LEVEL 0 /* save/restore timers staying on level */
|
|
#define RANGE_GLOBAL 1 /* save/restore timers following global play */
|
|
|
|
/*
|
|
* Timeout functions. Add an enum here, then put it in the table
|
|
* in timeout.c. "One more level of indirection will fix everything."
|
|
*
|
|
* Note: if any are inserted, removed, or reordered then EDITLEVEL
|
|
* needs to be incremented because timeout indices get written into save
|
|
* and bones files if any timers are present while saving. (Adding new
|
|
* ones at the end isn't restricted this way since new indices won't be
|
|
* present in old data.)
|
|
*/
|
|
enum timeout_types {
|
|
ROT_ORGANIC = 0, /* for buried organics */
|
|
ROT_CORPSE,
|
|
REVIVE_MON,
|
|
ZOMBIFY_MON,
|
|
BURN_OBJECT,
|
|
HATCH_EGG,
|
|
FIG_TRANSFORM,
|
|
SHRINK_GLOB,
|
|
MELT_ICE_AWAY,
|
|
|
|
NUM_TIME_FUNCS
|
|
};
|
|
|
|
#define timer_is_pos(ttype) ((ttype) == MELT_ICE_AWAY)
|
|
#define timer_is_obj(ttype) ((ttype) == ROT_ORGANIC \
|
|
|| (ttype) == ROT_CORPSE \
|
|
|| (ttype) == REVIVE_MON \
|
|
|| (ttype) == ZOMBIFY_MON \
|
|
|| (ttype) == BURN_OBJECT \
|
|
|| (ttype) == HATCH_EGG \
|
|
|| (ttype) == FIG_TRANSFORM \
|
|
|| (ttype) == SHRINK_GLOB)
|
|
|
|
/* used in timeout.c */
|
|
typedef struct fe {
|
|
struct fe *next; /* next item in chain */
|
|
long timeout; /* when we time out */
|
|
unsigned long tid; /* timer ID */
|
|
short kind; /* kind of use */
|
|
short func_index; /* what to call when we time out */
|
|
anything arg; /* pointer to timeout argument */
|
|
Bitfield(needs_fixup, 1); /* does arg need to be patched? */
|
|
} timer_element;
|
|
|
|
#endif /* TIMEOUT_H */
|