1 |
/*****************************************************************************/ |
2 |
/* Crossfire timers support - (C) 2001 by Yann Chachkoff. */ |
3 |
/* This code is placed under the GPL. */ |
4 |
/*****************************************************************************/ |
5 |
|
6 |
/*****************************************************************************/ |
7 |
/* Headers needed. */ |
8 |
/*****************************************************************************/ |
9 |
|
10 |
#ifndef TIMERS_H_ |
11 |
#define TIMERS_H_ |
12 |
|
13 |
#include <global.h> |
14 |
#include <object.h> |
15 |
|
16 |
#ifdef HAVE_TIME_H |
17 |
#include <time.h> |
18 |
#endif |
19 |
|
20 |
/*****************************************************************************/ |
21 |
/* A timer is a kind of "clock" associated with an object. When the counter */ |
22 |
/* of a timer reaches 0, it is removed from the list of active timers and an */ |
23 |
/* EVENT_TIMER is generated for the target object. */ |
24 |
/* Important note: don't confuse "EVENT_TIMER" and "EVENT_TIME" - the first */ |
25 |
/* one is called when a timer delay has reached 0 while EVENT_TIME is */ |
26 |
/* triggered each time the object gets the opportunity to move. */ |
27 |
/*****************************************************************************/ |
28 |
/* Timer counting methods. */ |
29 |
/* You can either count the time in seconds or in "crossfire cycles". */ |
30 |
/* If mode = TIMER_MODE_SECONDS, delay will store the "time to reach" in sec.*/ |
31 |
/* For example, if a timer is created at t=2044s to be triggered 10 seconds */ |
32 |
/* later, delay = 2054. */ |
33 |
/* If mode = TIMER_MODE_CYCLES, delay will store the "time remaining", given */ |
34 |
/* in crossfire cycles. For example, if a timer is to be triggered 10 seconds*/ |
35 |
/* later, delay = 10. */ |
36 |
/*****************************************************************************/ |
37 |
/* Timer limits. */ |
38 |
/* You can't create more than 1000 timers (I created the timers table as a */ |
39 |
/* static one not (only) because I was too lazy/incompetent to implement is */ |
40 |
/* as a dynamic linked-list, but because 1) 1000 should be quite enough, 2) */ |
41 |
/* 1000 does not use a lot of memory, 3) it would be easier to adapt to some */ |
42 |
/* form of multithreading support with a static list. */ |
43 |
/* Anyway, if you think 1000 is not enough, you can safely increase this - */ |
44 |
/* memory should not be a problem in that case, given the size of a cftimer. */ |
45 |
/*****************************************************************************/ |
46 |
|
47 |
#define TIMER_MODE_DEAD 0 /* Used to mark a timer as unused in the list */ |
48 |
#define TIMER_MODE_SECONDS 1 |
49 |
#define TIMER_MODE_CYCLES 2 |
50 |
|
51 |
typedef struct _cftimer |
52 |
{ |
53 |
int mode; |
54 |
long delay; |
55 |
object* ob; |
56 |
} cftimer; |
57 |
|
58 |
#define MAX_TIMERS 1000 |
59 |
|
60 |
cftimer timers_table[MAX_TIMERS]; |
61 |
|
62 |
#define TIMER_ERR_NONE 0 |
63 |
#define TIMER_ERR_ID -1 |
64 |
#define TIMER_ERR_OBJ -2 |
65 |
#define TIMER_ERR_MODE -3 |
66 |
|
67 |
#endif /* TIMERS_H_ */ |
68 |
|