rnd-20090623-1-src
[rocksndiamonds.git] / src / game_sp / DemoBufferObject.c
diff --git a/src/game_sp/DemoBufferObject.c b/src/game_sp/DemoBufferObject.c
new file mode 100644 (file)
index 0000000..37e758e
--- /dev/null
@@ -0,0 +1,240 @@
+// ----------------------------------------------------------------------------
+// DemoBufferObject.c
+// ----------------------------------------------------------------------------
+
+#include "DemoBufferObject.h"
+
+static void Class_Terminate();
+static int RemoveLastDemoKey();
+
+// --- VERSION 1.0 CLASS
+// --- BEGIN
+// ---   MultiUse = -1  'True  // True
+// ---   Persistable = 0  'NotPersistable  // NotPersistable
+// ---   DataBindingBehavior = 0  'vbNone  // vbNone
+// ---   DataSourceBehavior  = 0  'vbNone  // vbNone
+// ---   MTSTransactionMode  = 0  'NotAnMTSObject  // NotAnMTSObject
+// --- END
+
+static char *VB_Name = "DemoBufferObject";
+static boolean VB_GlobalNameSpace = False;
+static boolean VB_Creatable = True;
+static boolean VB_PredeclaredId = False;
+static boolean VB_Exposed = False;
+// --- Option Explicit
+
+#define MaxPos                         ((long)1024)
+
+// Private Const MaxPos& = 20& 'debug only
+byte DemoByte[MaxPos + 1];
+DemoBufferObject SubBuffer;
+
+byte nFirstByte;
+
+char *mSignature;
+boolean bSignatureAvailable;
+
+long WritePos;
+int LastKey;
+int CheckSum;
+long nSize;
+
+static void Class_Initialize()
+{
+  int lSize;
+
+  Trace("DemoBufferObject", "Construction");
+  DemoBufferObject_Reset();
+  if (! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)))
+  {
+    lSize = DemoBuffer_Size();
+    Trace("DemoBufferObject", "Size == ...");
+    Trace("DemoBufferObject", "BufferCount == ...");
+    Trace("DemoBufferObject", "TimerVar == ...");
+  }
+}
+
+static void Class_Terminate()
+{
+  SET_TO_NOTHING(&SubBuffer, sizeof(SubBuffer));
+}
+
+void DemoBufferObject_Reset()
+{
+  nSize = 0;
+  nFirstByte = 0x81;
+  WritePos = 0;
+  LastKey = -1;
+  CheckSum = 0;
+  bSignatureAvailable = False;
+  mSignature = "";
+  SET_TO_NOTHING(&SubBuffer, sizeof(SubBuffer));
+}
+
+long DemoBufferObject_Get_Size()
+{
+  long Size;
+
+  Size = (nSize < 1 ?  0 :  0);
+  if (! IS_NOTHING(&SubBuffer, sizeof(SubBuffer)))
+    Size = Size + SubBuffer_Size();
+
+  return Size;
+}
+
+byte DemoBufferObject_Get_CheckSumByte()
+{
+  byte CheckSumByte;
+
+  CheckSumByte = CheckSum & 0xFF;
+
+  return CheckSumByte;
+}
+
+byte DemoBufferObject_Get_FirstByte()
+{
+  byte FirstByte;
+
+  FirstByte = nFirstByte;
+
+  return FirstByte;
+}
+
+void DemoBufferObject_Let_FirstByte(byte NewVal)
+{
+  nFirstByte = NewVal;
+}
+
+//
+// Public Property Get DemoAvailable() As Boolean
+//  DemoAvailable = (0 < nSize)
+// End Property
+//
+// Public Property Get Signature() As String
+//  If SubBuffer Is Nothing Then
+//    Signature = mSignature
+//  Else
+//    Signature = SubBuffer.Signature
+//  End If
+// End Property
+
+// Public Property Let Signature(NewSig$)
+//  If SubBuffer Is Nothing Then
+//    Signature = NewSig
+//  Else
+//    SubBuffer.Signature = NewSig
+//  End If
+// End Property
+//
+// Public Property Get SignatureAvailable() As Boolean
+//  If SubBuffer Is Nothing Then
+//    SignatureAvailable = (mSignature <> "")
+//  Else
+//    SignatureAvailable = SubBuffer
+//  End If
+// End Property
+
+boolean DemoBufferObject_Serialize(int FNum)
+{
+  boolean Serialize;
+
+  int i; // , LKey%
+
+  Serialize = True;
+  if (! IS_NOTHING(&SubBuffer, sizeof(SubBuffer)))
+    Serialize = SubBuffer_Serialize(FNum);
+
+  if (nSize == 0)
+    return Serialize;
+
+  // LKey = RemoveLastDemoKey()
+  if (! nSize < MaxPos) // this buffer is full
+  {
+
+    // --- On Error GoTo SerializeEH
+    FILE_PUT(FNum, -1, &DemoByte, sizeof(DemoByte));
+    // --- On Error GoTo 0
+
+  }
+  else // this is the last buffer in the recursive chain
+  {
+
+    // --- On Error GoTo SerializeEH
+    for (i = 1; i <= WritePos; i++)
+    {
+      FILE_PUT(FNum, -1, &DemoByte[i], sizeof(DemoByte[i]));
+    }
+
+    // --- On Error GoTo 0
+
+  }
+
+  // AddDemoKey LKey
+  return Serialize;
+
+SerializeEH:
+  Serialize = False;
+
+  return Serialize;
+}
+
+void DemoBufferObject_AddDemoKey(int KeyCode)
+{
+  CheckSum = (CheckSum + 1) & 0xFF; // increment checksum
+  //  If Not SubBuffer Is Nothing Then 'delegate
+  //    Debug.Assert False
+  //    'SubBuffer.AddDemoKey KeyCode
+  //    Exit Sub
+  //  End If
+  if (LastKey == KeyCode)
+  {
+    DemoByte[WritePos] = DemoByte[WritePos] + 0x10;
+    if (0xEF < DemoByte[WritePos])
+      LastKey = -1;
+
+  }
+  else // LastKey <> KeyCode
+  {
+    WritePos = WritePos + 1;
+
+    if (MaxPos < WritePos) // if overflow then create new buffer, hang myself in list
+    {
+      DemoBufferObject Tmp;
+
+      // Tmp = New DemoBufferObject; // (handle this later, if needed)
+      Tmp.SetSubBuffer(&VB_OBJECT_SELF);
+      Tmp.AddDemoKey(KeyCode); // and delegate
+      DemoBuffer = Tmp;
+    }
+    else
+    {
+      nSize = nSize + 1; // increment size
+      DemoByte[WritePos] = KeyCode;
+      LastKey = KeyCode;
+    }
+  }
+}
+
+void DemoBufferObject_SetSubBuffer(DemoBufferObject SBuf)
+{
+  SubBuffer = SBuf;
+}
+
+static int RemoveLastDemoKey()
+{
+  static int RemoveLastDemoKey;
+
+  RemoveLastDemoKey = (DemoByte[WritePos] & 0xF);
+  if (DemoByte[WritePos] < 0x10)
+  {
+    WritePos = WritePos - 1;
+    nSize = nSize - 1;
+    LastKey = -1;
+  }
+  else
+  {
+    DemoByte[WritePos] = DemoByte[WritePos] - 0x10;
+  }
+
+  return RemoveLastDemoKey;
+}