2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
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
16 int oracle_last_memorized
;
18 uchar
*current_memorize
;
21 int current_record
, oracle_record_size
;
23 // INVARIANT: oracle_save != 0 iff current_memorize != 0
25 void OracleFinishQueues(void)
27 if (current_memorize
) {
30 last_memorize
= current_memorize
;
31 oracle_last_memorized
= oracle_save
;
38 void OracleStartFrame(int answer_flags
, int memorize_flags
)
42 if (answer_flags
== oracle_last_memorized
) {
43 oracle_flags
= answer_flags
;
49 oracle_save
= memorize_flags
;
50 oracle_record_size
= 1024;
51 current_memorize
= Malloc(oracle_record_size
);
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);
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
;
79 bool OracleFetch(int requeue
, void *data
, int datasize
)
81 memcpy(data
, last_memorize
+ current_playback
, datasize
);
82 current_playback
+= datasize
;
84 OracleStore(data
, datasize
);
88 bool OracleFetchBool(int requeue
)
91 OracleFetch(requeue
, &result
, sizeof(result
));
95 bool OracleStoreBool(bool result
)
97 OracleStore(&result
, sizeof(result
));