1 // ----------------------------------------------------------------------------
3 // ----------------------------------------------------------------------------
9 static void DrawFrame(int Delta);
10 static void ReStretch(float NewStretch);
11 static void picPane_Paint();
12 static void picViewPort_Resize();
16 static void CleanTempDir(char *TmpDir);
17 static void CountDown(long HalfSeconds, int bDisplayBar);
18 static void DrawFrame(int Delta);
19 static void DrawPauseLayer(long Layer);
20 static void FillFileList(char *Path);
21 static void FillLevelList(char *Path, int LevelIndex);
22 static void FocusTim_Timer();
23 static void Form_KeyDown(int KeyCode, int Shift);
24 static void Form_KeyUp(int KeyCode, int Shift);
25 static void Form_Paint();
26 static int GetFileNameToSave();
27 static long GetHwndFromTempFileName(char *TmpFile);
28 static char * GetMyTempFileName();
29 static void GetSettings();
30 static char * GetSpeedDescriptionFPS(currency FrameDelayUS);
31 static int GetSpeedIndex(long DelayUS);
32 static char * GetValidTempPath();
33 static long Get_LastOpenFilter();
34 static long Get_LastSaveFilter();
35 static int InitSpeeds();
36 static boolean InstanceStillRunning(char *TmpFile);
37 static void Let_LastOpenFilter(long NewVal);
38 static void Let_LastSaveFilter(long NewVal);
39 static void LoadKeyIndicators();
40 static void LoadMenus();
41 static void PanelTim_Timer();
42 static void ReStretch(float NewStretch);
43 static void RestoreFrame();
44 static boolean SaveAs();
45 static void SaveSettings();
46 static void SetScrollEdges();
47 static void UpdateDeltaT();
48 static void cmbFile_Click();
49 static void cmbFile_KeyDown(int KeyCode, int Shift);
50 static void cmbFile_KeyUp(int KeyCode, int Shift);
51 static void cmbLevel_Click();
52 static void cmbLevel_KeyUp(int KeyCode, int Shift);
53 static void cmblevel_KeyDown(int KeyCode, int Shift);
54 static void cmdPause_Click();
55 static void cmdPause_MouseUp(int Button, int Shift, float X, float Y);
56 static void cmdPlayAll_Click();
57 static void cmdPlayAll_MouseUp(int Button, int Shift, float X, float Y);
58 static void cmdPlayDemo_Click();
59 static void cmdPlayDemo_MouseUp(int Button, int Shift, float X, float Y);
60 static void cmdPlay_Click();
61 static void cmdPlay_MouseUp(int Button, int Shift, float X, float Y);
62 static void cmdRecordDemo_Click();
63 static void cmdRecordDemo_MouseUp(int Button, int Shift, float X, float Y);
64 static void cmdStop_Click();
65 static void cmdStop_MouseUp(int Button, int Shift, float X, float Y);
66 static void fpsTim_Timer();
67 static void menAbout_Click();
68 static void menAutoScroll_Click();
69 static void menBorder_Click();
70 static void menCopy_Click();
71 static void menEnOff_Click();
72 static void menEnOn_Click();
73 static void menExit_Click();
74 static void menFaster_Click();
75 static void menGravOff_Click();
76 static void menGravOn_Click();
77 static void menNewStd_Click();
78 static void menNew_Click();
79 static void menOpen_Click();
80 static void menOptions_Click();
81 static void menPanel_Click();
82 static void menPaste_Click();
83 static void menPause_Click();
84 static void menPlayAll_Click();
85 static void menPlayDemo_Click();
86 static void menPlay_Click();
87 static void menReRecordDemo_Click();
88 static void menRec_Click();
89 static void menRemSP_Click();
90 static void menRestoreBorder_Click();
91 static void menSaveAs_Click();
92 static void menSave_Click();
93 static void menSelectAll_Click();
94 static void menShowLInfo_Click();
95 static void menSlower_Click();
96 static void menSoundFX_Click();
97 static void menStretch_Click(int Index);
98 static void menToolTips_Click();
99 static void menTrim_Click();
100 static void menZonkOff_Click();
101 static void menZonkOn_Click();
102 static void picKeys_MouseUp(int Button, int Shift, float X, float Y);
103 static void picMenu_Click();
104 static void picPane_KeyDown(int KeyCode, int Shift);
105 static void picPane_KeyUp(int KeyCode, int Shift);
106 static void picPane_MouseDown(int Button, int Shift, float X, float Y);
107 static void picPane_MouseMove(int Button, int Shift, float X, float Y);
108 static void picPane_MouseUp(int Button, int Shift, float X, float Y);
109 static void picPane_Paint();
110 static void picViewPort_MouseUp(int Button, int Shift, float X, float Y);
111 static void picViewPort_Paint();
112 static void picViewPort_Resize();
116 void DrawField(int X, int Y);
117 void DrawFieldAnimated(int X, int Y);
118 void DrawFieldNoAnimated(int X, int Y);
121 // --- Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "COMDLG32.OCX"
122 // --- Begin VB.Form MainForm
123 // --- AutoRedraw = -1 'True // True
124 // --- Caption = "MegaPlex"
125 // --- ClientHeight = 5850
126 // --- ClientLeft = 2580
127 // --- ClientTop = 2205
128 // --- ClientWidth = 9285
129 // --- Icon = "MainForm.frx":0000
130 // --- LinkTopic = "Form1"
131 // --- ScaleHeight = 390
132 // --- ScaleMode = 3 'Pixel // Pixel
133 // --- ScaleWidth = 619
134 // --- Begin VB.Timer fpsTim
135 // --- Enabled = 0 'False // False
136 // --- Interval = 200
140 // --- Begin VB.Timer FocusTim
145 // --- Begin MSComDlg.CommonDialog cmDlg
148 // --- _ExtentX = 847
149 // --- _ExtentY = 847
150 // --- _Version = 393216
151 // --- CancelError = -1 'True // True
153 // --- Begin VB.Timer PanelTim
154 // --- Enabled = 0 'False // False
159 // --- Begin VB.Frame Panel
165 // --- Begin VB.CommandButton cmdPlay
166 // --- DisabledPicture = "MainForm.frx":0442
167 // --- DownPicture = "MainForm.frx":058C
170 // --- Picture = "MainForm.frx":06D6
171 // --- Style = 1 'Graphical // Graphical
173 // --- TabStop = 0 'False // False
177 // --- Begin VB.CommandButton cmdStop
178 // --- DisabledPicture = "MainForm.frx":0820
179 // --- DownPicture = "MainForm.frx":096A
180 // --- Enabled = 0 'False // False
183 // --- Picture = "MainForm.frx":0AB4
184 // --- Style = 1 'Graphical // Graphical
186 // --- TabStop = 0 'False // False
190 // --- Begin VB.CommandButton cmdPlayDemo
191 // --- DisabledPicture = "MainForm.frx":0BFE
192 // --- DownPicture = "MainForm.frx":0D48
193 // --- Enabled = 0 'False // False
196 // --- Picture = "MainForm.frx":0E92
197 // --- Style = 1 'Graphical // Graphical
199 // --- TabStop = 0 'False // False
203 // --- Begin VB.CommandButton cmdPause
204 // --- DisabledPicture = "MainForm.frx":0FDC
205 // --- DownPicture = "MainForm.frx":1126
206 // --- Enabled = 0 'False // False
209 // --- Picture = "MainForm.frx":1270
210 // --- Style = 1 'Graphical // Graphical
212 // --- TabStop = 0 'False // False
216 // --- Begin VB.CommandButton cmdRecordDemo
217 // --- DisabledPicture = "MainForm.frx":13BA
218 // --- DownPicture = "MainForm.frx":1504
221 // --- Picture = "MainForm.frx":164E
222 // --- Style = 1 'Graphical // Graphical
224 // --- TabStop = 0 'False // False
228 // --- Begin VB.ComboBox cmbFile
229 // --- BackColor = &H00000000&
230 // --- BeginProperty Font
231 // --- Name = "Fixedsys"
235 // --- Underline = 0 'False // False
236 // --- Italic = 0 'False // False
237 // --- Strikethrough = 0 'False // False
239 // --- ForeColor = &H00FF8080&
242 // --- Sorted = -1 'True // True
243 // --- Style = 2 'Dropdown List // Dropdown List
248 // --- Begin VB.ComboBox cmbLevel
249 // --- BackColor = &H00000000&
250 // --- BeginProperty Font
251 // --- Name = "Fixedsys"
255 // --- Underline = 0 'False // False
256 // --- Italic = 0 'False // False
257 // --- Strikethrough = 0 'False // False
259 // --- ForeColor = &H00FF8080&
262 // --- Sorted = -1 'True // True
263 // --- Style = 2 'Dropdown List // Dropdown List
268 // --- Begin VB.PictureBox picKeys
269 // --- BackColor = &H00008080&
270 // --- BorderStyle = 0 'None // None
273 // --- ScaleHeight = 22
274 // --- ScaleMode = 3 'Pixel // Pixel
275 // --- ScaleWidth = 22
277 // --- TabStop = 0 'False // False
280 // --- Begin VB.Shape shpKey
281 // --- FillColor = &H00008000&
282 // --- FillStyle = 0 'Solid // Solid
286 // --- Shape = 5 'Rounded Square // Rounded Square
291 // --- Begin VB.CommandButton cmdPlayAll
292 // --- Caption = "Play All Demos"
293 // --- Enabled = 0 'False // False
297 // --- TabStop = 0 'False // False
299 // --- Visible = 0 'False // False
302 // --- Begin VB.Shape shpProgress
303 // --- BackColor = &H00800000&
304 // --- BackStyle = 1 'Opaque // Opaque
308 // --- Visible = 0 'False // False
311 // --- Begin VB.Label lblStatus
312 // --- Alignment = 2 'Center // Center
313 // --- BorderStyle = 1 'Fixed Single // Fixed Single
314 // --- Caption = "MegaPlex"
315 // --- BeginProperty Font
316 // --- Name = "Fixedsys"
320 // --- Underline = 0 'False // False
321 // --- Italic = 0 'False // False
322 // --- Strikethrough = 0 'False // False
330 // --- Begin VB.Image Image2
333 // --- Picture = "MainForm.frx":1BD8
337 // --- Begin VB.Image Image1
340 // --- Picture = "MainForm.frx":1D22
344 // --- Begin VB.Label lblFps
345 // --- Alignment = 2 'Center // Center
346 // --- BackColor = &H00000000&
347 // --- BorderStyle = 1 'Fixed Single // Fixed Single
348 // --- BeginProperty Font
349 // --- Name = "Fixedsys"
353 // --- Underline = 0 'False // False
354 // --- Italic = 0 'False // False
355 // --- Strikethrough = 0 'False // False
357 // --- ForeColor = &H0000C0C0&
364 // --- Begin VB.Label lblInfoCount
365 // --- Alignment = 2 'Center // Center
366 // --- BackColor = &H00000000&
367 // --- BorderStyle = 1 'Fixed Single // Fixed Single
368 // --- BeginProperty Font
369 // --- Name = "Fixedsys"
373 // --- Underline = 0 'False // False
374 // --- Italic = 0 'False // False
375 // --- Strikethrough = 0 'False // False
377 // --- ForeColor = &H00FF8080&
384 // --- Begin VB.Label lblRedDiskCount
385 // --- Alignment = 2 'Center // Center
386 // --- BackColor = &H00000000&
387 // --- BorderStyle = 1 'Fixed Single // Fixed Single
388 // --- BeginProperty Font
389 // --- Name = "Fixedsys"
393 // --- Underline = 0 'False // False
394 // --- Italic = 0 'False // False
395 // --- Strikethrough = 0 'False // False
397 // --- ForeColor = &H000000FF&
404 // --- Begin VB.Label lblFrameCount
405 // --- Alignment = 2 'Center // Center
406 // --- BorderStyle = 1 'Fixed Single // Fixed Single
408 // --- BeginProperty Font
409 // --- Name = "Fixedsys"
413 // --- Underline = 0 'False // False
414 // --- Italic = 0 'False // False
415 // --- Strikethrough = 0 'False // False
424 // --- Begin VB.PictureBox picViewPort
425 // --- BorderStyle = 0 'None // None
428 // --- ScaleHeight = 169
429 // --- ScaleMode = 3 'Pixel // Pixel
430 // --- ScaleWidth = 265
432 // --- TabStop = 0 'False // False
435 // --- Begin VB.PictureBox picPane
436 // --- AutoSize = -1 'True // True
437 // --- BackColor = &H00000000&
438 // --- BorderStyle = 0 'None // None
442 // --- ScaleHeight = 109
443 // --- ScaleMode = 3 'Pixel // Pixel
444 // --- ScaleWidth = 129
449 // --- Begin VB.PictureBox picFrame
452 // --- ScaleHeight = 57
453 // --- ScaleMode = 3 'Pixel // Pixel
454 // --- ScaleWidth = 81
456 // --- TabStop = 0 'False // False
461 // --- Begin VB.Menu menFile
462 // --- Caption = "&File"
463 // --- Begin VB.Menu menNewStd
464 // --- Caption = "New S&tandard Level"
466 // --- Begin VB.Menu menNew
467 // --- Caption = "&New Level"
469 // --- Begin VB.Menu menDash5
472 // --- Begin VB.Menu menOpen
473 // --- Caption = "&Open"
475 // --- Begin VB.Menu menSave
476 // --- Caption = "&Save"
479 // --- Begin VB.Menu menSaveAs
480 // --- Caption = "Save &As ..."
482 // --- Begin VB.Menu menDash4
485 // --- Begin VB.Menu menExit
486 // --- Caption = "E&xit"
490 // --- Begin VB.Menu menEditMain
491 // --- Caption = "&Edit"
492 // --- Begin VB.Menu menEdit
493 // --- Caption = "&Edit Level"
495 // --- Begin VB.Menu menDash3
498 // --- Begin VB.Menu menCopy
499 // --- Caption = "&Copy"
502 // --- Begin VB.Menu menPaste
503 // --- Caption = "&Paste"
506 // --- Begin VB.Menu menTrim
507 // --- Caption = "&Trim"
510 // --- Begin VB.Menu menDash8
514 // --- Begin VB.Menu menSelectAll
515 // --- Caption = "Select &All"
518 // --- Begin VB.Menu menDash6
521 // --- Begin VB.Menu menRestoreBorder
522 // --- Caption = "Restore &border"
525 // --- Begin VB.Menu menSp
526 // --- Caption = "Special Port"
527 // --- Begin VB.Menu menGravOn
528 // --- Caption = "&Gravity On"
530 // --- Begin VB.Menu menZonkOn
531 // --- Caption = "Freeze &Zonks On"
533 // --- Begin VB.Menu menEnOn
534 // --- Caption = "Freeze &Enemies On"
536 // --- Begin VB.Menu menDash7
539 // --- Begin VB.Menu menGravOff
540 // --- Caption = "Gravity &Off"
542 // --- Begin VB.Menu menZonkOff
543 // --- Caption = "Freeze Zon&ks Off"
545 // --- Begin VB.Menu menEnOff
546 // --- Caption = "Freeze E&nemies Off"
548 // --- Begin VB.Menu menDash10
551 // --- Begin VB.Menu menRemSP
552 // --- Caption = "&Remove (Make Normal Port)"
556 // --- Begin VB.Menu menView
557 // --- Caption = "&View"
558 // --- Begin VB.Menu menZoom
559 // --- Caption = "&Zoom"
560 // --- Begin VB.Menu menStretch
561 // --- Caption = "0.25 : 1"
565 // --- Begin VB.Menu menBorder
566 // --- Caption = "Show &Border"
567 // --- Checked = -1 'True // True
569 // --- Begin VB.Menu menPanel
570 // --- Caption = "Show &Panel"
571 // --- Checked = -1 'True // True
573 // --- Begin VB.Menu menAutoScroll
574 // --- Caption = "&Autoscroll"
575 // --- Checked = -1 'True // True
577 // --- Begin VB.Menu menDash9
580 // --- Begin VB.Menu menShowLInfo
581 // --- Caption = "Show Level &Info"
584 // --- Begin VB.Menu menSound
585 // --- Caption = "&Sound"
586 // --- Begin VB.Menu menSoundFX
587 // --- Caption = "&FX"
589 // --- Begin VB.Menu menMusic
590 // --- Caption = "&Music"
591 // --- Enabled = 0 'False // False
594 // --- Begin VB.Menu menSpeed
595 // --- Caption = "Speed"
596 // --- Begin VB.Menu menSpeedPlay
597 // --- Caption = "Game play"
599 // --- Begin VB.Menu menPlaySpeed
604 // --- Begin VB.Menu menSpeedDemo
605 // --- Caption = "Demo playback"
606 // --- Begin VB.Menu menDemoSpeed
611 // --- Begin VB.Menu menSpeedDash
614 // --- Begin VB.Menu menFaster
615 // --- Caption = "Faster (Pg Up)"
617 // --- Begin VB.Menu menSlower
618 // --- Caption = "Slower (Pg Down)"
621 // --- Begin VB.Menu menRun
622 // --- Caption = "&Play"
623 // --- Begin VB.Menu menPlay
624 // --- Caption = "P&lay Game (Space)"
626 // --- Begin VB.Menu menPause
627 // --- Caption = "&Pause (P)"
628 // --- Enabled = 0 'False // False
630 // --- Begin VB.Menu menStop
631 // --- Caption = "&Stop (Q)"
632 // --- Enabled = 0 'False // False
634 // --- Begin VB.Menu menDash0
637 // --- Begin VB.Menu menRec
638 // --- Caption = "&Record Demo (Ctrl+R)"
640 // --- Begin VB.Menu menPlayDemo
641 // --- Caption = "Play &Demo (Ctrl+Space)"
643 // --- Begin VB.Menu menPlayAll
644 // --- Caption = "Play &All Demos"
647 // --- Begin VB.Menu menOptionsMain
648 // --- Caption = "&Options"
649 // --- Begin VB.Menu menOptions
650 // --- Caption = "&Options ..."
653 // --- Begin VB.Menu menHelp
654 // --- Caption = "Help"
655 // --- Begin VB.Menu menToolTips
656 // --- Caption = "Show &ToolTips"
658 // --- Begin VB.Menu menDash1
661 // --- Begin VB.Menu menAbout
662 // --- Caption = "&About MegaPlex"
667 // static char *VB_Name = "MainForm";
668 // static boolean VB_GlobalNameSpace = False;
669 // static boolean VB_Creatable = False;
670 // static boolean VB_PredeclaredId = True;
671 // static boolean VB_Exposed = False;
673 // --- Option Explicit
674 // --- Option Compare Text
676 long SetParent(long hWndChild, long hWndNewParent);
677 long SetWindowLong(long hWnd, long nIndex, long dwNewLong);
678 long GetWindowLong(long hWnd, long nIndex);
679 long GetTempPath(long nBufferLength, char *lpBuffer);
680 long GetWindowText(long hWnd, char *lpString, long cch);
682 #define GWL_STYLE ((-16))
683 #define WS_CHILD (0x40000000)
684 #define WS_POPUP (0x80000000)
686 // [UNCOMMENTED] Dim StretchWidth2&
690 long OSX, OSY, MDX, MDY;
695 boolean Loaded, DemosAvailable;
697 #define nSpeedCount (17)
698 int SpeedsByDelayUS[nSpeedCount + 1];
699 #define DefaultSpeedIndex (12)
701 currency LastTick, LastFrame;
704 const char *AppTitle = "MegaPlex";
708 static char *GetSpeedDescriptionFPS(currency FrameDelayUS)
710 static char *GetSpeedDescriptionFPS;
714 if (FrameDelayUS == 0)
716 GetSpeedDescriptionFPS = "Fastest possible";
717 return GetSpeedDescriptionFPS;
720 if (FrameDelayUS < 0)
722 GetSpeedDescriptionFPS = "! display (even faster)";
723 return GetSpeedDescriptionFPS;
726 FPS = 1000000 / FrameDelayUS;
727 GetSpeedDescriptionFPS = CAT(INT_TO_STR(FPS), " fps");
729 GetSpeedDescriptionFPS = CAT(GetSpeedDescriptionFPS, "(Default)");
731 return GetSpeedDescriptionFPS;
734 static int InitSpeeds()
736 static int InitSpeeds;
738 SpeedsByDelayUS[1] = -1; // no display
739 SpeedsByDelayUS[2] = 0; // fastest possible
740 SpeedsByDelayUS[3] = 1000000 / 700; // 700 fps
741 SpeedsByDelayUS[4] = 1000000 / 500; // 500 fps
742 SpeedsByDelayUS[5] = 1000000 / 350; // 350 fps
743 SpeedsByDelayUS[6] = 1000000 / 250; // 250 fps
744 SpeedsByDelayUS[7] = 1000000 / 200; // etc.
745 SpeedsByDelayUS[8] = 1000000 / 150;
746 SpeedsByDelayUS[9] = 1000000 / 100;
747 SpeedsByDelayUS[10] = 1000000 / 70;
748 SpeedsByDelayUS[11] = 1000000 / 50;
749 SpeedsByDelayUS[12] = 1000000 / 35; // default
750 SpeedsByDelayUS[13] = 1000000 / 25;
751 SpeedsByDelayUS[14] = 1000000 / 20;
752 SpeedsByDelayUS[15] = 1000000 / 10;
753 SpeedsByDelayUS[16] = 1000000 / 5;
754 SpeedsByDelayUS[17] = 1000000 / 1;
759 static int GetSpeedIndex(long DelayUS)
761 static int GetSpeedIndex;
767 MinIdx = DefaultSpeedIndex;
769 for (i = 1; i <= nSpeedCount; i++)
771 Diff = Abs(DelayUS - SpeedsByDelayUS[i]);
779 GetSpeedIndex = MinIdx;
781 return GetSpeedIndex;
784 static long Get_LastOpenFilter()
786 static long LastOpenFilter;
790 LastOpenFilter = s.Read("LastOpenFilter", 1);
792 return LastOpenFilter;
795 static void Let_LastOpenFilter(long NewVal)
799 SettingsObject_Save("LastOpenFilter", NewVal);
802 static long Get_LastSaveFilter()
804 static long LastSaveFilter;
808 LastSaveFilter = s.Read("LastSaveFilter", 1);
810 return LastSaveFilter;
813 static void Let_LastSaveFilter(long NewVal)
817 SettingsObject_Save("LastSaveFilter", NewVal);
822 static void CountDown(long HalfSeconds, int bDisplayBar)
830 long LeftPos, TopPos, RightPos, MaxWidth; // , MaxHeight&
832 dT = HalfSeconds * 500;
834 LeftPos = cmbFile.left;
835 TopPos = cmbFile.top - shpProgress.Height - cmbFile.top / 8;
836 RightPos = lblFrameCount.left + lblFrameCount.Width;
837 MaxWidth = RightPos - LeftPos;
838 // MaxHeight = lblFrameCount.Top - TopPos + lblFrameCount.Height + 4
841 shpProgress.Move(LeftPos, TopPos, 0); // , MaxHeight
842 shpProgress.Visible = True;
845 for (i = 1; i <= 200; i++)
852 shpProgress.Width = MaxWidth * i / 100;
856 k = MaxWidth * (i - 100) / 100;
857 shpProgress.Move(k, TopPos, RightPos - k);
861 T.DelayMS(Delta, False);
864 shpProgress.Visible = False;
873 static char *GetValidTempPath()
875 static char *GetValidTempPath;
880 GetValidTempPath = "";
882 TP = String(nSize, Chr(32));
883 L = GetTempPath(nSize, TP);
886 // buffer was too small, retry with a properly sized buffer:
888 TP = String(nSize, Chr(32));
889 L = GetTempPath(nSize, TP);
892 TP = SlashLess(left(TP, L));
893 if ((0 == L) || (! IsDir(TP)))
895 // no valid temp path can be retrieved from the system --> create our own
896 TP = CAT(WithSlash(App.Path), "Temp");
900 // --- On Error Resume Next
902 if (! IS_NOTHING(&Err, sizeof(Err)))
904 MESSAGE_BOX("an error occured"); // MsgBox "cannot create directory for temporary files " & TP, vbCritical, "MegaPlex - Error";
905 return GetValidTempPath;
908 // --- On Error GoTo 0
914 GetValidTempPath = TP;
916 return GetValidTempPath;
919 static char *GetMyTempFileName()
921 static char *GetMyTempFileName;
925 (char *)T = Hex(hWnd);
931 GetMyTempFileName = CAT("tmp0x", CAT((char *)T, ".mpx"));
933 return GetMyTempFileName;
936 static long GetHwndFromTempFileName(char *TmpFile)
938 static long GetHwndFromTempFileName;
945 GetHwndFromTempFileName = 0;
946 FN = StripFileName(TmpFile);
950 return GetHwndFromTempFileName;
953 NumString = right(FN, L - LP);
955 NumString = left(NumString, 8);
957 NumString = CAT("&H", NumString);
958 GetHwndFromTempFileName = Val(NumString);
960 return GetHwndFromTempFileName;
963 static void CleanTempDir(char *TmpDir)
967 MFN = GetMyTempFileName();
968 MayKill(CAT(WithSlash(TmpDir), MFN));
969 FN = Dir(CAT(WithSlash(TmpDir), "tmp0x*.mpx"));
972 if (STRING_IS_LIKE(FN, "tmp0x*.mpx"))
974 if (! InstanceStillRunning(FN))
975 MayKill(CAT(WithSlash(TmpDir), FN));
978 FN = Dir_Without_Args();
982 static boolean InstanceStillRunning(char *TmpFile)
984 static boolean InstanceStillRunning;
986 long OtherHwnd, nSize, L;
989 InstanceStillRunning = False;
990 OtherHwnd = GetHwndFromTempFileName(TmpFile);
992 Cap = String(nSize, Chr(32));
993 L = GetWindowText(OtherHwnd, Cap, nSize);
994 if ((L == 0) || (nSize < L))
995 return InstanceStillRunning;
997 if (STRING_IS_LIKE(Cap, CAT(AppTitle, "*")))
998 InstanceStillRunning = True;
1000 return InstanceStillRunning;
1010 printf("::: MainForm.c: DisplayLevel: %d, %d, %d\n",
1011 Loaded, LevelLoaded, bPlaying);
1027 if (! menBorder.Checked)
1034 printf("::: MainForm.c: DisplayLevel: [%ld, %ld, %ld, %ld]...\n",
1035 DisplayMinY, DisplayMaxY, DisplayMinX, DisplayMaxX);
1038 for (Y = DisplayMinY; Y <= DisplayMaxY; Y++)
1040 for (X = DisplayMinX; X <= DisplayMaxX; X++)
1042 DrawFieldNoAnimated(X, Y);
1046 for (Y = DisplayMinY; Y <= DisplayMaxY; Y++)
1048 for (X = DisplayMinX; X <= DisplayMaxX; X++)
1050 DrawFieldAnimated(X, Y);
1057 for (Y = DisplayMinY; Y <= DisplayMaxY; Y++)
1059 for (X = DisplayMinX; X <= DisplayMaxX; X++)
1069 static void cmbFile_Click()
1071 CurPath = CAT(StripDir(OrigPath), CAT("/", cmbFile.List(cmbFile.ListIndex)));
1073 FillLevelList(CurPath, LevelNumber);
1074 if (STRING_IS_LIKE(OrigPath, "*.mpx") || STRING_IS_LIKE(OrigPath, "*.sp"))
1076 menSave.Enabled = True;
1080 menSave.Enabled = False;
1084 static void cmbFile_KeyDown(int KeyCode, int Shift)
1086 picPane_KeyDown(KeyCode, Shift);
1089 static void cmbFile_KeyUp(int KeyCode, int Shift)
1091 picPane_KeyUp(KeyCode, Shift);
1094 static int GetFileNameToSave()
1096 static int GetFileNameToSave;
1100 (char *)T = StripFileName(OrigPath);
1101 if (STRING_IS_LIKE(T, "*.dat") || STRING_IS_LIKE(T, "*.d##"))
1103 T = "Level" & Format(LevelNumber, "#000");
1106 GetFileNameToSave = T;
1108 return GetFileNameToSave;
1111 static void cmbLevel_Click()
1116 static long LastIndex = 0;
1117 static boolean bBlock = False;
1122 // //////////////////////////////////////////////////////////////////
1127 Msg = "Save changes to " & GetFileNameToSave() & " ?";
1128 Res = MsgBox(Msg, vbYesNoCancel, AppTitle & " - close level");
1129 if (Res == vbCancel) // fallback
1133 // --- On Error Resume Next
1134 cmbLevel.ListIndex = LastIndex;
1135 // --- On Error GoTo 0
1138 Debug.Assert cmbLevel.ListIndex = LastIndex;
1145 // oldCurPath = CurPath
1146 if (FileExists(OrigPath) && menSave.Enabled)
1152 if (! SaveAs()) // fallback
1156 // --- On Error Resume Next
1157 cmbLevel.ListIndex = LastIndex;
1158 // --- On Error GoTo 0
1161 Debug.Assert cmbLevel.ListIndex = LastIndex;
1166 // CurPath = oldCurPath
1169 Let_ModifiedFlag(False);
1173 // //////////////////////////////////////////////////////////////////
1175 LevelNumber = cmbLevel.ListIndex + 1;
1179 Oldflag = NoDisplayFlag;
1180 NoDisplayFlag = False;
1181 subFetchAndInitLevel();
1182 if ((0 < SignatureDelay) && ! (WindowState == vbMinimized))
1184 Msg = LInfo.LevelTitle & vbNewLine & "(" & FieldWidth & " x " & FieldHeight & ")";
1185 if (DemoAvailable && bSignatureAvailable)
1186 Msg = Msg & vbNewLine & vbNewLine & gSignature;
1188 SignatureForm.Signature = Msg;
1189 SignatureForm.DelayMS = SignatureDelay;
1192 X = left + (Width - SignatureForm.Width) / 2;
1193 Y = top + (Height - SignatureForm.Height) / 2;
1194 SignatureForm.Move X, Y;
1195 SignatureForm.Show vbModeless, Me;
1199 lblStatus = "MegaPlex";
1200 lblFrameCount = GetTotalFramesOfDemo();
1207 NoDisplayFlag = Oldflag;
1208 LastIndex = cmbLevel.ListIndex;
1212 menPlayDemo.Enabled = DemoAvailable;
1213 cmdPlayDemo.Enabled = DemoAvailable;
1216 static void cmblevel_KeyDown(int KeyCode, int Shift)
1218 if (GameLoopRunning != 0)
1224 if (menPlay.Enabled == True)
1230 picPane_KeyDown(KeyCode, Shift);
1235 static void cmbLevel_KeyUp(int KeyCode, int Shift)
1237 picPane_KeyUp(KeyCode, Shift);
1240 static void cmdPause_Click()
1245 static void cmdPause_MouseUp(int Button, int Shift, float X, float Y)
1247 FocusTim.Enabled = True;
1250 static void cmdPlay_Click()
1252 if (menPlay.Enabled)
1256 static void cmdPlay_MouseUp(int Button, int Shift, float X, float Y)
1258 FocusTim.Enabled = True;
1261 static void cmdPlayAll_Click()
1266 static void cmdPlayAll_MouseUp(int Button, int Shift, float X, float Y)
1268 FocusTim.Enabled = True;
1271 static void cmdPlayDemo_Click()
1273 menPlayDemo_Click();
1276 static void cmdPlayDemo_MouseUp(int Button, int Shift, float X, float Y)
1278 FocusTim.Enabled = True;
1281 static void cmdRecordDemo_Click()
1287 static void cmdRecordDemo_MouseUp(int Button, int Shift, float X, float Y)
1289 FocusTim.Enabled = True;
1292 static void cmdStop_Click()
1294 if (menStop.Enabled)
1298 static void cmdStop_MouseUp(int Button, int Shift, float X, float Y)
1300 FocusTim.Enabled = True;
1303 static void FocusTim_Timer()
1305 FocusTim.Enabled = False;
1307 // --- On Error Resume Next
1311 static void Form_KeyDown(int KeyCode, int Shift)
1313 picPane_KeyDown(KeyCode, Shift);
1316 static void Form_KeyUp(int KeyCode, int Shift)
1318 picPane_KeyUp(KeyCode, Shift);
1337 // FMark = New MarkerObject; // (handle this later, if needed)
1344 TmpPath = GetValidTempPath();
1348 CleanTempDir(TmpPath);
1349 TmpPath = CAT(WithSlash(TmpPath), GetMyTempFileName());
1353 InitDirectX(hWnd, picPane.hWnd);
1355 // AllowRedDiskCheat = 1
1356 MpxBmp = CAT(App.Path, "/mpx.bmp");
1357 // // Set NormalSprites = New DDSpriteBuffer // (handle this later, if needed)
1358 // NormalSprites.CreateFromFile MPXBMP, 16, 16
1360 Field = REDIM_2D(sizeof(int), 0, 2 + 1 - 1, 0, 2 + 1 - 1);
1362 picViewPort.ScaleMode = vbPixels;
1383 LoadKeyIndicators();
1387 FillFileList(CurPath);
1388 if (s.Read("ShowSplash", True))
1390 // frmSplash.EnableTimer
1391 frmSplash.Show vbModal, Me;
1399 static void FillLevelList(char *Path, int LevelIndex)
1401 long FNum, LevLen, i, iMax;
1405 if (! FileExists(Path))
1408 if ((STRING_IS_LIKE(Path, "*.D??")) || (STRING_IS_LIKE(Path, "*.sp")))
1412 FNum = fopen(Path, "rb");
1415 FILE_GET(FNum, (long)1441 + i * LevLen, &LInfo, sizeof(LInfo));
1416 cmbLevel.AddItem Format(i + 1, "#000") & " " & LInfo.LevelTitle, i;
1417 if (STRING_IS_LIKE(Path, "*.D??"))
1419 while (!(EOF(FNum)))
1422 FILE_GET(FNum, (long)1441 + i * LevLen, &LInfo, sizeof(LInfo));
1426 cmbLevel.AddItem Format(i + 1, "#000") & " " & LInfo.LevelTitle, i;
1430 if (LevelIndex <= i && 0 < LevelIndex)
1435 cmbLevel.ListIndex = i;
1439 else if (STRING_IS_LIKE(Path, "*.mpx"))
1443 FNum = fopen(Path, "rb");
1448 for (i = 1; i <= LevelCount; i++)
1450 if (! MpxLoadLInfo(CInt(i)))
1453 cmbLevel.AddItem Format(i, "#000") & " " & LInfo.LevelTitle, i - 1;
1459 if (LevelIndex < i && 0 < LevelIndex)
1464 if (i < cmbLevel.ListCount)
1465 cmbLevel.ListIndex = i;
1472 static void FillFileList(char *Path)
1474 long FNum, LevLen, i;
1476 char *TFile, *TPath, *OFile;
1481 TPath = WithSlash(StripDir(Path));
1482 OFile = StripFileName(Path);
1483 TFile = Dir(TPath & "*.D??");
1486 if (FileLen(TPath & TFile) == 170496)
1488 cmbFile.AddItem TFile;
1494 TFile = Dir(TPath & "*.SP");
1497 nDemoCount = nDemoCount + 1;
1498 cmbFile.AddItem TFile;
1502 TFile = Dir(TPath & "*.mpx");
1505 nDemoCount = nDemoCount + 1;
1506 cmbFile.AddItem TFile;
1510 i = cmbFile.ListCount - 1;
1511 if (0 < cmbFile.ListCount)
1515 if ((cmbFile.List(i) Like OFile) || i == 0)
1522 cmbFile.ListIndex = i;
1525 DemosAvailable = (1 < nDemoCount);
1526 menPlayAll.Enabled = DemosAvailable;
1527 cmdPlayAll.Enabled = DemosAvailable;
1530 static void LoadMenus()
1535 menFaster.Enabled = False;
1536 menSlower.Enabled = False;
1538 for (i = 1; i <= nSpeedCount; i++)
1542 Load menPlaySpeed(i);
1543 Load menDemoSpeed(i);
1546 menPlaySpeed(i).Caption = GetSpeedDescriptionFPS(SpeedsByDelayUS[i]);
1547 menDemoSpeed(i).Caption = GetSpeedDescriptionFPS(SpeedsByDelayUS[i]);
1551 menStretch(1).Caption = Format(0.25, "#0.00") & ";
1553 if (Stretch == 0.25)
1554 menStretch(1).Checked = True;
1556 for (i = 2; i <= 20; i++)
1559 menStretch(i).Caption = Format(0.25 * i, "#0.00") & ";
1561 menStretch(i).Checked = ((i * 0.25) == Stretch);
1564 menSp.Enabled = False;
1568 // Function DisplayShift&()
1569 // Dim X&, Y&, A&, B&, iX&, iiX&, LD&
1572 // For A = 0 To picPane.ScaleWidth
1573 // For Y = DisplayMinY To DisplayMaxY
1574 // For X = DisplayMinX To DisplayMaxX
1575 // iX = StretchWidth * X + A
1576 // Sprite = Field(X, Y).SpritePos
1577 // If picPane.ScaleWidth < (iX + 1) Then
1578 // iX = iX - picPane.ScaleWidth
1580 // If picPane.ScaleWidth < (iX + 1 + BaseWidth) Then
1581 // iiX = iX - picPane.ScaleWidth
1582 // Sprites.BitBltSprite picPane.hdc, iiX, StretchWidth * Y, Sprite
1585 // Sprites.BitBltSprite picPane.hdc, iX, StretchWidth * Y, Sprite
1588 // DisplayShift = DisplayShift + 1
1593 static void Form_Paint()
1595 // Debug.Print "Form_Paint()"
1598 static void Form_Resize()
1603 if (WindowState == vbMinimized || ! Loaded)
1607 // NW = ScaleWidth - 2 * Space: If NW < 0 Then NW = 0
1608 // NH = ScaleHeight - 3 * Space - cmbLevel.Height: If NH < 0 Then NH = 0
1609 // picViewPort.Move Space, Space, NW, NH
1610 Tmp = (ShowPanel != 0 ? ScaleHeight - Panel.Height : ScaleHeight - Panel.Height);
1614 picViewPort.Move 0, 0, ScaleWidth, Tmp;
1615 // Tmp = 2 * Space + picViewPort.Height
1617 Panel.left = (ScaleWidth - Panel.Width) / 2;
1618 // 'cmdNormal.Top = 2 * Space + picViewPort.Height
1619 // cmbLevel.Top = Tmp
1620 // lblRedDiskCount.Top = Tmp
1621 // lblInfoCount.Top = Tmp
1622 // picKeys.Top = Tmp
1623 // lblFrameCount.Top = Tmp
1624 // cmdPlayAll.Top = Tmp
1629 static void DrawFrame(int Delta)
1631 int i, LX, tY, RX, BY;
1635 RX = FieldWidth - Delta;
1636 BY = FieldHeight - Delta;
1637 DrawSprite(LX, tY, posFrameCorner);
1638 DrawSprite(LX, BY, posFrameCorner);
1639 DrawSprite(RX, tY, posFrameCorner);
1640 DrawSprite(RX, BY, posFrameCorner);
1641 for (i = LX + 1; i <= RX - 1; i++)
1643 DrawSprite(i, tY, posFrameHorizontal);
1644 DrawSprite(i, BY, posFrameHorizontal);
1647 for (i = tY + 1; i <= BY - 1; i++)
1649 DrawSprite(LX, i, posFrameVertical);
1650 DrawSprite(RX, i, posFrameVertical);
1654 static void RestoreFrame()
1656 int i, LX, tY, RX, BY;
1660 RX = FieldWidth - 1;
1661 BY = FieldHeight - 1;
1662 for (i = LX; i <= RX; i++)
1668 for (i = tY + 1; i <= BY - 1; i++)
1677 static void Form_Unload(int Cancel)
1681 if (cmdPlayAll.STRING_IS_LIKE(Caption, "Quit*"))
1686 if (menEdit.Checked)
1694 Msg = "Save changes to " & GetFileNameToSave() & " ?";
1695 Res = MsgBox(Msg, vbYesNoCancel, AppTitle & " - closing");
1696 if (Res == vbCancel)
1704 if (FileExists(OrigPath) && menSave.Enabled)
1715 if (FileExists(TmpPath) || ModifiedFlag)
1721 ReleaseDirectDraw();
1726 static void fpsTim_Timer()
1729 static int count5 = 0;
1731 count5 = count5 + 1;
1734 TickDiff = T.TickDiffUS(LastTick);
1735 lblFps.Caption = CLng(Round((1000000 * (TimerVar - LastFrame)) / (TickDiff), 0));
1736 LastFrame = TimerVar;
1737 LastTick = T.TickNow();
1741 // If NoDisplayFlag Then lblFrameCount = TimerVar
1742 lblFrameCount = TimerVar;
1745 static void menAbout_Click()
1747 frmSplash.Show vbModal, Me;
1750 static void menAutoScroll_Click()
1753 menAutoScroll.Checked = ! menAutoScroll.Checked;
1754 AutoScrollFlag = menAutoScroll.Checked;
1758 static void menBorder_Click()
1760 if (menBorder.Checked)
1762 menBorder.Checked = False;
1764 DisplayMaxX = FieldWidth - 2;
1765 DisplayWidth = FieldWidth;
1767 DisplayMaxY = FieldHeight - 2;
1768 DisplayHeight = FieldHeight;
1769 if (Loaded && LevelLoaded)
1775 menBorder.Checked = True;
1777 DisplayMaxX = FieldWidth - 1;
1778 DisplayWidth = FieldWidth + 2;
1780 DisplayMaxY = FieldHeight - 1;
1781 DisplayHeight = FieldHeight + 2;
1782 if (Loaded && LevelLoaded)
1787 // DisplayLevel True
1792 void SetDisplayRegion()
1797 if (! menBorder.Checked)
1801 DisplayMaxX = FieldWidth - 2;
1802 DisplayWidth = FieldWidth;
1804 DisplayMaxY = FieldHeight - 2;
1805 DisplayHeight = FieldHeight;
1814 DisplayMaxX = FieldWidth - 1;
1815 DisplayWidth = FieldWidth + 2;
1817 DisplayMaxY = FieldHeight - 1;
1818 DisplayHeight = FieldHeight + 2;
1827 static void menCopy_Click()
1832 void menEdit_Click()
1836 if (menEdit.Checked)
1838 menEdit.Checked = False;
1845 FMark.ShowMarker False;
1846 picViewPort.MousePointer = 0;
1849 if (! STRING_IS_LIKE(CurPath, TmpPath))
1871 if (! STRING_IS_LIKE(CurPath, TmpPath))
1880 subFetchAndInitLevel();
1881 menEdit.Checked = True;
1884 // ScaleMode = vbTwips
1885 ToolBox.Move (Width - ToolBox.Width) / 2, Height - ToolBox.Height;
1886 // ScaleMode = vbPixels
1887 // L = GetWindowLong(ToolBox.hWnd, GWL_STYLE)
1888 // L = L And (Not WS_POPUP)
1889 // L = L Or WS_CHILD
1890 // SetWindowLong ToolBox.hWnd, GWL_STYLE, L
1891 // SetParent ToolBox.hWnd, hWnd
1892 ToolBox.Show vbModeless, Me;
1896 FMark.ShowMarker True;
1900 static void menEnOff_Click()
1902 menEnOn.Checked = False;
1903 menEnOff.Checked = True;
1908 static void menEnOn_Click()
1910 menEnOn.Checked = True;
1911 menEnOff.Checked = False;
1916 static void menExit_Click()
1921 static void menFaster_Click()
1927 Debug.Assert(False);
1931 if (DemoFlag != 0) // demoplayback
1933 i = GetSpeedIndex(DeltaTDemo);
1935 If i < 2 Then i = 2;
1936 menDemoSpeed_Click (i);
1940 i = GetSpeedIndex(DeltaTPlay);
1942 If i < 2 Then i = 2;
1943 menPlaySpeed_Click (i);
1947 static void menSlower_Click()
1953 Debug.Assert(False);
1957 if (DemoFlag != 0) // demoplayback
1959 i = GetSpeedIndex(DeltaTDemo);
1961 If nSpeedCount < i Then i = nSpeedCount;
1962 menDemoSpeed_Click (i);
1966 i = GetSpeedIndex(DeltaTPlay);
1968 If nSpeedCount < i Then i = nSpeedCount;
1969 menPlaySpeed_Click (i);
1973 void menPlaySpeed_Click(int Index)
1977 // If NoDisplayFlag And (GameLoopRunning <> 0) Then
1978 // NoDisplayFlag = False
1981 // NoDisplayFlag = False
1982 for (i = menPlaySpeed.LBound; i <= menPlaySpeed.UBound; i++)
1985 menPlaySpeed(i).Checked = (Index == i);
1989 BlockingSpeed = False;
1990 DeltaTPlay = SpeedsByDelayUS[Index];
1992 // If DeltaTPlay < 0 Then
1995 // NoDisplayFlag = True
1999 void menDemoSpeed_Click(int Index)
2003 // If NoDisplayFlag And (GameLoopRunning <> 0) Then
2004 // NoDisplayFlag = False
2007 NoDisplayFlag = False;
2008 for (i = menDemoSpeed.LBound; i <= menDemoSpeed.UBound; i++)
2011 menDemoSpeed(i).Checked = (Index == i);
2015 BlockingSpeed = False;
2016 DeltaTDemo = SpeedsByDelayUS[Index];
2018 // If DeltaTPlay < 0 Then
2021 // NoDisplayFlag = True
2025 static void UpdateDeltaT()
2030 DeltaT = (DemoFlag != 0 ? DeltaTDemo : DeltaTDemo);
2035 NoDisplayFlag = True;
2039 if (NoDisplayFlag && GameLoopRunning != 0)
2041 NoDisplayFlag = False;
2046 NoDisplayFlag = False;
2051 static void menGravOff_Click()
2053 menGravOn.Checked = False;
2054 menGravOff.Checked = True;
2059 static void menGravOn_Click()
2061 menGravOn.Checked = True;
2062 menGravOff.Checked = False;
2067 static void menNew_Click()
2069 NewForm.Show vbModal, Me;
2070 CreateLevel(FieldWidth, FieldHeight);
2074 static void menNewStd_Click()
2076 CreateLevel(60, 24);
2080 static void menOpen_Click()
2085 // cmDlg.DefaultExt = "sp"
2089 (prevent compiler warning here due to suspected use of trigraph)
2091 cmDlg.Filter = "All Levels (*.DAT;*.D??;*.sp;*.mpx)|*.DAT;*.D??;*.sp;*.mpx|MegaPlex Levels (*.mpx)|*.mpx" & "|Supaplex Level Sets (*.DAT;*.D??)|*.DAT;*.D??|SpeedFix Demos (*.sp)|*.sp";
2094 LFilt = LastOpenFilter;
2095 cmDlg.FilterIndex = (0 < LFilt & LFilt < 5 ? LFilt : LFilt);
2096 if (FileExists(CurPath))
2097 cmDlg.InitDir = WithSlash(StripDir(CurPath));
2099 cmDlg.flags = cdlOFNHideReadOnly | cdlOFNLongNames;
2102 // --- On Error GoTo menOpenEH
2104 // --- On Error GoTo 0
2106 LFilt = cmDlg.FilterIndex;
2107 LastOpenFilter = LFilt;
2108 CurPath = cmDlg.FileName;
2110 FillFileList (CurPath);
2115 static void menOptions_Click()
2119 oFrm.Show vbModal, Me;
2121 picViewPort_Resize();
2124 static void menPanel_Click()
2127 PanelVisible = ! menPanel.Checked;
2131 void Let_PanelVisible(boolean NewVal)
2133 static boolean HidePanel = False;
2135 if (HidePanel != NewVal)
2138 HidePanel = ! NewVal;
2139 PanelTim.Enabled = True;
2142 static void DrawPauseLayer(long Layer)
2144 DirectDrawPalette Pal;
2149 // For Y = 0 To bmpStage.Height Step BaseWidth
2150 // For X = 0 To bmpStage.Width Step BaseWidth
2151 // Pause.TransparentDraw bmpStageHDC, X, Y, Layer
2154 // With Stage.Surface
2155 // Set Pal = .GetPalette
2156 // for i=1 to pal.GetEntries(
2157 // Stage.Surface.SetPalette
2160 static void menPaste_Click()
2167 static void menPause_Click()
2169 static StdPicture OldPic;
2170 static char *OldText = 0;
2172 PauseMode = (PauseMode != 0 ? 0 : 0);
2175 if (IS_NOTHING(&OldPic, sizeof(OldPic)))
2176 OldPic = cmdPause.Picture;
2178 cmdPause.Picture = cmdPause.DownPicture;
2179 OldText = lblStatus.Caption;
2180 lblStatus = "Paused ...";
2184 cmdPause.Picture = OldPic;
2185 lblStatus.Caption = OldText;
2189 static void menPlayAll_Click()
2193 char *LogPath, *OutStr, *ReRecPath, *SPPath;
2195 static boolean QuitFlag = False;
2197 if (cmdPlayAll.STRING_IS_LIKE(Caption, "Play) All Demos")
2199 cmdPlayAll.Caption = "Quit All";
2200 menPlayAll.Caption = "Quit All";
2201 FocusTim.Enabled = True;
2204 iMax = cmbFile.ListCount - 1;
2205 LogPath = StripDir(CurPath) & "/Error.Log";
2206 if (Dir(LogPath) != "")
2209 for (i = iMin; i <= iMax; i++)
2211 cmbFile.ListIndex = i;
2212 // If CurPath Like "*.sp" Or CurPath Like "*.mpx" Then
2216 ReRecPath = SPPath & ".ReRec";
2217 menPlayDemo_Click();
2219 // bEqual = FilesEqual(ReRecPath, SPPath)
2220 // If bEqual Then MayKill ReRecPath
2222 OutStr = cmbFile.List(i) & " -> ";
2224 if (Val(lblFrameCount) != GetTotalFramesOfDemo())
2226 OutStr = OutStr & "Error in GetTotalFramesOfDemo()! ";
2227 Debug.Assert(False);
2231 if ((LevelStatus == 1) && bEqual)
2233 OutStr = OutStr & "Success";
2237 OutStr = OutStr & "All Demos (float)Canceled";
2241 if (LevelStatus != 1)
2243 OutStr = OutStr & "### Level Failed ### (TimerVar == " & TimerVar & ")";
2248 OutStr = OutStr & "### ReRecording is binary different ###";
2253 FNum = fopen(LogPath, "ab");
2254 Print #FNum, OutStr;
2261 cmdPlayAll.Caption = "Play All Demos";
2262 menPlayAll.Caption = "Play All Demos";
2263 SettingsObject Settings;
2265 MySignature = Settings.Read("MySignature", "");
2266 FirstDemoByte = 0x81;
2271 if (menStop.Enabled)
2276 static void menRemSP_Click()
2282 static void menRestoreBorder_Click()
2287 static void menSave_Click()
2292 if (STRING_IS_LIKE(CurPath, TmpPath))
2295 if (STRING_IS_LIKE(CurPath, "") || STRING_IS_LIKE(CurPath, "*.dat"))
2301 if (STRING_IS_LIKE(CurPath, "*.sp"))
2307 if (! FileExists(CurPath) || STRING_IS_LIKE(CurPath, "Untitled"))
2314 Let_ModifiedFlag(False);
2317 static void menSaveAs_Click()
2320 FillFileList (CurPath);
2323 static boolean SaveAs()
2325 static boolean SaveAs;
2332 // cmDlg.DefaultExt = "sp"
2333 cmDlg.Filter = "MegaPlex Level (*.mpx)|*.mpx|SpeedFix Demo (*.sp)|*.sp";
2334 cmDlg.FilterIndex = LastSaveFilter;
2335 // If OrigPath Like "*.sp" Then cmDlg.FilterIndex = 1 Else cmDlg.FilterIndex = 0
2336 if (FileExists(OrigPath))
2338 cmDlg.InitDir = WithSlash(StripDir(OrigPath));
2339 cmDlg.InitDir = s.Read("LastSaveDir", cmDlg.InitDir);
2340 cmDlg.FileName = StripExtensionlessFileName(GetFileNameToSave());
2343 cmDlg.flags = cdlOFNHideReadOnly | cdlOFNLongNames;
2346 // --- On Error GoTo SaveAsEH
2348 // --- On Error GoTo 0
2350 LastSaveFilter = cmDlg.FilterIndex;
2351 FN = cmDlg.FileName;
2352 SettingsObject_Save("LastSaveDir", WithSlash(StripDir(FN)));
2353 if (STRING_IS_LIKE(FN, "*.sp"))
2357 else if (STRING_IS_LIKE(FN, "*.mpx"))
2362 Let_ModifiedFlag(False);
2370 static void menSelectAll_Click()
2372 FMark.SetPoint1 0, 0;
2373 FMark.SetPoint2 FieldWidth - 1, FieldHeight - 1;
2376 static void menShowLInfo_Click()
2380 Msg = LInfo.LevelTitle & vbNewLine & "(" & FieldWidth & " x " & FieldHeight & ")";
2381 if (DemoAvailable && bSignatureAvailable)
2382 Msg = Msg & vbNewLine & vbNewLine & gSignature;
2384 SignatureForm.Signature = Msg;
2385 SignatureForm.DelayMS = 5000;
2388 X = left + (Width - SignatureForm.Width) / 2;
2389 Y = top + (Height - SignatureForm.Height) / 2;
2390 SignatureForm.Move X, Y;
2391 SignatureForm.Show vbModeless, Me;
2395 static void menSoundFX_Click()
2398 menSoundFX.Checked = ! menSoundFX.Checked;
2399 FXOnFlag = (menSoundFX.Checked ? -1 : -1);
2405 // static void menPlay_Click()
2406 void menPlay_Click()
2410 boolean OldEditFlag;
2412 // Trace "MainForm", "--> menPlay_Click()"
2419 SignatureForm.DelayMS = 1;
2420 menPlay.Enabled = False;
2421 menPause.Enabled = True;
2422 menStop.Enabled = True;
2423 cmdPlay.Enabled = False;
2424 cmdPause.Enabled = True;
2425 cmdStop.Enabled = True;
2426 cmdPlayDemo.Enabled = False;
2427 menPlayDemo.Enabled = False;
2428 cmdRecordDemo.Enabled = False;
2429 menRec.Enabled = False;
2430 menFaster.Enabled = True;
2431 menSlower.Enabled = True;
2432 if (cmdPlayAll.STRING_IS_LIKE(Caption, "Play*"))
2434 cmdPlayAll.Enabled = False;
2435 menPlayAll.Enabled = False;
2438 cmbFile.Enabled = False;
2439 cmbLevel.Enabled = False;
2440 OldEditFlag = EditFlag;
2444 menEditMain.Enabled = False;
2445 if (DemoFlag == 0 && RecordDemoFlag == 0)
2446 lblStatus = "Playing";
2454 LastTick = T.TickNow();
2459 fpsTim.Enabled = True;
2472 subFetchAndInitLevelB();
2478 // Trace "MainForm", "CountDown 1"
2479 CountDown(2, (0 == DemoFlag));
2480 // Trace "MainForm", "Call GoPlay"
2484 // Trace "MainForm", "GoPlay returned"
2488 if (LevelStatus == 1)
2490 lblStatus = "(float)Success";
2494 lblStatus = "Try (float)again";
2499 // Trace "MainForm", "CountDown 1"
2500 CountDown(1, False);
2508 // Trace "MainForm", "Call subFetchAndInitLevel"
2510 subFetchAndInitLevel();
2512 // Trace "MainForm", "subFetchAndInitLevel returned"
2518 menEditMain.Enabled = True;
2522 // Trace "MainForm", "<-- menPlay_Click()"
2530 static void menPlayDemo_Click()
2534 lblStatus = "Demo Playback";
2536 if (LevelStatus != 1)
2537 lblStatus = "Demo Failed";
2542 static void menRec_Click()
2544 Trace("MainForm", "--> menRec_Click()");
2553 lblStatus.ForeColor = vbRed;
2554 lblStatus = "Recording Demo";
2555 // DemoBuffer = New DemoBufferObject; // (handle this later, if needed)
2556 Debug.Assert(! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)));
2557 Trace("MainForm", "Call menPlayClick");
2559 Trace("MainForm", "menPlayClick returned");
2561 lblStatus.ForeColor = vbButtonText;
2563 Let_ModifiedFlag(True);
2564 if (! STRING_IS_LIKE(CurPath, TmpPath))
2570 LInfo.DemoRandomSeed = RecDemoRandomSeed;
2571 Trace("MainForm", "Call SaveMPX(TmpPath)");
2573 Trace("MainForm", "Set DemoBuffer == Nothing");
2574 SET_TO_NOTHING(&DemoBuffer, sizeof(DemoBuffer));
2575 Trace("MainForm", "Call subFetchAndInitLevel");
2576 subFetchAndInitLevel();
2577 cmdPlayDemo.Enabled = DemoAvailable;
2578 Trace("MainForm", "<-- menRec_Click()");
2581 static void menReRecordDemo_Click()
2591 lblStatus.ForeColor = vbRed;
2592 lblStatus = "ReRecording Demo";
2593 // DemoBuffer = New DemoBufferObject; // (handle this later, if needed)
2594 Debug.Assert(! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)));
2596 lblStatus.ForeColor = vbButtonText;
2598 Let_ModifiedFlag(True);
2599 if (! STRING_IS_LIKE(CurPath, TmpPath))
2605 LInfo.DemoRandomSeed = RecDemoRandomSeed;
2607 SET_TO_NOTHING(&DemoBuffer, sizeof(DemoBuffer));
2608 subFetchAndInitLevel();
2611 void menStop_Click()
2618 fpsTim.Enabled = False;
2620 lblFps.Caption = "";
2621 menRec.Enabled = True;
2622 menPlay.Enabled = True;
2623 menPause.Enabled = False;
2624 menStop.Enabled = False;
2625 cmdPlay.Enabled = True;
2626 cmdPause.Enabled = False;
2627 cmdStop.Enabled = False;
2628 cmdRecordDemo.Enabled = True;
2629 cmdPlayDemo.Enabled = DemoAvailable;
2630 cmdPlayAll.Enabled = DemosAvailable;
2631 menPlayDemo.Enabled = DemoAvailable;
2632 menPlayAll.Enabled = DemosAvailable;
2633 menFaster.Enabled = False;
2634 menSlower.Enabled = False;
2635 cmbFile.Enabled = True;
2636 cmbLevel.Enabled = True;
2639 static void menStretch_Click(int Index)
2641 ReStretch(0.25 * Index);
2642 // DisplayLevel True
2645 static void menToolTips_Click()
2648 menToolTips.Checked = ! menToolTips.Checked;
2649 if (menToolTips.Checked)
2651 cmdPlay.ToolTipText = "Play Game (Space)";
2652 cmdPause.ToolTipText = "Pause (P)";
2653 cmdStop.ToolTipText = "Stop (Q)";
2654 cmdPlayDemo.ToolTipText = "Play demo (Ctrl+Space)";
2655 cmdRecordDemo.ToolTipText = "Record demo (Ctrl+R)";
2656 lblInfoCount.ToolTipText = "Number of infotrons needed";
2657 lblRedDiskCount.ToolTipText = "Number of red disks";
2658 cmbLevel.ToolTipText = "List of all levels in the file";
2659 cmbFile.ToolTipText = "List of files in current directory";
2660 lblFps.ToolTipText = "Animation speed in fps";
2661 lblFrameCount.ToolTipText = "Game time in frames";
2665 cmdPlay.ToolTipText = "";
2666 cmdPause.ToolTipText = "";
2667 cmdStop.ToolTipText = "";
2668 cmdPlayDemo.ToolTipText = "";
2669 cmdRecordDemo.ToolTipText = "";
2670 lblInfoCount.ToolTipText = "";
2671 lblRedDiskCount.ToolTipText = "";
2672 cmbLevel.ToolTipText = "";
2673 cmbFile.ToolTipText = "";
2674 lblFps.ToolTipText = "";
2675 lblFrameCount.ToolTipText = "";
2681 static void menTrim_Click()
2686 OldOPath = OrigPath;
2688 Tmp.SpecialPortCount = 0; // hack: all special ports are deleted
2690 CreateLevel(FMark.Width, FMark.Height);
2692 OrigPath = OldOPath;
2694 menSelectAll_Click();
2696 picViewPort_Resize();
2699 static void menZonkOff_Click()
2701 menZonkOn.Checked = False;
2702 menZonkOff.Checked = True;
2707 static void menZonkOn_Click()
2709 menZonkOn.Checked = True;
2710 menZonkOff.Checked = False;
2715 static void PanelTim_Timer()
2720 if (PanelSeq < Panel.Height && -1 < PanelSeq)
2722 PanelSeq = (ShowPanel != 0 ? PanelSeq + 2 : PanelSeq + 2);
2723 Tmp = ScaleHeight - Tmp + PanelSeq;
2725 picViewPort.Height = Tmp;
2729 PanelTim.Enabled = False;
2730 PanelSeq = (PanelSeq < 0 ? 0 : 0);
2731 ShowPanel = (ShowPanel == 0 ? 1 : 1);
2732 menPanel.Checked = (ShowPanel != 0);
2736 static void picKeys_MouseUp(int Button, int Shift, float X, float Y)
2738 FocusTim.Enabled = True;
2741 static void picMenu_Click()
2745 static void picPane_KeyDown(int KeyCode, int Shift)
2747 if (KeyCode < 0 || 255 < KeyCode)
2750 KeyState[KeyCode] = True;
2754 if (MouseButton == 0 && EditFlag)
2755 picPane.MousePointer = 15;
2773 if (DemoFlag != 0 && 2 == Shift)
2782 bCapturePane = ! bCapturePane;
2787 static void picPane_KeyUp(int KeyCode, int Shift)
2789 if (KeyCode < 0 || 255 < KeyCode)
2792 KeyState[KeyCode] = False;
2796 if (menFaster.Enabled)
2802 if (menSlower.Enabled)
2808 if (2 == Shift) // ctrl+space
2810 if (menPlayDemo.Enabled)
2811 menPlayDemo_Click();
2816 if (menPlay.Enabled)
2823 if (menStop.Enabled)
2836 if (menPause.Enabled && (Shift == 0))
2842 if (MouseButton == 0 && EditFlag)
2843 picPane.MousePointer = 0;
2848 static void picPane_MouseDown(int Button, int Shift, float X, float Y)
2852 MouseButton = Button;
2853 OldEdMode = EditMode;
2856 if (Button == 2 && Shift != 2)
2858 EditMode = edSelect;
2876 picPane.MousePointer = 5; // size
2877 UserDragFlag = True;
2881 SetField(X, Y, ToolBox.ASpriteIndex);
2885 FMark.SetPoint1 EdGetX(X), EdGetY(Y);
2890 EditMode = OldEdMode;
2893 static void picPane_MouseMove(int Button, int Shift, float X, float Y)
2898 OldEdMode = EditMode;
2901 if (EditFlag && Button == 2 && Shift != 2)
2903 EditMode = edSelect;
2917 Oldflag = NoDisplayFlag;
2918 NoDisplayFlag = False;
2919 ScrollTo(OSX - X + MDX, OSY - Y + MDY);
2921 NoDisplayFlag = Oldflag;
2925 SetField(X, Y, ToolBox.ASpriteIndex);
2929 FMark.SetPoint2 EdGetX(X), EdGetY(Y);
2934 EditMode = OldEdMode;
2937 static void picPane_MouseUp(int Button, int Shift, float X, float Y)
2939 MouseButton = MouseButton ^ Button;
2940 picPane.MousePointer = 0;
2941 UserDragFlag = False;
2942 if (menEditMain.Enabled && Button == 2)
2944 if (MDX == X && MDY == Y)
2945 PopupMenu menEditMain;
2951 static void picPane_Paint()
2955 Oldflag = NoDisplayFlag;
2956 NoDisplayFlag = False;
2958 NoDisplayFlag = Oldflag;
2961 static void ReStretch(float NewStretch)
2966 long BW2, LW, LH, i;
2970 printf("::: MainForm.c: ReStretch: %d, %d\n", Loaded, LevelLoaded);
2976 printf("::: NewStretch == %f\n", NewStretch);
2979 Stretch = NewStretch;
2985 SET_TO_NOTHING(&Stage, sizeof(Stage));
2986 SET_TO_NOTHING(&StretchedSprites, sizeof(StretchedSprites));
2987 menStretch(Stretch / 0.25).Checked = False;
2990 Stretch = NewStretch;
2993 menStretch(Stretch / 0.25).Checked = True;
2994 // StretchWidth = BaseWidth ' * NewStretch
2995 // StretchWidth2 = StretchWidth \ 2
2996 // TwoPixels = 2 '* Stretch
2997 // StretchLoad Sprites, imgMpx.Picture, 16, 16
3000 BW2 = StretchWidth / 2;
3001 LW = (FieldWidth + 2) * BaseWidth; // StretchWidth
3002 LH = (FieldHeight + 2) * BaseWidth; // StretchWidth
3005 // i = bmpStage.CreateAtSize(LW, LH)
3006 // Stage = New DDScrollBuffer; // (handle this later, if needed)
3007 i = Stage.CreateAtSize(LW, LH, picPane.hWnd);
3008 // Set StretchedSprites = NormalSprites.GetStretchCopy(Stretch)
3009 ReLoadStretchSprites();
3010 if (i == 0 || IS_NOTHING(&StretchedSprites, sizeof(StretchedSprites)))
3012 // menStretch(Stretch / 0.5).Enabled = False
3014 ReStretch(Stretch - 0.25);
3020 StretchedSprites.DestXOff = 1 * BaseWidth; // StretchWidth
3021 StretchedSprites.DestYOff = 1 * BaseWidth; // StretchWidth
3022 Stage.DestXOff = 1 * StretchWidth;
3023 Stage.DestYOff = 1 * StretchWidth;
3024 StretchedSprites.DestinationSurface = Stage.Surface;
3030 if (Loaded && LevelLoaded)
3033 picViewPort_Resize();
3037 subCalculateScreenScrollPos();
3038 ScrollTo(ScreenScrollXPos, ScreenScrollYPos);
3048 static void SetScrollEdges()
3051 printf("::: SetScrollEdges ... [%ld, %ld, %ld, %ld] [%f, %d] [%d, %d, %d, %d]\n",
3052 DisplayMinX, DisplayMinY, DisplayMaxX, DisplayMaxY,
3054 ScrollMinX, ScrollMinY, ScrollMaxX, ScrollMaxY);
3057 ScrollMinX = (int)(DisplayMinX - 0.5) * Stretch * BaseWidth;
3058 ScrollMinY = (int)(DisplayMinY - 0.5) * Stretch * BaseWidth;
3060 ScrollMaxX = (int)(DisplayMaxX + 1.5) * Stretch * BaseWidth;
3061 ScrollMaxY = (int)(DisplayMaxY + 1.5) * Stretch * BaseWidth;
3063 ScrollMaxX = (int)(DisplayMaxX + 1.5) * Stretch * BaseWidth - picPane.Width;
3064 ScrollMaxY = (int)(DisplayMaxY + 1.5) * Stretch * BaseWidth - picPane.Height;
3068 printf("::: SetScrollEdges done [%d, %d, %d, %d]\n",
3069 ScrollMinX, ScrollMinY, ScrollMaxX, ScrollMaxY);
3073 void DrawField(int X, int Y)
3078 Tmp = LowByte(PlayField16[tsi]);
3082 if (Tmp == fiRAM || Tmp == fiHardWare)
3083 Tmp = DisPlayField[tsi];
3085 if (Tmp == fiBug || Tmp == 40)
3086 Tmp = DisPlayField[tsi];
3090 if (fiOrangeDisk < Tmp && Tmp < fiSnikSnak)
3091 Tmp = DisPlayField[tsi];
3094 StretchedSprites.BltEx(StretchWidth * X, StretchWidth * Y, Tmp);
3097 void DrawFieldAnimated(int X, int Y)
3102 Tmp = LowByte(PlayField16[tsi]);
3106 subDrawAnimatedSnikSnaks(tsi);
3110 subDrawAnimatedElectrons(tsi);
3114 // If 40 < Tmp Then Tmp = 0
3115 // If Tmp = fiRAM Or Tmp = fiHardWare Then Tmp = DisPlayField(tsi)
3116 // If Tmp = fiBug Or Tmp = 40 Then Tmp = DisPlayField(tsi)
3118 // If fiOrangeDisk < Tmp And Tmp < fiSnikSnak Then Tmp = DisPlayField(tsi)
3120 // StretchedSprites.BltEx StretchWidth * X, StretchWidth * Y, Tmp
3125 void DrawFieldNoAnimated(int X, int Y)
3130 Tmp = LowByte(PlayField16[tsi]);
3134 StretchedSprites.BltEx(StretchWidth * X, StretchWidth * Y, fiSpace);
3138 StretchedSprites.BltEx(StretchWidth * X, StretchWidth * Y, fiSpace);
3145 if (Tmp == fiRAM || Tmp == fiHardWare)
3146 Tmp = DisPlayField[tsi];
3148 if (Tmp == fiBug || Tmp == 40)
3149 Tmp = DisPlayField[tsi];
3153 if (fiOrangeDisk < Tmp && Tmp < fiSnikSnak)
3154 Tmp = DisPlayField[tsi];
3157 StretchedSprites.BltEx(StretchWidth * X, StretchWidth * Y, Tmp);
3162 void DrawSprite(int X, int Y, int SpritePos)
3164 StretchedSprites.BltEx(StretchWidth * X, StretchWidth * Y, SpritePos);
3169 void InvalidateRect(long XMin, long YMin, long XMax, long YMax)
3173 // For Y = YMin To YMax
3174 // For X = XMin To XMax
3175 // Field(X, Y).GraphicsValid = 0
3180 static void picViewPort_MouseUp(int Button, int Shift, float X, float Y)
3182 FocusTim.Enabled = True;
3185 static void picViewPort_Paint()
3187 // Debug.Print "picViewPort_Paint()"
3192 static void picViewPort_Resize()
3195 long bdX, bdY, PanelVisibility;
3200 bdX = picFrame.Width - picFrame.ScaleWidth;
3201 bdY = picFrame.Height - picFrame.ScaleHeight;
3202 dx = Min(picViewPort.ScaleWidth - bdX, (DisplayWidth - 1) * Stretch * BaseWidth);
3204 dY = Min(picViewPort.ScaleHeight - bdX, (DisplayHeight - 1) * Stretch * BaseWidth);
3206 B = s.Read("LimitToOriginalFieldSize", False);
3207 PanelVisibility = 24 * (Panel.Height - PanelSeq - (float)1) / Panel.Height;
3210 dx = Min(320 * Stretch, dx);
3211 dY = Min((200 - PanelVisibility) * Stretch, dY);
3214 X = Max((picViewPort.ScaleWidth - dx) / 2, 0);
3215 Y = Max((picViewPort.ScaleHeight - dY) / 2, 0);
3216 picPane.Move X, Y, dx, dY;
3217 picFrame.Move X - bdX / 2, Y - bdY / 2, dx + bdX, dY + bdY;
3221 ScrollTo(ScrollX, ScrollY);
3222 // SizeTim.Interval = 1
3228 // Private Sub SizeTim_Timer()
3230 // SizeTim.Interval = 0
3231 // wdX = Max(0, picViewPort.ScaleWidth - picPane.Width) * Screen.TwipsPerPixelX
3232 // wdY = Max(0, picViewPort.ScaleHeight - picPane.Height) * Screen.TwipsPerPixelY
3233 // If (0 < wdX) Or (0 < wdY) Then
3234 // Move Left, Top, Width - wdX, Height - wdY
3238 static void LoadKeyIndicators()
3242 picKeys.BackColor = vbButtonFace;
3243 for (i = 2; i <= 5; i++)
3248 for (i = 1; i <= 5; i++)
3250 shpKey(i).FillColor = vbButtonFace;
3251 shpKey(i).Visible = True;
3254 shpKey(1).Move 7, 0;
3255 shpKey(2).Move 0, 7;
3256 shpKey(3).Move 7, 14;
3257 shpKey(4).Move 14, 7;
3258 shpKey(5).Move 7, 7;
3261 void ShowKey(int KeyVar)
3263 boolean State[5 + 1];
3267 static boolean LastState[5 + 1];
3279 State[KeyVar] = True;
3285 State[KeyVar - 4] = True;
3289 for (i = 1; i <= 5; i++)
3292 if (Tmp ^ LastState[i])
3294 Col = (i == 5 ? vbRed : vbRed);
3295 shpKey(i).FillColor = (Tmp ? Col : Col);
3302 static void GetSettings()
3312 APath = WithSlash(App.Path);
3313 CurPath = s.Read("LastPath", APath);
3315 // window width and height
3316 X = s.Read("Width", Width);
3317 Y = s.Read("Height", Height);
3318 if (X < 0 Then X == 0: If Y < 0)
3321 if (Screen.Width < X)
3324 if (Screen.Height < Y)
3329 // window position and state
3330 X = s.Read("Left", left);
3331 Y = s.Read("Top", top);
3332 if (X < 0 Then X == 0: If Y < 0)
3335 if (Screen.Width < (X + Width))
3336 X = Screen.Width - Width;
3338 if (Screen.Height < (Y + Height))
3339 Y = Screen.Height - Height;
3343 WindowState = s.Read("WinState", vbNormal);
3345 Flag = s.Read("ShowToolTips", True);
3347 menToolTips_Click();
3349 menBorder.Checked = ! CBool(s.Read("ShowBorder", False));
3350 Flag = CBool(s.Read("AutoScroll", True));
3353 AutoScrollFlag = False;
3354 menAutoScroll.Checked = False;
3357 Flag = CBool(s.Read("SoundFX", True));
3358 FXOnFlag = (Flag ? -1 : -1);
3359 menSoundFX.Checked = Flag;
3360 SignatureDelay = CLng(s.Read("SignatureDelay", 3000));
3361 AllowRedDiskCheat = CInt(s.Read("AllowRedDiskCheat", 1));
3362 AllowEatRightRedDiskBug = CInt(s.Read("AllowEatRightRedDiskBug", 1));
3363 MySignature = s.Read("MySignature", "");
3365 X = s.Read("FrameDelayPlay", 1000000 / 35);
3366 i = GetSpeedIndex(X);
3367 menPlaySpeed_Click(i);
3368 X = s.Read("FrameDelayDemo", 1000000 / 35);
3369 i = GetSpeedIndex(X);
3370 menDemoSpeed_Click(i);
3372 i = s.Read("Stretch", 4);
3373 if (i < menStretch.LBound || menStretch.UBound < i)
3376 menStretch_Click (i);
3380 static void SaveSettings()
3386 s.Save "LastPath", (ModifiedFlag ? OrigPath : OrigPath);
3387 if (WindowState != vbMinimized)
3389 s.Save "Width", Width;
3390 s.Save "Height", Height;
3391 s.Save "Left", left;
3393 s.Save "WinState", WindowState;
3396 s.Save "ShowToolTips", menToolTips.Checked;
3397 s.Save "ShowBorder", menBorder.Checked;
3398 s.Save "AutoScroll", menAutoScroll.Checked;
3399 s.Save "SoundFX", menSoundFX.Checked;
3400 s.Save "SignatureDelay", SignatureDelay;
3401 s.Save "AllowRedDiskCheat", AllowRedDiskCheat;
3402 s.Save "AllowEatRightRedDiskBug", AllowEatRightRedDiskBug;
3403 s.Save "MySignature", MySignature;
3405 s.Save "FrameDelayPlay", DeltaTPlay;
3406 s.Save "FrameDelayDemo", DeltaTDemo;
3408 for (i = menStretch.LBound; i <= menStretch.UBound; i++)
3410 if (menStretch(i).Checked)
3414 s.Save "Stretch", i;
3419 void ReLoadStretchSprites()
3422 BitMapObject NBMP, SBMP;
3425 // If Stretch = 1 Then
3426 MpxBmp = App.Path & "/Mpx.bmp";
3428 // MpxBmp = App.Path & "\Mpx" & Stretch & ".bmp"
3429 // tmpMpxBmp = App.Path & "\Mpx.bmp"
3430 // If FileExists(MpxBmp) And FileExists(tmpMpxBmp) Then
3431 // If FileDateTime(MpxBmp) < FileDateTime(tmpMpxBmp) Then
3435 // If Not FileExists(MpxBmp) Then
3436 // MousePointer = 11
3437 // // Set NBMP = New BitMapObject // (handle this later, if needed)
3438 // tmpMpxBmp = App.Path & "\Mpx.bmp"
3439 // If Not FileExists(tmpMpxBmp) Then
3440 // ReportError "ReLoadStretchSprites", "File not found: " & tmpMpxBmp
3441 // MESSAGE_BOX("an error occured"); // MsgBox "File not found: " & tmpMpxBmp, vbCritical, "MegaPlex - Error"
3444 // NBMP.CreateFromFile tmpMpxBmp
3445 // Set SBMP = NBMP.GetStretchCopy(Stretch)
3446 // SBMP.SaveToFile MpxBmp
3447 // Set NBMP = Nothing
3448 // Set SBMP = Nothing
3452 // StretchedSprites = New DDSpriteBuffer; // (handle this later, if needed)
3453 if (! StretchedSprites.CreateFromFile(MpxBmp, 16, 16))
3454 SET_TO_NOTHING(&StretchedSprites, sizeof(StretchedSprites));
3457 void SaveSnapshot(currency Number)
3461 Path = CAT(WithSlash(App.Path), "Capture");
3465 Path = Path & "\" & Format(Number, "00000000") & ".bmp";
3466 SavePicture CaptureWindow(picPane.hWnd, True, 0, 0, picPane.ScaleWidth, picPane.ScaleHeight), Path;