rnd-20100315-1-src
[rocksndiamonds.git] / src / game_sp / DemoBufferObject.c
1 // ----------------------------------------------------------------------------
2 // DemoBufferObject.c
3 // ----------------------------------------------------------------------------
4
5 #include "DemoBufferObject.h"
6
7 // static void Class_Terminate();
8 // static int RemoveLastDemoKey();
9
10 // --- VERSION 1.0 CLASS
11 // --- BEGIN
12 // ---   MultiUse = -1  'True  // True
13 // ---   Persistable = 0  'NotPersistable  // NotPersistable
14 // ---   DataBindingBehavior = 0  'vbNone  // vbNone
15 // ---   DataSourceBehavior  = 0  'vbNone  // vbNone
16 // ---   MTSTransactionMode  = 0  'NotAnMTSObject  // NotAnMTSObject
17 // --- END
18
19 // static char *VB_Name = "DemoBufferObject";
20 // static boolean VB_GlobalNameSpace = False;
21 // static boolean VB_Creatable = True;
22 // static boolean VB_PredeclaredId = False;
23 // static boolean VB_Exposed = False;
24
25 // --- Option Explicit
26
27 #define MaxPos                  ((long)1024)
28
29 // Private Const MaxPos& = 20& 'debug only
30 byte DemoByte[MaxPos + 1];
31 DemoBufferObject SubBuffer;
32
33 byte nFirstByte;
34
35 char *mSignature;
36 boolean bSignatureAvailable;
37
38 long WritePos;
39 int LastKey;
40 int CheckSum;
41 long nSize;
42
43 #if 0
44
45 static void Class_Initialize()
46 {
47   int lSize;
48
49   Trace("DemoBufferObject", "Construction");
50   DemoBufferObject_Reset();
51   if (! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)))
52   {
53     lSize = DemoBuffer_Size();
54     Trace("DemoBufferObject", "Size == ...");
55     Trace("DemoBufferObject", "BufferCount == ...");
56     Trace("DemoBufferObject", "TimerVar == ...");
57   }
58 }
59
60 static void Class_Terminate()
61 {
62   SET_TO_NOTHING(&SubBuffer, sizeof(SubBuffer));
63 }
64
65 #endif
66
67 void DemoBufferObject_Reset()
68 {
69   nSize = 0;
70   nFirstByte = 0x81;
71   WritePos = 0;
72   LastKey = -1;
73   CheckSum = 0;
74   bSignatureAvailable = False;
75   mSignature = "";
76   SET_TO_NOTHING(&SubBuffer, sizeof(SubBuffer));
77 }
78
79 long DemoBufferObject_Get_Size()
80 {
81   long Size;
82
83   Size = (nSize < 1 ? 0 : nSize);
84   if (! IS_NOTHING(&SubBuffer, sizeof(SubBuffer)))
85     Size = Size + SubBuffer.Size;
86
87   return Size;
88 }
89
90 byte DemoBufferObject_Get_CheckSumByte()
91 {
92   byte CheckSumByte;
93
94   CheckSumByte = CheckSum & 0xFF;
95
96   return CheckSumByte;
97 }
98
99 byte DemoBufferObject_Get_FirstByte()
100 {
101   byte FirstByte;
102
103   FirstByte = nFirstByte;
104
105   return FirstByte;
106 }
107
108 void DemoBufferObject_Let_FirstByte(byte NewVal)
109 {
110   nFirstByte = NewVal;
111 }
112
113 //
114 // Public Property Get DemoAvailable() As Boolean
115 //  DemoAvailable = (0 < nSize)
116 // End Property
117 //
118 // Public Property Get Signature() As String
119 //  If SubBuffer Is Nothing Then
120 //    Signature = mSignature
121 //  Else
122 //    Signature = SubBuffer.Signature
123 //  End If
124 // End Property
125
126 // Public Property Let Signature(NewSig$)
127 //  If SubBuffer Is Nothing Then
128 //    Signature = NewSig
129 //  Else
130 //    SubBuffer.Signature = NewSig
131 //  End If
132 // End Property
133 //
134 // Public Property Get SignatureAvailable() As Boolean
135 //  If SubBuffer Is Nothing Then
136 //    SignatureAvailable = (mSignature <> "")
137 //  Else
138 //    SignatureAvailable = SubBuffer
139 //  End If
140 // End Property
141
142 boolean DemoBufferObject_Serialize(FILE *FNum)
143 {
144   boolean Serialize;
145
146   int i; // , LKey%
147
148   Serialize = True;
149   if (! IS_NOTHING(&SubBuffer, sizeof(SubBuffer)))
150     Serialize = SubBuffer.Serialize(FNum);
151
152   if (nSize == 0)
153     return Serialize;
154
155   // LKey = RemoveLastDemoKey()
156   if (! nSize < MaxPos) // this buffer is full
157   {
158
159     // --- On Error GoTo SerializeEH
160     FILE_PUT(FNum, -1, &DemoByte, sizeof(DemoByte));
161     // --- On Error GoTo 0
162
163   }
164   else // this is the last buffer in the recursive chain
165   {
166
167     // --- On Error GoTo SerializeEH
168     for (i = 1; i <= WritePos; i++)
169     {
170       FILE_PUT(FNum, -1, &DemoByte[i], sizeof(DemoByte[i]));
171     }
172
173     // --- On Error GoTo 0
174
175   }
176
177   // AddDemoKey LKey
178   return Serialize;
179
180   // SerializeEH:
181   Serialize = False;
182
183   return Serialize;
184 }
185
186 void DemoBufferObject_AddDemoKey(int KeyCode)
187 {
188   CheckSum = (CheckSum + 1) & 0xFF; // increment checksum
189   //  If Not SubBuffer Is Nothing Then 'delegate
190   //    Debug.Assert False
191   //    'SubBuffer.AddDemoKey KeyCode
192   //    Exit Sub
193   //  End If
194   if (LastKey == KeyCode)
195   {
196     DemoByte[WritePos] = DemoByte[WritePos] + 0x10;
197     if (0xEF < DemoByte[WritePos])
198       LastKey = -1;
199
200   }
201   else // LastKey <> KeyCode
202   {
203     WritePos = WritePos + 1;
204
205     if (MaxPos < WritePos) // if overflow then create new buffer, hang myself in list
206     {
207       DemoBufferObject Tmp;
208
209       // Tmp = New DemoBufferObject; // (handle this later, if needed)
210       Tmp.SetSubBuffer(&VB_OBJECT_SELF);
211       Tmp.AddDemoKey(KeyCode); // and delegate
212       DemoBuffer = Tmp;
213     }
214     else
215     {
216       nSize = nSize + 1; // increment size
217       DemoByte[WritePos] = KeyCode;
218       LastKey = KeyCode;
219     }
220   }
221 }
222
223 void DemoBufferObject_SetSubBuffer(DemoBufferObject SBuf)
224 {
225   SubBuffer = SBuf;
226 }
227
228 #if 0
229
230 static int RemoveLastDemoKey()
231 {
232   static int RemoveLastDemoKey;
233
234   RemoveLastDemoKey = (DemoByte[WritePos] & 0xF);
235   if (DemoByte[WritePos] < 0x10)
236   {
237     WritePos = WritePos - 1;
238     nSize = nSize - 1;
239     LastKey = -1;
240   }
241   else
242   {
243     DemoByte[WritePos] = DemoByte[WritePos] - 0x10;
244   }
245
246   return RemoveLastDemoKey;
247 }
248
249 #endif