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