convert line ends
[canaan.git] / prj / cam / libsrc / portal / oracle.c
blob2968290c49be583d2d34b76c8ab491018d4b99c9
1 /*
2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
4 */
6 // $Header: r:/t2repos/thief2/libsrc/portold/oracle.c,v 1.1 1996/10/21 21:43:00 buzzard Exp $
8 // Oracle: can answer any question in O(1) time.
9 // It does this by cacheing the result from a previous frame
11 #include <lg.h>
12 #include <string.h>
14 int oracle_flags;
15 int oracle_save;
16 int oracle_last_memorized;
18 uchar *current_memorize;
19 uchar *last_memorize;
20 int current_playback;
21 int current_record, oracle_record_size;
23 // INVARIANT: oracle_save != 0 iff current_memorize != 0
25 void OracleFinishQueues(void)
27 if (current_memorize) {
28 if (last_memorize)
29 Free(last_memorize);
30 last_memorize = current_memorize;
31 oracle_last_memorized = oracle_save;
33 current_memorize = 0;
34 oracle_save = 0;
38 void OracleStartFrame(int answer_flags, int memorize_flags)
40 OracleFinishQueues();
42 if (answer_flags == oracle_last_memorized) {
43 oracle_flags = answer_flags;
44 current_playback = 0;
45 } else
46 oracle_flags = 0;
48 if (memorize_flags) {
49 oracle_save = memorize_flags;
50 oracle_record_size = 1024;
51 current_memorize = Malloc(oracle_record_size);
52 current_record = 0;
56 // make the oracle try to answer exactly this set of flags
57 void OracleSmartStart(int answer_flags)
59 if (answer_flags == oracle_last_memorized)
60 OracleStartFrame(answer_flags, 0);
61 else if (answer_flags == oracle_save)
62 OracleStartFrame(answer_flags, 0);
63 else
64 OracleStartFrame(0, answer_flags);
67 bool OracleStore(void *data, int datasize)
69 while (current_record + datasize >= oracle_record_size) {
70 oracle_record_size *= 2;
71 current_memorize = Realloc(current_memorize, oracle_record_size);
74 memcpy(current_memorize + current_record, data, datasize);
75 current_record += datasize;
76 return TRUE;
79 bool OracleFetch(int requeue, void *data, int datasize)
81 memcpy(data, last_memorize + current_playback, datasize);
82 current_playback += datasize;
83 if (requeue)
84 OracleStore(data, datasize);
85 return TRUE;
88 bool OracleFetchBool(int requeue)
90 bool result;
91 OracleFetch(requeue, &result, sizeof(result));
92 return result;
95 bool OracleStoreBool(bool result)
97 OracleStore(&result, sizeof(result));
98 return result;