rnd-20090623-1-src
[rocksndiamonds.git] / src / game_sp / Marker.c
diff --git a/src/game_sp/Marker.c b/src/game_sp/Marker.c
new file mode 100644 (file)
index 0000000..9f0ac94
--- /dev/null
@@ -0,0 +1,274 @@
+// ----------------------------------------------------------------------------
+// Marker.c
+// ----------------------------------------------------------------------------
+
+#include "Marker.h"
+
+static boolean IsPort(long i);
+static void LimitXY(int *X, int *Y);
+static void SortData();
+
+// --- 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 = "MarkerObject";
+static boolean VB_GlobalNameSpace = False;
+static boolean VB_Creatable = True;
+static boolean VB_PredeclaredId = False;
+static boolean VB_Exposed = False;
+// --- Option Explicit
+
+long mIndex1, mIndex2;
+int X1, X2, Y1, Y2;
+int XMin, YMin;
+boolean mVisible;
+
+byte *SelectionData;
+
+int Marker_Get_Width()
+{
+  int Width;
+
+  Width = Abs(X2 - X1) + 1;
+
+  return Width;
+}
+
+int Marker_Get_Height()
+{
+  int Height;
+
+  Height = Abs(Y2 - Y1) + 1;
+
+  return Height;
+}
+
+int Marker_Get_Left()
+{
+  int Left;
+
+  SortData();
+  Left = XMin;
+
+  return Left;
+}
+
+int Marker_Get_Top()
+{
+  int Top;
+
+  SortData();
+  Top = YMin;
+
+  return Top;
+}
+
+static void LimitXY(int *X, int *Y)
+{
+  if (*X < DisplayMinX)
+    *X = DisplayMinX;
+
+  if (DisplayMaxX < *X)
+    *X = DisplayMaxX;
+
+  if (*Y < DisplayMinY)
+    *Y = DisplayMinY;
+
+  if (DisplayMaxY < *Y)
+    *Y = DisplayMaxY;
+}
+
+void Marker_SetPoint1(int X, int Y)
+{
+  LimitXY(&X, &Y);
+  X1 = X;
+  Y1 = Y;
+  X2 = X;
+  Y2 = Y;
+}
+
+void Marker_SetPoint2(int X, int Y)
+{
+  char *T;
+
+  LimitXY(&X, &Y);
+  X2 = X;
+  Y2 = Y;
+  T = CAT("(", Marker_Get_Width(), " x ", Marker_Get_Height(), ")");
+  MainForm.lblFrameCount = T;
+}
+
+static void SortData()
+{
+  int Tmp;
+
+  XMin = (X2 < X1 ?  X2 :  X2);
+  YMin = (Y2 < Y1 ?  Y2 :  Y2);
+}
+
+void Marker_ShowMarker(boolean ShowFlag)
+{
+  mVisible = ShowFlag;
+  Marker_MoveMarker();
+}
+
+void Marker_RefreshMarker()
+{
+  int L, T, R, B;
+  long Tmp;
+
+  if (! mVisible)
+    return;
+
+  LimitXY(&X1, &Y1);
+  LimitXY(&X2, &Y2);
+  SortData();
+  L = DigitXPos(XMin) - 1;
+  T = DigitYPos(YMin) - 1;
+  R = L + StretchWidth * Marker_Get_Width() + 1;
+  B = T + StretchWidth * Marker_Get_Height() + 1;
+  MainForm.picPane.Line(L, T, R, B, 0xFFFFFF, B);
+}
+
+void Marker_MoveMarker()
+{
+  int L, T, R, B;
+  long Tmp;
+
+  if (! mVisible)
+    return;
+
+  LimitXY(&X1, &Y1);
+  LimitXY(&X2, &Y2);
+  SortData();
+  Stage.Blt();
+  Tmp = GetSI(XMin, YMin);
+  if (Marker_Get_Width() == 1 && Marker_Get_Height() == 1 && IsPort(Tmp))
+  {
+    SpLoadMenu();
+    MainForm.menSP.Enabled = True;
+  }
+  else
+  {
+    MainForm.menSP.Enabled = False;
+  }
+}
+
+static boolean IsPort(long i)
+{
+  static boolean IsPort;
+
+  int ax;
+
+  IsPort = False;
+  ax = DisPlayField[i];
+  if (fiOrangeDisk < ax && ax < fiSnikSnak)
+    IsPort = True;
+
+  return IsPort;
+}
+
+void Marker_Copy()
+{
+  int X, Y, MaxX, MaxY;
+  long Tmp;
+  char *TPath;
+  int FNum;
+
+  SortData();
+  MaxX = Marker_Get_Width() - 1;
+  MaxY = Marker_Get_Height() - 1;
+  SelectionData = REDIM_2D(sizeof(byte), 0, MaxX + 1 - 1, 0, MaxY + 1 - 1);
+  for (Y = 0; Y <= MaxY; Y++)
+  {
+    for (X = 0; X <= MaxX; X++)
+    {
+      Tmp = FieldWidth * (YMin + Y) + XMin + X;
+
+      // --- On Error GoTo CopyEH
+      SelectionData[X, Y] = DisPlayField[Tmp];
+      // --- On Error GoTo 0
+
+    }
+  }
+
+  TPath = CAT(App.Path, "/Mpx.clp");
+  if (FileExists(TPath))
+    MayKill(TPath);
+
+  FNum = FreeFile();
+
+  // --- On Error GoTo CopyEH
+  FNum = fopen(TPath, "wb");
+  FILE_PUT(FNum, -1, &MaxX, sizeof(MaxX));
+  FILE_PUT(FNum, -1, &MaxY, sizeof(MaxY));
+  FILE_PUT(FNum, -1, &SelectionData, sizeof(SelectionData));
+  fclose(FNum);
+  SelectionData = REDIM_1D(sizeof(byte), 0, 1 - 1);
+  return;
+
+CopyEH:
+  Beep();
+}
+
+void Marker_Paste()
+{
+  int X, Y, MaxX, MaxY;
+  long Tmp;
+  char *TPath;
+  int FNum;
+
+  TPath = CAT(App.Path, "/Mpx.clp");
+  if (! FileExists(TPath))
+  {
+    Beep();
+    return;
+  }
+
+  FNum = FreeFile();
+
+  // --- On Error GoTo PasteEH
+  FNum = fopen(TPath, "rb");
+  FILE_GET(FNum, -1, &MaxX, sizeof(MaxX));
+  FILE_GET(FNum, -1, &MaxY, sizeof(MaxY));
+  SelectionData = REDIM_2D(sizeof(byte), 0, MaxX + 1 - 1, 0, MaxY + 1 - 1);
+  FILE_GET(FNum, -1, &SelectionData, sizeof(SelectionData));
+  fclose(FNum);
+  // --- On Error GoTo 0
+
+  SortData();
+  if (Marker_Get_Width() <= MaxX)
+    MaxX = Marker_Get_Width() - 1;
+
+  if (Marker_Get_Height() <= MaxY)
+    MaxY = Marker_Get_Height() - 1;
+
+  for (Y = 0; Y <= MaxY; Y++)
+  {
+    for (X = 0; X <= MaxX; X++)
+    {
+      Tmp = FieldWidth * (YMin + Y) + XMin + X;
+
+      // --- On Error GoTo PasteEH
+      DisPlayField[Tmp] = SelectionData[X, Y];
+      PlayField16[Tmp] = UnEdSprite(SelectionData[X, Y]);
+      // --- On Error GoTo 0
+
+    }
+  }
+
+  Let_ModifiedFlag(True);
+PasteEH:
+  Beep();
+}
+
+static void Class_Initialize()
+{
+  mVisible = False;
+}