1 // ----------------------------------------------------------------------------
3 // ----------------------------------------------------------------------------
9 static void DrawFrame(int Delta);
10 static void ReStretch(float NewStretch);
11 static void picPane_Paint();
12 static void picViewPort_Resize();
13 static void menBorder_Click();
17 static void CleanTempDir(char *TmpDir);
18 static void CountDown(long HalfSeconds, int bDisplayBar);
19 static void DrawFrame(int Delta);
20 static void DrawPauseLayer(long Layer);
21 static void FillFileList(char *Path);
22 static void FillLevelList(char *Path, int LevelIndex);
23 static void FocusTim_Timer();
24 static void Form_KeyDown(int KeyCode, int Shift);
25 static void Form_KeyUp(int KeyCode, int Shift);
26 static void Form_Paint();
27 static int GetFileNameToSave();
28 static long GetHwndFromTempFileName(char *TmpFile);
29 static char * GetMyTempFileName();
30 static void GetSettings();
31 static char * GetSpeedDescriptionFPS(currency FrameDelayUS);
32 static int GetSpeedIndex(long DelayUS);
33 static char * GetValidTempPath();
34 static long Get_LastOpenFilter();
35 static long Get_LastSaveFilter();
36 static int InitSpeeds();
37 static boolean InstanceStillRunning(char *TmpFile);
38 static void Let_LastOpenFilter(long NewVal);
39 static void Let_LastSaveFilter(long NewVal);
40 static void LoadKeyIndicators();
41 static void LoadMenus();
42 static void PanelTim_Timer();
43 static void ReStretch(float NewStretch);
44 static void RestoreFrame();
45 static boolean SaveAs();
46 static void SaveSettings();
47 static void SetScrollEdges();
48 static void UpdateDeltaT();
49 static void cmbFile_Click();
50 static void cmbFile_KeyDown(int KeyCode, int Shift);
51 static void cmbFile_KeyUp(int KeyCode, int Shift);
52 static void cmbLevel_Click();
53 static void cmbLevel_KeyUp(int KeyCode, int Shift);
54 static void cmblevel_KeyDown(int KeyCode, int Shift);
55 static void cmdPause_Click();
56 static void cmdPause_MouseUp(int Button, int Shift, float X, float Y);
57 static void cmdPlayAll_Click();
58 static void cmdPlayAll_MouseUp(int Button, int Shift, float X, float Y);
59 static void cmdPlayDemo_Click();
60 static void cmdPlayDemo_MouseUp(int Button, int Shift, float X, float Y);
61 static void cmdPlay_Click();
62 static void cmdPlay_MouseUp(int Button, int Shift, float X, float Y);
63 static void cmdRecordDemo_Click();
64 static void cmdRecordDemo_MouseUp(int Button, int Shift, float X, float Y);
65 static void cmdStop_Click();
66 static void cmdStop_MouseUp(int Button, int Shift, float X, float Y);
67 static void fpsTim_Timer();
68 static void menAbout_Click();
69 static void menAutoScroll_Click();
70 static void menBorder_Click();
71 static void menCopy_Click();
72 static void menEnOff_Click();
73 static void menEnOn_Click();
74 static void menExit_Click();
75 static void menFaster_Click();
76 static void menGravOff_Click();
77 static void menGravOn_Click();
78 static void menNewStd_Click();
79 static void menNew_Click();
80 static void menOpen_Click();
81 static void menOptions_Click();
82 static void menPanel_Click();
83 static void menPaste_Click();
84 static void menPause_Click();
85 static void menPlayAll_Click();
86 static void menPlayDemo_Click();
87 static void menPlay_Click();
88 static void menReRecordDemo_Click();
89 static void menRec_Click();
90 static void menRemSP_Click();
91 static void menRestoreBorder_Click();
92 static void menSaveAs_Click();
93 static void menSave_Click();
94 static void menSelectAll_Click();
95 static void menShowLInfo_Click();
96 static void menSlower_Click();
97 static void menSoundFX_Click();
98 static void menStretch_Click(int Index);
99 static void menToolTips_Click();
100 static void menTrim_Click();
101 static void menZonkOff_Click();
102 static void menZonkOn_Click();
103 static void picKeys_MouseUp(int Button, int Shift, float X, float Y);
104 static void picMenu_Click();
105 static void picPane_KeyDown(int KeyCode, int Shift);
106 static void picPane_KeyUp(int KeyCode, int Shift);
107 static void picPane_MouseDown(int Button, int Shift, float X, float Y);
108 static void picPane_MouseMove(int Button, int Shift, float X, float Y);
109 static void picPane_MouseUp(int Button, int Shift, float X, float Y);
110 static void picPane_Paint();
111 static void picViewPort_MouseUp(int Button, int Shift, float X, float Y);
112 static void picViewPort_Paint();
113 static void picViewPort_Resize();
117 void DrawField(int X, int Y);
118 void DrawFieldAnimated(int X, int Y);
119 void DrawFieldNoAnimated(int X, int Y);
122 // --- Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "COMDLG32.OCX"
123 // --- Begin VB.Form MainForm
124 // --- AutoRedraw = -1 'True // True
125 // --- Caption = "MegaPlex"
126 // --- ClientHeight = 5850
127 // --- ClientLeft = 2580
128 // --- ClientTop = 2205
129 // --- ClientWidth = 9285
130 // --- Icon = "MainForm.frx":0000
131 // --- LinkTopic = "Form1"
132 // --- ScaleHeight = 390
133 // --- ScaleMode = 3 'Pixel // Pixel
134 // --- ScaleWidth = 619
135 // --- Begin VB.Timer fpsTim
136 // --- Enabled = 0 'False // False
137 // --- Interval = 200
141 // --- Begin VB.Timer FocusTim
146 // --- Begin MSComDlg.CommonDialog cmDlg
149 // --- _ExtentX = 847
150 // --- _ExtentY = 847
151 // --- _Version = 393216
152 // --- CancelError = -1 'True // True
154 // --- Begin VB.Timer PanelTim
155 // --- Enabled = 0 'False // False
160 // --- Begin VB.Frame Panel
166 // --- Begin VB.CommandButton cmdPlay
167 // --- DisabledPicture = "MainForm.frx":0442
168 // --- DownPicture = "MainForm.frx":058C
171 // --- Picture = "MainForm.frx":06D6
172 // --- Style = 1 'Graphical // Graphical
174 // --- TabStop = 0 'False // False
178 // --- Begin VB.CommandButton cmdStop
179 // --- DisabledPicture = "MainForm.frx":0820
180 // --- DownPicture = "MainForm.frx":096A
181 // --- Enabled = 0 'False // False
184 // --- Picture = "MainForm.frx":0AB4
185 // --- Style = 1 'Graphical // Graphical
187 // --- TabStop = 0 'False // False
191 // --- Begin VB.CommandButton cmdPlayDemo
192 // --- DisabledPicture = "MainForm.frx":0BFE
193 // --- DownPicture = "MainForm.frx":0D48
194 // --- Enabled = 0 'False // False
197 // --- Picture = "MainForm.frx":0E92
198 // --- Style = 1 'Graphical // Graphical
200 // --- TabStop = 0 'False // False
204 // --- Begin VB.CommandButton cmdPause
205 // --- DisabledPicture = "MainForm.frx":0FDC
206 // --- DownPicture = "MainForm.frx":1126
207 // --- Enabled = 0 'False // False
210 // --- Picture = "MainForm.frx":1270
211 // --- Style = 1 'Graphical // Graphical
213 // --- TabStop = 0 'False // False
217 // --- Begin VB.CommandButton cmdRecordDemo
218 // --- DisabledPicture = "MainForm.frx":13BA
219 // --- DownPicture = "MainForm.frx":1504
222 // --- Picture = "MainForm.frx":164E
223 // --- Style = 1 'Graphical // Graphical
225 // --- TabStop = 0 'False // False
229 // --- Begin VB.ComboBox cmbFile
230 // --- BackColor = &H00000000&
231 // --- BeginProperty Font
232 // --- Name = "Fixedsys"
236 // --- Underline = 0 'False // False
237 // --- Italic = 0 'False // False
238 // --- Strikethrough = 0 'False // False
240 // --- ForeColor = &H00FF8080&
243 // --- Sorted = -1 'True // True
244 // --- Style = 2 'Dropdown List // Dropdown List
249 // --- Begin VB.ComboBox cmbLevel
250 // --- BackColor = &H00000000&
251 // --- BeginProperty Font
252 // --- Name = "Fixedsys"
256 // --- Underline = 0 'False // False
257 // --- Italic = 0 'False // False
258 // --- Strikethrough = 0 'False // False
260 // --- ForeColor = &H00FF8080&
263 // --- Sorted = -1 'True // True
264 // --- Style = 2 'Dropdown List // Dropdown List
269 // --- Begin VB.PictureBox picKeys
270 // --- BackColor = &H00008080&
271 // --- BorderStyle = 0 'None // None
274 // --- ScaleHeight = 22
275 // --- ScaleMode = 3 'Pixel // Pixel
276 // --- ScaleWidth = 22
278 // --- TabStop = 0 'False // False
281 // --- Begin VB.Shape shpKey
282 // --- FillColor = &H00008000&
283 // --- FillStyle = 0 'Solid // Solid
287 // --- Shape = 5 'Rounded Square // Rounded Square
292 // --- Begin VB.CommandButton cmdPlayAll
293 // --- Caption = "Play All Demos"
294 // --- Enabled = 0 'False // False
298 // --- TabStop = 0 'False // False
300 // --- Visible = 0 'False // False
303 // --- Begin VB.Shape shpProgress
304 // --- BackColor = &H00800000&
305 // --- BackStyle = 1 'Opaque // Opaque
309 // --- Visible = 0 'False // False
312 // --- Begin VB.Label lblStatus
313 // --- Alignment = 2 'Center // Center
314 // --- BorderStyle = 1 'Fixed Single // Fixed Single
315 // --- Caption = "MegaPlex"
316 // --- BeginProperty Font
317 // --- Name = "Fixedsys"
321 // --- Underline = 0 'False // False
322 // --- Italic = 0 'False // False
323 // --- Strikethrough = 0 'False // False
331 // --- Begin VB.Image Image2
334 // --- Picture = "MainForm.frx":1BD8
338 // --- Begin VB.Image Image1
341 // --- Picture = "MainForm.frx":1D22
345 // --- Begin VB.Label lblFps
346 // --- Alignment = 2 'Center // Center
347 // --- BackColor = &H00000000&
348 // --- BorderStyle = 1 'Fixed Single // Fixed Single
349 // --- BeginProperty Font
350 // --- Name = "Fixedsys"
354 // --- Underline = 0 'False // False
355 // --- Italic = 0 'False // False
356 // --- Strikethrough = 0 'False // False
358 // --- ForeColor = &H0000C0C0&
365 // --- Begin VB.Label lblInfoCount
366 // --- Alignment = 2 'Center // Center
367 // --- BackColor = &H00000000&
368 // --- BorderStyle = 1 'Fixed Single // Fixed Single
369 // --- BeginProperty Font
370 // --- Name = "Fixedsys"
374 // --- Underline = 0 'False // False
375 // --- Italic = 0 'False // False
376 // --- Strikethrough = 0 'False // False
378 // --- ForeColor = &H00FF8080&
385 // --- Begin VB.Label lblRedDiskCount
386 // --- Alignment = 2 'Center // Center
387 // --- BackColor = &H00000000&
388 // --- BorderStyle = 1 'Fixed Single // Fixed Single
389 // --- BeginProperty Font
390 // --- Name = "Fixedsys"
394 // --- Underline = 0 'False // False
395 // --- Italic = 0 'False // False
396 // --- Strikethrough = 0 'False // False
398 // --- ForeColor = &H000000FF&
405 // --- Begin VB.Label lblFrameCount
406 // --- Alignment = 2 'Center // Center
407 // --- BorderStyle = 1 'Fixed Single // Fixed Single
409 // --- BeginProperty Font
410 // --- Name = "Fixedsys"
414 // --- Underline = 0 'False // False
415 // --- Italic = 0 'False // False
416 // --- Strikethrough = 0 'False // False
425 // --- Begin VB.PictureBox picViewPort
426 // --- BorderStyle = 0 'None // None
429 // --- ScaleHeight = 169
430 // --- ScaleMode = 3 'Pixel // Pixel
431 // --- ScaleWidth = 265
433 // --- TabStop = 0 'False // False
436 // --- Begin VB.PictureBox picPane
437 // --- AutoSize = -1 'True // True
438 // --- BackColor = &H00000000&
439 // --- BorderStyle = 0 'None // None
443 // --- ScaleHeight = 109
444 // --- ScaleMode = 3 'Pixel // Pixel
445 // --- ScaleWidth = 129
450 // --- Begin VB.PictureBox picFrame
453 // --- ScaleHeight = 57
454 // --- ScaleMode = 3 'Pixel // Pixel
455 // --- ScaleWidth = 81
457 // --- TabStop = 0 'False // False
462 // --- Begin VB.Menu menFile
463 // --- Caption = "&File"
464 // --- Begin VB.Menu menNewStd
465 // --- Caption = "New S&tandard Level"
467 // --- Begin VB.Menu menNew
468 // --- Caption = "&New Level"
470 // --- Begin VB.Menu menDash5
473 // --- Begin VB.Menu menOpen
474 // --- Caption = "&Open"
476 // --- Begin VB.Menu menSave
477 // --- Caption = "&Save"
480 // --- Begin VB.Menu menSaveAs
481 // --- Caption = "Save &As ..."
483 // --- Begin VB.Menu menDash4
486 // --- Begin VB.Menu menExit
487 // --- Caption = "E&xit"
491 // --- Begin VB.Menu menEditMain
492 // --- Caption = "&Edit"
493 // --- Begin VB.Menu menEdit
494 // --- Caption = "&Edit Level"
496 // --- Begin VB.Menu menDash3
499 // --- Begin VB.Menu menCopy
500 // --- Caption = "&Copy"
503 // --- Begin VB.Menu menPaste
504 // --- Caption = "&Paste"
507 // --- Begin VB.Menu menTrim
508 // --- Caption = "&Trim"
511 // --- Begin VB.Menu menDash8
515 // --- Begin VB.Menu menSelectAll
516 // --- Caption = "Select &All"
519 // --- Begin VB.Menu menDash6
522 // --- Begin VB.Menu menRestoreBorder
523 // --- Caption = "Restore &border"
526 // --- Begin VB.Menu menSp
527 // --- Caption = "Special Port"
528 // --- Begin VB.Menu menGravOn
529 // --- Caption = "&Gravity On"
531 // --- Begin VB.Menu menZonkOn
532 // --- Caption = "Freeze &Zonks On"
534 // --- Begin VB.Menu menEnOn
535 // --- Caption = "Freeze &Enemies On"
537 // --- Begin VB.Menu menDash7
540 // --- Begin VB.Menu menGravOff
541 // --- Caption = "Gravity &Off"
543 // --- Begin VB.Menu menZonkOff
544 // --- Caption = "Freeze Zon&ks Off"
546 // --- Begin VB.Menu menEnOff
547 // --- Caption = "Freeze E&nemies Off"
549 // --- Begin VB.Menu menDash10
552 // --- Begin VB.Menu menRemSP
553 // --- Caption = "&Remove (Make Normal Port)"
557 // --- Begin VB.Menu menView
558 // --- Caption = "&View"
559 // --- Begin VB.Menu menZoom
560 // --- Caption = "&Zoom"
561 // --- Begin VB.Menu menStretch
562 // --- Caption = "0.25 : 1"
566 // --- Begin VB.Menu menBorder
567 // --- Caption = "Show &Border"
568 // --- Checked = -1 'True // True
570 // --- Begin VB.Menu menPanel
571 // --- Caption = "Show &Panel"
572 // --- Checked = -1 'True // True
574 // --- Begin VB.Menu menAutoScroll
575 // --- Caption = "&Autoscroll"
576 // --- Checked = -1 'True // True
578 // --- Begin VB.Menu menDash9
581 // --- Begin VB.Menu menShowLInfo
582 // --- Caption = "Show Level &Info"
585 // --- Begin VB.Menu menSound
586 // --- Caption = "&Sound"
587 // --- Begin VB.Menu menSoundFX
588 // --- Caption = "&FX"
590 // --- Begin VB.Menu menMusic
591 // --- Caption = "&Music"
592 // --- Enabled = 0 'False // False
595 // --- Begin VB.Menu menSpeed
596 // --- Caption = "Speed"
597 // --- Begin VB.Menu menSpeedPlay
598 // --- Caption = "Game play"
600 // --- Begin VB.Menu menPlaySpeed
605 // --- Begin VB.Menu menSpeedDemo
606 // --- Caption = "Demo playback"
607 // --- Begin VB.Menu menDemoSpeed
612 // --- Begin VB.Menu menSpeedDash
615 // --- Begin VB.Menu menFaster
616 // --- Caption = "Faster (Pg Up)"
618 // --- Begin VB.Menu menSlower
619 // --- Caption = "Slower (Pg Down)"
622 // --- Begin VB.Menu menRun
623 // --- Caption = "&Play"
624 // --- Begin VB.Menu menPlay
625 // --- Caption = "P&lay Game (Space)"
627 // --- Begin VB.Menu menPause
628 // --- Caption = "&Pause (P)"
629 // --- Enabled = 0 'False // False
631 // --- Begin VB.Menu menStop
632 // --- Caption = "&Stop (Q)"
633 // --- Enabled = 0 'False // False
635 // --- Begin VB.Menu menDash0
638 // --- Begin VB.Menu menRec
639 // --- Caption = "&Record Demo (Ctrl+R)"
641 // --- Begin VB.Menu menPlayDemo
642 // --- Caption = "Play &Demo (Ctrl+Space)"
644 // --- Begin VB.Menu menPlayAll
645 // --- Caption = "Play &All Demos"
648 // --- Begin VB.Menu menOptionsMain
649 // --- Caption = "&Options"
650 // --- Begin VB.Menu menOptions
651 // --- Caption = "&Options ..."
654 // --- Begin VB.Menu menHelp
655 // --- Caption = "Help"
656 // --- Begin VB.Menu menToolTips
657 // --- Caption = "Show &ToolTips"
659 // --- Begin VB.Menu menDash1
662 // --- Begin VB.Menu menAbout
663 // --- Caption = "&About MegaPlex"
668 // static char *VB_Name = "MainForm";
669 // static boolean VB_GlobalNameSpace = False;
670 // static boolean VB_Creatable = False;
671 // static boolean VB_PredeclaredId = True;
672 // static boolean VB_Exposed = False;
674 // --- Option Explicit
675 // --- Option Compare Text
679 long SetParent(long hWndChild, long hWndNewParent);
680 long SetWindowLong(long hWnd, long nIndex, long dwNewLong);
681 long GetWindowLong(long hWnd, long nIndex);
683 long GetTempPath(long nBufferLength, char *lpBuffer);
685 long GetWindowText(long hWnd, char *lpString, long cch);
691 #define GWL_STYLE ((-16))
692 #define WS_CHILD (0x40000000)
693 #define WS_POPUP (0x80000000)
697 // [UNCOMMENTED] Dim StretchWidth2&
701 long OSX, OSY, MDX, MDY;
706 boolean Loaded, DemosAvailable;
708 #define nSpeedCount (17)
709 int SpeedsByDelayUS[nSpeedCount + 1];
710 #define DefaultSpeedIndex (12)
712 currency LastTick, LastFrame;
715 const char *AppTitle = "MegaPlex";
719 static char *GetSpeedDescriptionFPS(currency FrameDelayUS)
721 static char *GetSpeedDescriptionFPS;
725 if (FrameDelayUS == 0)
727 GetSpeedDescriptionFPS = "Fastest possible";
728 return GetSpeedDescriptionFPS;
731 if (FrameDelayUS < 0)
733 GetSpeedDescriptionFPS = "! display (even faster)";
734 return GetSpeedDescriptionFPS;
737 FPS = 1000000 / FrameDelayUS;
738 GetSpeedDescriptionFPS = CAT(INT_TO_STR(FPS), " fps");
740 GetSpeedDescriptionFPS = CAT(GetSpeedDescriptionFPS, "(Default)");
742 return GetSpeedDescriptionFPS;
745 static int InitSpeeds()
747 static int InitSpeeds;
749 SpeedsByDelayUS[1] = -1; // no display
750 SpeedsByDelayUS[2] = 0; // fastest possible
751 SpeedsByDelayUS[3] = 1000000 / 700; // 700 fps
752 SpeedsByDelayUS[4] = 1000000 / 500; // 500 fps
753 SpeedsByDelayUS[5] = 1000000 / 350; // 350 fps
754 SpeedsByDelayUS[6] = 1000000 / 250; // 250 fps
755 SpeedsByDelayUS[7] = 1000000 / 200; // etc.
756 SpeedsByDelayUS[8] = 1000000 / 150;
757 SpeedsByDelayUS[9] = 1000000 / 100;
758 SpeedsByDelayUS[10] = 1000000 / 70;
759 SpeedsByDelayUS[11] = 1000000 / 50;
760 SpeedsByDelayUS[12] = 1000000 / 35; // default
761 SpeedsByDelayUS[13] = 1000000 / 25;
762 SpeedsByDelayUS[14] = 1000000 / 20;
763 SpeedsByDelayUS[15] = 1000000 / 10;
764 SpeedsByDelayUS[16] = 1000000 / 5;
765 SpeedsByDelayUS[17] = 1000000 / 1;
770 static int GetSpeedIndex(long DelayUS)
772 static int GetSpeedIndex;
778 MinIdx = DefaultSpeedIndex;
780 for (i = 1; i <= nSpeedCount; i++)
782 Diff = Abs(DelayUS - SpeedsByDelayUS[i]);
790 GetSpeedIndex = MinIdx;
792 return GetSpeedIndex;
795 static long Get_LastOpenFilter()
797 static long LastOpenFilter;
801 LastOpenFilter = s.Read("LastOpenFilter", 1);
803 return LastOpenFilter;
806 static void Let_LastOpenFilter(long NewVal)
810 SettingsObject_Save("LastOpenFilter", NewVal);
813 static long Get_LastSaveFilter()
815 static long LastSaveFilter;
819 LastSaveFilter = s.Read("LastSaveFilter", 1);
821 return LastSaveFilter;
824 static void Let_LastSaveFilter(long NewVal)
828 SettingsObject_Save("LastSaveFilter", NewVal);
833 static void CountDown(long HalfSeconds, int bDisplayBar)
841 long LeftPos, TopPos, RightPos, MaxWidth; // , MaxHeight&
843 dT = HalfSeconds * 500;
845 LeftPos = cmbFile.left;
846 TopPos = cmbFile.top - shpProgress.Height - cmbFile.top / 8;
847 RightPos = lblFrameCount.left + lblFrameCount.Width;
848 MaxWidth = RightPos - LeftPos;
849 // MaxHeight = lblFrameCount.Top - TopPos + lblFrameCount.Height + 4
852 shpProgress.Move(LeftPos, TopPos, 0); // , MaxHeight
853 shpProgress.Visible = True;
856 for (i = 1; i <= 200; i++)
863 shpProgress.Width = MaxWidth * i / 100;
867 k = MaxWidth * (i - 100) / 100;
868 shpProgress.Move(k, TopPos, RightPos - k);
872 T.DelayMS(Delta, False);
875 shpProgress.Visible = False;
884 static char *GetValidTempPath()
886 static char *GetValidTempPath;
891 GetValidTempPath = "";
893 TP = String(nSize, Chr(32));
894 L = GetTempPath(nSize, TP);
897 // buffer was too small, retry with a properly sized buffer:
899 TP = String(nSize, Chr(32));
900 L = GetTempPath(nSize, TP);
903 TP = SlashLess(left(TP, L));
904 if ((0 == L) || (! IsDir(TP)))
906 // no valid temp path can be retrieved from the system --> create our own
907 TP = CAT(WithSlash(App.Path), "Temp");
911 // --- On Error Resume Next
913 if (! IS_NOTHING(&Err, sizeof(Err)))
915 MESSAGE_BOX("an error occured"); // MsgBox "cannot create directory for temporary files " & TP, vbCritical, "MegaPlex - Error";
916 return GetValidTempPath;
919 // --- On Error GoTo 0
925 GetValidTempPath = TP;
927 return GetValidTempPath;
930 static char *GetMyTempFileName()
932 static char *GetMyTempFileName;
936 (char *)T = Hex(hWnd);
942 GetMyTempFileName = CAT("tmp0x", CAT((char *)T, ".mpx"));
944 return GetMyTempFileName;
947 static long GetHwndFromTempFileName(char *TmpFile)
949 static long GetHwndFromTempFileName;
956 GetHwndFromTempFileName = 0;
957 FN = StripFileName(TmpFile);
961 return GetHwndFromTempFileName;
964 NumString = right(FN, L - LP);
966 NumString = left(NumString, 8);
968 NumString = CAT("&H", NumString);
969 GetHwndFromTempFileName = Val(NumString);
971 return GetHwndFromTempFileName;
974 static void CleanTempDir(char *TmpDir)
978 MFN = GetMyTempFileName();
979 MayKill(CAT(WithSlash(TmpDir), MFN));
980 FN = Dir(CAT(WithSlash(TmpDir), "tmp0x*.mpx"));
983 if (STRING_IS_LIKE(FN, "tmp0x*.mpx"))
985 if (! InstanceStillRunning(FN))
986 MayKill(CAT(WithSlash(TmpDir), FN));
989 FN = Dir_Without_Args();
993 static boolean InstanceStillRunning(char *TmpFile)
995 static boolean InstanceStillRunning;
997 long OtherHwnd, nSize, L;
1000 InstanceStillRunning = False;
1001 OtherHwnd = GetHwndFromTempFileName(TmpFile);
1003 Cap = String(nSize, Chr(32));
1004 L = GetWindowText(OtherHwnd, Cap, nSize);
1005 if ((L == 0) || (nSize < L))
1006 return InstanceStillRunning;
1008 if (STRING_IS_LIKE(Cap, CAT(AppTitle, "*")))
1009 InstanceStillRunning = True;
1011 return InstanceStillRunning;
1016 void DrawFrameIfNeeded()
1020 /* !!! CHECK THIS !!! */
1022 if (! menBorder.Checked)
1032 printf("::: MainForm.c: DisplayLevel(): %d, %d, %d\n",
1033 Loaded, LevelLoaded, bPlaying);
1042 ClearRectangle(backbuffer, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
1043 ClearRectangle(screenBitmap, 0, 0,
1044 MAX_BUF_XSIZE * TILEX, MAX_BUF_YSIZE * TILEY);
1052 /* !!! CHECK THIS !!! */
1054 if (! menBorder.Checked)
1061 printf("::: MainForm.c: DisplayLevel(): [%ld, %ld, %ld, %ld] [%d, %d]...\n",
1062 DisplayMinX, DisplayMinY, DisplayMaxX, DisplayMaxY,
1063 FieldWidth, FieldHeight);
1066 for (Y = DisplayMinY; Y <= DisplayMaxY; Y++)
1068 for (X = DisplayMinX; X <= DisplayMaxX; X++)
1070 DrawFieldNoAnimated(X, Y);
1074 for (Y = DisplayMinY; Y <= DisplayMaxY; Y++)
1076 for (X = DisplayMinX; X <= DisplayMaxX; X++)
1078 DrawFieldAnimated(X, Y);
1085 for (Y = DisplayMinY; Y <= DisplayMaxY; Y++)
1087 for (X = DisplayMinX; X <= DisplayMaxX; X++)
1097 static void cmbFile_Click()
1099 CurPath = CAT(StripDir(OrigPath), CAT("/", cmbFile.List(cmbFile.ListIndex)));
1101 FillLevelList(CurPath, LevelNumber);
1102 if (STRING_IS_LIKE(OrigPath, "*.mpx") || STRING_IS_LIKE(OrigPath, "*.sp"))
1104 menSave.Enabled = True;
1108 menSave.Enabled = False;
1112 static void cmbFile_KeyDown(int KeyCode, int Shift)
1114 picPane_KeyDown(KeyCode, Shift);
1117 static void cmbFile_KeyUp(int KeyCode, int Shift)
1119 picPane_KeyUp(KeyCode, Shift);
1122 static int GetFileNameToSave()
1124 static int GetFileNameToSave;
1128 (char *)T = StripFileName(OrigPath);
1129 if (STRING_IS_LIKE(T, "*.dat") || STRING_IS_LIKE(T, "*.d##"))
1131 T = "Level" & Format(LevelNumber, "#000");
1134 GetFileNameToSave = T;
1136 return GetFileNameToSave;
1139 static void cmbLevel_Click()
1144 static long LastIndex = 0;
1145 static boolean bBlock = False;
1150 // //////////////////////////////////////////////////////////////////
1155 Msg = "Save changes to " & GetFileNameToSave() & " ?";
1156 Res = MsgBox(Msg, vbYesNoCancel, AppTitle & " - close level");
1157 if (Res == vbCancel) // fallback
1161 // --- On Error Resume Next
1162 cmbLevel.ListIndex = LastIndex;
1163 // --- On Error GoTo 0
1166 Debug.Assert cmbLevel.ListIndex = LastIndex;
1173 // oldCurPath = CurPath
1174 if (FileExists(OrigPath) && menSave.Enabled)
1180 if (! SaveAs()) // fallback
1184 // --- On Error Resume Next
1185 cmbLevel.ListIndex = LastIndex;
1186 // --- On Error GoTo 0
1189 Debug.Assert cmbLevel.ListIndex = LastIndex;
1194 // CurPath = oldCurPath
1197 Let_ModifiedFlag(False);
1201 // //////////////////////////////////////////////////////////////////
1203 LevelNumber = cmbLevel.ListIndex + 1;
1207 Oldflag = NoDisplayFlag;
1208 NoDisplayFlag = False;
1209 subFetchAndInitLevel();
1210 if ((0 < SignatureDelay) && ! (WindowState == vbMinimized))
1212 Msg = LInfo.LevelTitle & vbNewLine & "(" & FieldWidth & " x " & FieldHeight & ")";
1213 if (DemoAvailable && bSignatureAvailable)
1214 Msg = Msg & vbNewLine & vbNewLine & gSignature;
1216 SignatureForm.Signature = Msg;
1217 SignatureForm.DelayMS = SignatureDelay;
1220 X = left + (Width - SignatureForm.Width) / 2;
1221 Y = top + (Height - SignatureForm.Height) / 2;
1222 SignatureForm.Move X, Y;
1223 SignatureForm.Show vbModeless, Me;
1227 lblStatus = "MegaPlex";
1228 lblFrameCount = GetTotalFramesOfDemo();
1235 NoDisplayFlag = Oldflag;
1236 LastIndex = cmbLevel.ListIndex;
1240 menPlayDemo.Enabled = DemoAvailable;
1241 cmdPlayDemo.Enabled = DemoAvailable;
1244 static void cmblevel_KeyDown(int KeyCode, int Shift)
1246 if (GameLoopRunning != 0)
1252 if (menPlay.Enabled == True)
1258 picPane_KeyDown(KeyCode, Shift);
1263 static void cmbLevel_KeyUp(int KeyCode, int Shift)
1265 picPane_KeyUp(KeyCode, Shift);
1268 static void cmdPause_Click()
1273 static void cmdPause_MouseUp(int Button, int Shift, float X, float Y)
1275 FocusTim.Enabled = True;
1278 static void cmdPlay_Click()
1280 if (menPlay.Enabled)
1284 static void cmdPlay_MouseUp(int Button, int Shift, float X, float Y)
1286 FocusTim.Enabled = True;
1289 static void cmdPlayAll_Click()
1294 static void cmdPlayAll_MouseUp(int Button, int Shift, float X, float Y)
1296 FocusTim.Enabled = True;
1299 static void cmdPlayDemo_Click()
1301 menPlayDemo_Click();
1304 static void cmdPlayDemo_MouseUp(int Button, int Shift, float X, float Y)
1306 FocusTim.Enabled = True;
1309 static void cmdRecordDemo_Click()
1315 static void cmdRecordDemo_MouseUp(int Button, int Shift, float X, float Y)
1317 FocusTim.Enabled = True;
1320 static void cmdStop_Click()
1322 if (menStop.Enabled)
1326 static void cmdStop_MouseUp(int Button, int Shift, float X, float Y)
1328 FocusTim.Enabled = True;
1331 static void FocusTim_Timer()
1333 FocusTim.Enabled = False;
1335 // --- On Error Resume Next
1339 static void Form_KeyDown(int KeyCode, int Shift)
1341 picPane_KeyDown(KeyCode, Shift);
1344 static void Form_KeyUp(int KeyCode, int Shift)
1346 picPane_KeyUp(KeyCode, Shift);
1365 // FMark = New MarkerObject; // (handle this later, if needed)
1373 TmpPath = GetValidTempPath();
1377 CleanTempDir(TmpPath);
1378 TmpPath = CAT(WithSlash(TmpPath), GetMyTempFileName());
1382 InitDirectX(hWnd, picPane.hWnd);
1384 // AllowRedDiskCheat = 1
1385 MpxBmp = CAT(App.Path, "/mpx.bmp");
1386 // // Set NormalSprites = New DDSpriteBuffer // (handle this later, if needed)
1387 // NormalSprites.CreateFromFile MPXBMP, 16, 16
1389 Field = REDIM_2D(sizeof(int), 0, 2 + 1 - 1, 0, 2 + 1 - 1);
1391 picViewPort.ScaleMode = vbPixels;
1409 LoadKeyIndicators();
1413 FillFileList(CurPath);
1414 if (s.Read("ShowSplash", True))
1416 // frmSplash.EnableTimer
1417 frmSplash.Show vbModal, Me;
1425 static void FillLevelList(char *Path, int LevelIndex)
1427 long FNum, LevLen, i, iMax;
1431 if (! FileExists(Path))
1434 if ((STRING_IS_LIKE(Path, "*.D??")) || (STRING_IS_LIKE(Path, "*.sp")))
1438 FNum = fopen(Path, "rb");
1441 FILE_GET(FNum, (long)1441 + i * LevLen, &LInfo, sizeof(LInfo));
1442 cmbLevel.AddItem Format(i + 1, "#000") & " " & LInfo.LevelTitle, i;
1443 if (STRING_IS_LIKE(Path, "*.D??"))
1445 while (!(EOF(FNum)))
1448 FILE_GET(FNum, (long)1441 + i * LevLen, &LInfo, sizeof(LInfo));
1452 cmbLevel.AddItem Format(i + 1, "#000") & " " & LInfo.LevelTitle, i;
1456 if (LevelIndex <= i && 0 < LevelIndex)
1461 cmbLevel.ListIndex = i;
1465 else if (STRING_IS_LIKE(Path, "*.mpx"))
1469 FNum = fopen(Path, "rb");
1474 for (i = 1; i <= LevelCount; i++)
1476 if (! MpxLoadLInfo(CInt(i)))
1479 cmbLevel.AddItem Format(i, "#000") & " " & LInfo.LevelTitle, i - 1;
1485 if (LevelIndex < i && 0 < LevelIndex)
1490 if (i < cmbLevel.ListCount)
1491 cmbLevel.ListIndex = i;
1498 static void FillFileList(char *Path)
1500 long FNum, LevLen, i;
1502 char *TFile, *TPath, *OFile;
1507 TPath = WithSlash(StripDir(Path));
1508 OFile = StripFileName(Path);
1509 TFile = Dir(TPath & "*.D??");
1512 if (FileLen(TPath & TFile) == 170496)
1514 cmbFile.AddItem TFile;
1520 TFile = Dir(TPath & "*.SP");
1523 nDemoCount = nDemoCount + 1;
1524 cmbFile.AddItem TFile;
1528 TFile = Dir(TPath & "*.mpx");
1531 nDemoCount = nDemoCount + 1;
1532 cmbFile.AddItem TFile;
1536 i = cmbFile.ListCount - 1;
1537 if (0 < cmbFile.ListCount)
1541 if ((cmbFile.List(i) Like OFile) || i == 0)
1548 cmbFile.ListIndex = i;
1551 DemosAvailable = (1 < nDemoCount);
1552 menPlayAll.Enabled = DemosAvailable;
1553 cmdPlayAll.Enabled = DemosAvailable;
1556 static void LoadMenus()
1561 menFaster.Enabled = False;
1562 menSlower.Enabled = False;
1564 for (i = 1; i <= nSpeedCount; i++)
1568 Load menPlaySpeed(i);
1569 Load menDemoSpeed(i);
1572 menPlaySpeed(i).Caption = GetSpeedDescriptionFPS(SpeedsByDelayUS[i]);
1573 menDemoSpeed(i).Caption = GetSpeedDescriptionFPS(SpeedsByDelayUS[i]);
1577 menStretch(1).Caption = Format(0.25, "#0.00") & ";
1579 if (Stretch == 0.25)
1580 menStretch(1).Checked = True;
1582 for (i = 2; i <= 20; i++)
1585 menStretch(i).Caption = Format(0.25 * i, "#0.00") & ";
1587 menStretch(i).Checked = ((i * 0.25) == Stretch);
1590 menSp.Enabled = False;
1594 // Function DisplayShift&()
1595 // Dim X&, Y&, A&, B&, iX&, iiX&, LD&
1598 // For A = 0 To picPane.ScaleWidth
1599 // For Y = DisplayMinY To DisplayMaxY
1600 // For X = DisplayMinX To DisplayMaxX
1601 // iX = StretchWidth * X + A
1602 // Sprite = Field(X, Y).SpritePos
1603 // If picPane.ScaleWidth < (iX + 1) Then
1604 // iX = iX - picPane.ScaleWidth
1606 // If picPane.ScaleWidth < (iX + 1 + BaseWidth) Then
1607 // iiX = iX - picPane.ScaleWidth
1608 // Sprites.BitBltSprite picPane.hdc, iiX, StretchWidth * Y, Sprite
1611 // Sprites.BitBltSprite picPane.hdc, iX, StretchWidth * Y, Sprite
1614 // DisplayShift = DisplayShift + 1
1619 static void Form_Paint()
1621 // Debug.Print "Form_Paint()"
1624 static void Form_Resize()
1629 if (WindowState == vbMinimized || ! Loaded)
1633 // NW = ScaleWidth - 2 * Space: If NW < 0 Then NW = 0
1634 // NH = ScaleHeight - 3 * Space - cmbLevel.Height: If NH < 0 Then NH = 0
1635 // picViewPort.Move Space, Space, NW, NH
1636 Tmp = (ShowPanel != 0 ? ScaleHeight - Panel.Height : ScaleHeight);
1640 picViewPort.Move 0, 0, ScaleWidth, Tmp;
1641 // Tmp = 2 * Space + picViewPort.Height
1643 Panel.left = (ScaleWidth - Panel.Width) / 2;
1644 // 'cmdNormal.Top = 2 * Space + picViewPort.Height
1645 // cmbLevel.Top = Tmp
1646 // lblRedDiskCount.Top = Tmp
1647 // lblInfoCount.Top = Tmp
1648 // picKeys.Top = Tmp
1649 // lblFrameCount.Top = Tmp
1650 // cmdPlayAll.Top = Tmp
1655 static void DrawFrame(int Delta)
1657 int i, LX, tY, RX, BY;
1661 RX = FieldWidth - Delta;
1662 BY = FieldHeight - Delta;
1663 DrawSprite(LX, tY, posFrameCorner);
1664 DrawSprite(LX, BY, posFrameCorner);
1665 DrawSprite(RX, tY, posFrameCorner);
1666 DrawSprite(RX, BY, posFrameCorner);
1667 for (i = LX + 1; i <= RX - 1; i++)
1669 DrawSprite(i, tY, posFrameHorizontal);
1670 DrawSprite(i, BY, posFrameHorizontal);
1673 for (i = tY + 1; i <= BY - 1; i++)
1675 DrawSprite(LX, i, posFrameVertical);
1676 DrawSprite(RX, i, posFrameVertical);
1680 static void RestoreFrame()
1682 int i, LX, tY, RX, BY;
1686 RX = FieldWidth - 1;
1687 BY = FieldHeight - 1;
1688 for (i = LX; i <= RX; i++)
1694 for (i = tY + 1; i <= BY - 1; i++)
1703 static void Form_Unload(int Cancel)
1707 if (cmdPlayAll.STRING_IS_LIKE(Caption, "Quit*"))
1712 if (menEdit.Checked)
1720 Msg = "Save changes to " & GetFileNameToSave() & " ?";
1721 Res = MsgBox(Msg, vbYesNoCancel, AppTitle & " - closing");
1722 if (Res == vbCancel)
1730 if (FileExists(OrigPath) && menSave.Enabled)
1741 if (FileExists(TmpPath) || ModifiedFlag)
1747 ReleaseDirectDraw();
1752 static void fpsTim_Timer()
1755 static int count5 = 0;
1757 count5 = count5 + 1;
1760 TickDiff = T.TickDiffUS(LastTick);
1761 lblFps.Caption = CLng(Round((1000000 * (TimerVar - LastFrame)) / (TickDiff), 0));
1762 LastFrame = TimerVar;
1763 LastTick = T.TickNow();
1767 // If NoDisplayFlag Then lblFrameCount = TimerVar
1768 lblFrameCount = TimerVar;
1771 static void menAbout_Click()
1773 frmSplash.Show vbModal, Me;
1776 static void menAutoScroll_Click()
1779 menAutoScroll.Checked = ! menAutoScroll.Checked;
1780 AutoScrollFlag = menAutoScroll.Checked;
1786 static void menBorder_Click()
1788 if (menBorder.Checked)
1790 menBorder.Checked = False;
1792 DisplayMaxX = FieldWidth - 2;
1793 DisplayWidth = FieldWidth;
1795 DisplayMaxY = FieldHeight - 2;
1796 DisplayHeight = FieldHeight;
1798 if (Loaded && LevelLoaded)
1804 menBorder.Checked = True;
1806 DisplayMaxX = FieldWidth - 1;
1807 DisplayWidth = FieldWidth + 2;
1809 DisplayMaxY = FieldHeight - 1;
1810 DisplayHeight = FieldHeight + 2;
1812 if (Loaded && LevelLoaded)
1817 // DisplayLevel True
1820 void SetDisplayRegion()
1822 if (! menBorder.Checked)
1825 DisplayMaxX = FieldWidth - 2;
1826 DisplayWidth = FieldWidth;
1828 DisplayMaxY = FieldHeight - 2;
1829 DisplayHeight = FieldHeight;
1838 DisplayMaxX = FieldWidth - 1;
1839 DisplayWidth = FieldWidth + 2;
1841 DisplayMaxY = FieldHeight - 1;
1842 DisplayHeight = FieldHeight + 2;
1851 static void menCopy_Click()
1856 void menEdit_Click()
1860 if (menEdit.Checked)
1862 menEdit.Checked = False;
1869 FMark.ShowMarker False;
1870 picViewPort.MousePointer = 0;
1873 if (! STRING_IS_LIKE(CurPath, TmpPath))
1895 if (! STRING_IS_LIKE(CurPath, TmpPath))
1904 subFetchAndInitLevel();
1905 menEdit.Checked = True;
1908 // ScaleMode = vbTwips
1909 ToolBox.Move (Width - ToolBox.Width) / 2, Height - ToolBox.Height;
1910 // ScaleMode = vbPixels
1911 // L = GetWindowLong(ToolBox.hWnd, GWL_STYLE)
1912 // L = L And (Not WS_POPUP)
1913 // L = L Or WS_CHILD
1914 // SetWindowLong ToolBox.hWnd, GWL_STYLE, L
1915 // SetParent ToolBox.hWnd, hWnd
1916 ToolBox.Show vbModeless, Me;
1920 FMark.ShowMarker True;
1924 static void menEnOff_Click()
1926 menEnOn.Checked = False;
1927 menEnOff.Checked = True;
1932 static void menEnOn_Click()
1934 menEnOn.Checked = True;
1935 menEnOff.Checked = False;
1940 static void menExit_Click()
1945 static void menFaster_Click()
1951 Debug.Assert(False);
1955 if (DemoFlag != 0) // demoplayback
1957 i = GetSpeedIndex(DeltaTDemo);
1959 If i < 2 Then i = 2;
1960 menDemoSpeed_Click (i);
1964 i = GetSpeedIndex(DeltaTPlay);
1966 If i < 2 Then i = 2;
1967 menPlaySpeed_Click (i);
1971 static void menSlower_Click()
1977 Debug.Assert(False);
1981 if (DemoFlag != 0) // demoplayback
1983 i = GetSpeedIndex(DeltaTDemo);
1985 If nSpeedCount < i Then i = nSpeedCount;
1986 menDemoSpeed_Click (i);
1990 i = GetSpeedIndex(DeltaTPlay);
1992 If nSpeedCount < i Then i = nSpeedCount;
1993 menPlaySpeed_Click (i);
1997 void menPlaySpeed_Click(int Index)
2001 // If NoDisplayFlag And (GameLoopRunning <> 0) Then
2002 // NoDisplayFlag = False
2005 // NoDisplayFlag = False
2006 for (i = menPlaySpeed.LBound; i <= menPlaySpeed.UBound; i++)
2009 menPlaySpeed(i).Checked = (Index == i);
2013 BlockingSpeed = False;
2014 DeltaTPlay = SpeedsByDelayUS[Index];
2016 // If DeltaTPlay < 0 Then
2019 // NoDisplayFlag = True
2023 void menDemoSpeed_Click(int Index)
2027 // If NoDisplayFlag And (GameLoopRunning <> 0) Then
2028 // NoDisplayFlag = False
2031 NoDisplayFlag = False;
2032 for (i = menDemoSpeed.LBound; i <= menDemoSpeed.UBound; i++)
2035 menDemoSpeed(i).Checked = (Index == i);
2039 BlockingSpeed = False;
2040 DeltaTDemo = SpeedsByDelayUS[Index];
2042 // If DeltaTPlay < 0 Then
2045 // NoDisplayFlag = True
2049 static void UpdateDeltaT()
2054 DeltaT = (DemoFlag != 0 ? DeltaTDemo : DeltaTPlay);
2059 NoDisplayFlag = True;
2063 if (NoDisplayFlag && GameLoopRunning != 0)
2065 NoDisplayFlag = False;
2070 NoDisplayFlag = False;
2075 static void menGravOff_Click()
2077 menGravOn.Checked = False;
2078 menGravOff.Checked = True;
2083 static void menGravOn_Click()
2085 menGravOn.Checked = True;
2086 menGravOff.Checked = False;
2091 static void menNew_Click()
2093 NewForm.Show vbModal, Me;
2094 CreateLevel(FieldWidth, FieldHeight);
2098 static void menNewStd_Click()
2100 CreateLevel(60, 24);
2104 static void menOpen_Click()
2109 // cmDlg.DefaultExt = "sp"
2113 (prevent compiler warning here due to suspected use of trigraph)
2115 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";
2118 LFilt = LastOpenFilter;
2119 cmDlg.FilterIndex = (0 < LFilt & LFilt < 5 ? LFilt : 1);
2120 if (FileExists(CurPath))
2121 cmDlg.InitDir = WithSlash(StripDir(CurPath));
2123 cmDlg.flags = cdlOFNHideReadOnly | cdlOFNLongNames;
2126 // --- On Error GoTo menOpenEH
2128 // --- On Error GoTo 0
2130 LFilt = cmDlg.FilterIndex;
2131 LastOpenFilter = LFilt;
2132 CurPath = cmDlg.FileName;
2134 FillFileList (CurPath);
2139 static void menOptions_Click()
2143 oFrm.Show vbModal, Me;
2145 picViewPort_Resize();
2148 static void menPanel_Click()
2151 PanelVisible = ! menPanel.Checked;
2155 void Let_PanelVisible(boolean NewVal)
2157 static boolean HidePanel = False;
2159 if (HidePanel != NewVal)
2162 HidePanel = ! NewVal;
2163 PanelTim.Enabled = True;
2166 static void DrawPauseLayer(long Layer)
2168 DirectDrawPalette Pal;
2173 // For Y = 0 To bmpStage.Height Step BaseWidth
2174 // For X = 0 To bmpStage.Width Step BaseWidth
2175 // Pause.TransparentDraw bmpStageHDC, X, Y, Layer
2178 // With Stage.Surface
2179 // Set Pal = .GetPalette
2180 // for i=1 to pal.GetEntries(
2181 // Stage.Surface.SetPalette
2184 static void menPaste_Click()
2191 static void menPause_Click()
2193 static StdPicture OldPic;
2194 static char *OldText = 0;
2196 PauseMode = (PauseMode != 0 ? 0 : 1);
2199 if (IS_NOTHING(&OldPic, sizeof(OldPic)))
2200 OldPic = cmdPause.Picture;
2202 cmdPause.Picture = cmdPause.DownPicture;
2203 OldText = lblStatus.Caption;
2204 lblStatus = "Paused ...";
2208 cmdPause.Picture = OldPic;
2209 lblStatus.Caption = OldText;
2213 static void menPlayAll_Click()
2217 char *LogPath, *OutStr, *ReRecPath, *SPPath;
2219 static boolean QuitFlag = False;
2221 if (cmdPlayAll.STRING_IS_LIKE(Caption, "Play) All Demos")
2223 cmdPlayAll.Caption = "Quit All";
2224 menPlayAll.Caption = "Quit All";
2225 FocusTim.Enabled = True;
2228 iMax = cmbFile.ListCount - 1;
2229 LogPath = StripDir(CurPath) & "/Error.Log";
2230 if (Dir(LogPath) != "")
2233 for (i = iMin; i <= iMax; i++)
2235 cmbFile.ListIndex = i;
2236 // If CurPath Like "*.sp" Or CurPath Like "*.mpx" Then
2240 ReRecPath = SPPath & ".ReRec";
2241 menPlayDemo_Click();
2243 // bEqual = FilesEqual(ReRecPath, SPPath)
2244 // If bEqual Then MayKill ReRecPath
2246 OutStr = cmbFile.List(i) & " -> ";
2248 if (Val(lblFrameCount) != GetTotalFramesOfDemo())
2250 OutStr = OutStr & "Error in GetTotalFramesOfDemo()! ";
2251 Debug.Assert(False);
2255 if ((LevelStatus == 1) && bEqual)
2257 OutStr = OutStr & "Success";
2261 OutStr = OutStr & "All Demos (float)Canceled";
2265 if (LevelStatus != 1)
2267 OutStr = OutStr & "### Level Failed ### (TimerVar == " & TimerVar & ")";
2272 OutStr = OutStr & "### ReRecording is binary different ###";
2277 FNum = fopen(LogPath, "ab");
2278 Print #FNum, OutStr;
2285 cmdPlayAll.Caption = "Play All Demos";
2286 menPlayAll.Caption = "Play All Demos";
2287 SettingsObject Settings;
2289 MySignature = Settings.Read("MySignature", "");
2290 FirstDemoByte = 0x81;
2295 if (menStop.Enabled)
2300 static void menRemSP_Click()
2306 static void menRestoreBorder_Click()
2311 static void menSave_Click()
2316 if (STRING_IS_LIKE(CurPath, TmpPath))
2319 if (STRING_IS_LIKE(CurPath, "") || STRING_IS_LIKE(CurPath, "*.dat"))
2325 if (STRING_IS_LIKE(CurPath, "*.sp"))
2331 if (! FileExists(CurPath) || STRING_IS_LIKE(CurPath, "Untitled"))
2338 Let_ModifiedFlag(False);
2341 static void menSaveAs_Click()
2344 FillFileList (CurPath);
2347 static boolean SaveAs()
2349 static boolean SaveAs;
2356 // cmDlg.DefaultExt = "sp"
2357 cmDlg.Filter = "MegaPlex Level (*.mpx)|*.mpx|SpeedFix Demo (*.sp)|*.sp";
2358 cmDlg.FilterIndex = LastSaveFilter;
2359 // If OrigPath Like "*.sp" Then cmDlg.FilterIndex = 1 Else cmDlg.FilterIndex = 0
2360 if (FileExists(OrigPath))
2362 cmDlg.InitDir = WithSlash(StripDir(OrigPath));
2363 cmDlg.InitDir = s.Read("LastSaveDir", cmDlg.InitDir);
2364 cmDlg.FileName = StripExtensionlessFileName(GetFileNameToSave());
2367 cmDlg.flags = cdlOFNHideReadOnly | cdlOFNLongNames;
2370 // --- On Error GoTo SaveAsEH
2372 // --- On Error GoTo 0
2374 LastSaveFilter = cmDlg.FilterIndex;
2375 FN = cmDlg.FileName;
2376 SettingsObject_Save("LastSaveDir", WithSlash(StripDir(FN)));
2377 if (STRING_IS_LIKE(FN, "*.sp"))
2381 else if (STRING_IS_LIKE(FN, "*.mpx"))
2386 Let_ModifiedFlag(False);
2394 static void menSelectAll_Click()
2396 FMark.SetPoint1 0, 0;
2397 FMark.SetPoint2 FieldWidth - 1, FieldHeight - 1;
2400 static void menShowLInfo_Click()
2404 Msg = LInfo.LevelTitle & vbNewLine & "(" & FieldWidth & " x " & FieldHeight & ")";
2405 if (DemoAvailable && bSignatureAvailable)
2406 Msg = Msg & vbNewLine & vbNewLine & gSignature;
2408 SignatureForm.Signature = Msg;
2409 SignatureForm.DelayMS = 5000;
2412 X = left + (Width - SignatureForm.Width) / 2;
2413 Y = top + (Height - SignatureForm.Height) / 2;
2414 SignatureForm.Move X, Y;
2415 SignatureForm.Show vbModeless, Me;
2419 static void menSoundFX_Click()
2422 menSoundFX.Checked = ! menSoundFX.Checked;
2423 FXOnFlag = (menSoundFX.Checked ? -1 : 0);
2429 // static void menPlay_Click()
2430 void menPlay_Click()
2434 boolean OldEditFlag;
2436 // Trace "MainForm", "--> menPlay_Click()"
2443 SignatureForm.DelayMS = 1;
2444 menPlay.Enabled = False;
2445 menPause.Enabled = True;
2446 menStop.Enabled = True;
2447 cmdPlay.Enabled = False;
2448 cmdPause.Enabled = True;
2449 cmdStop.Enabled = True;
2450 cmdPlayDemo.Enabled = False;
2451 menPlayDemo.Enabled = False;
2452 cmdRecordDemo.Enabled = False;
2453 menRec.Enabled = False;
2454 menFaster.Enabled = True;
2455 menSlower.Enabled = True;
2456 if (cmdPlayAll.STRING_IS_LIKE(Caption, "Play*"))
2458 cmdPlayAll.Enabled = False;
2459 menPlayAll.Enabled = False;
2462 cmbFile.Enabled = False;
2463 cmbLevel.Enabled = False;
2464 OldEditFlag = EditFlag;
2468 menEditMain.Enabled = False;
2469 if (DemoFlag == 0 && RecordDemoFlag == 0)
2470 lblStatus = "Playing";
2479 LastTick = T.TickNow();
2483 fpsTim.Enabled = True;
2497 printf("::: MainForm.c: menPlay_Click(): subFetchAndInitLevelB(): ...\n");
2500 subFetchAndInitLevelB();
2503 printf("::: MainForm.c: menPlay_Click(): subFetchAndInitLevelB(): done\n");
2508 // Trace "MainForm", "CountDown 1"
2509 CountDown(2, (0 == DemoFlag));
2510 // Trace "MainForm", "Call GoPlay"
2514 // Trace "MainForm", "GoPlay returned"
2518 if (LevelStatus == 1)
2520 lblStatus = "(float)Success";
2524 lblStatus = "Try (float)again";
2529 // Trace "MainForm", "CountDown 1"
2530 CountDown(1, False);
2538 // Trace "MainForm", "Call subFetchAndInitLevel"
2540 subFetchAndInitLevel();
2542 // Trace "MainForm", "subFetchAndInitLevel returned"
2550 menEditMain.Enabled = True;
2554 // Trace "MainForm", "<-- menPlay_Click()"
2561 // static void menPlayDemo_Click()
2562 void menPlayDemo_Click()
2568 lblStatus = "Demo Playback";
2574 return; /* return after initialization phase */
2578 if (LevelStatus != 1)
2579 lblStatus = "Demo Failed";
2587 // static void menPlayDemo_Click()
2588 void menPlayDemo_Click()
2594 lblStatus = "Demo Playback";
2600 if (LevelStatus != 1)
2601 lblStatus = "Demo Failed";
2611 static void menRec_Click()
2613 Trace("MainForm", "--> menRec_Click()");
2622 lblStatus.ForeColor = vbRed;
2623 lblStatus = "Recording Demo";
2624 // DemoBuffer = New DemoBufferObject; // (handle this later, if needed)
2625 Debug.Assert(! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)));
2626 Trace("MainForm", "Call menPlayClick");
2628 Trace("MainForm", "menPlayClick returned");
2630 lblStatus.ForeColor = vbButtonText;
2632 Let_ModifiedFlag(True);
2633 if (! STRING_IS_LIKE(CurPath, TmpPath))
2639 LInfo.DemoRandomSeed = RecDemoRandomSeed;
2640 Trace("MainForm", "Call SaveMPX(TmpPath)");
2642 Trace("MainForm", "Set DemoBuffer == Nothing");
2643 SET_TO_NOTHING(&DemoBuffer, sizeof(DemoBuffer));
2644 Trace("MainForm", "Call subFetchAndInitLevel");
2645 subFetchAndInitLevel();
2646 cmdPlayDemo.Enabled = DemoAvailable;
2647 Trace("MainForm", "<-- menRec_Click()");
2650 static void menReRecordDemo_Click()
2660 lblStatus.ForeColor = vbRed;
2661 lblStatus = "ReRecording Demo";
2662 // DemoBuffer = New DemoBufferObject; // (handle this later, if needed)
2663 Debug.Assert(! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)));
2665 lblStatus.ForeColor = vbButtonText;
2667 Let_ModifiedFlag(True);
2668 if (! STRING_IS_LIKE(CurPath, TmpPath))
2674 LInfo.DemoRandomSeed = RecDemoRandomSeed;
2676 SET_TO_NOTHING(&DemoBuffer, sizeof(DemoBuffer));
2677 subFetchAndInitLevel();
2680 void menStop_Click()
2687 fpsTim.Enabled = False;
2689 lblFps.Caption = "";
2690 menRec.Enabled = True;
2691 menPlay.Enabled = True;
2692 menPause.Enabled = False;
2693 menStop.Enabled = False;
2694 cmdPlay.Enabled = True;
2695 cmdPause.Enabled = False;
2696 cmdStop.Enabled = False;
2697 cmdRecordDemo.Enabled = True;
2698 cmdPlayDemo.Enabled = DemoAvailable;
2699 cmdPlayAll.Enabled = DemosAvailable;
2700 menPlayDemo.Enabled = DemoAvailable;
2701 menPlayAll.Enabled = DemosAvailable;
2702 menFaster.Enabled = False;
2703 menSlower.Enabled = False;
2704 cmbFile.Enabled = True;
2705 cmbLevel.Enabled = True;
2708 static void menStretch_Click(int Index)
2710 ReStretch(0.25 * Index);
2711 // DisplayLevel True
2714 static void menToolTips_Click()
2717 menToolTips.Checked = ! menToolTips.Checked;
2718 if (menToolTips.Checked)
2720 cmdPlay.ToolTipText = "Play Game (Space)";
2721 cmdPause.ToolTipText = "Pause (P)";
2722 cmdStop.ToolTipText = "Stop (Q)";
2723 cmdPlayDemo.ToolTipText = "Play demo (Ctrl+Space)";
2724 cmdRecordDemo.ToolTipText = "Record demo (Ctrl+R)";
2725 lblInfoCount.ToolTipText = "Number of infotrons needed";
2726 lblRedDiskCount.ToolTipText = "Number of red disks";
2727 cmbLevel.ToolTipText = "List of all levels in the file";
2728 cmbFile.ToolTipText = "List of files in current directory";
2729 lblFps.ToolTipText = "Animation speed in fps";
2730 lblFrameCount.ToolTipText = "Game time in frames";
2734 cmdPlay.ToolTipText = "";
2735 cmdPause.ToolTipText = "";
2736 cmdStop.ToolTipText = "";
2737 cmdPlayDemo.ToolTipText = "";
2738 cmdRecordDemo.ToolTipText = "";
2739 lblInfoCount.ToolTipText = "";
2740 lblRedDiskCount.ToolTipText = "";
2741 cmbLevel.ToolTipText = "";
2742 cmbFile.ToolTipText = "";
2743 lblFps.ToolTipText = "";
2744 lblFrameCount.ToolTipText = "";
2750 static void menTrim_Click()
2755 OldOPath = OrigPath;
2757 Tmp.SpecialPortCount = 0; // hack: all special ports are deleted
2759 CreateLevel(FMark.Width, FMark.Height);
2761 OrigPath = OldOPath;
2763 menSelectAll_Click();
2765 picViewPort_Resize();
2768 static void menZonkOff_Click()
2770 menZonkOn.Checked = False;
2771 menZonkOff.Checked = True;
2776 static void menZonkOn_Click()
2778 menZonkOn.Checked = True;
2779 menZonkOff.Checked = False;
2784 static void PanelTim_Timer()
2789 if (PanelSeq < Panel.Height && -1 < PanelSeq)
2791 PanelSeq = (ShowPanel != 0 ? PanelSeq + 2 : PanelSeq - 2);
2792 Tmp = ScaleHeight - Tmp + PanelSeq;
2794 picViewPort.Height = Tmp;
2798 PanelTim.Enabled = False;
2799 PanelSeq = (PanelSeq < 0 ? 0 : PanelSeq - );
2800 ShowPanel = (ShowPanel == 0 ? 1 : 0);
2801 menPanel.Checked = (ShowPanel != 0);
2805 static void picKeys_MouseUp(int Button, int Shift, float X, float Y)
2807 FocusTim.Enabled = True;
2810 static void picMenu_Click()
2814 static void picPane_KeyDown(int KeyCode, int Shift)
2816 if (KeyCode < 0 || 255 < KeyCode)
2819 KeyState[KeyCode] = True;
2823 if (MouseButton == 0 && EditFlag)
2824 picPane.MousePointer = 15;
2842 if (DemoFlag != 0 && 2 == Shift)
2851 bCapturePane = ! bCapturePane;
2856 static void picPane_KeyUp(int KeyCode, int Shift)
2858 if (KeyCode < 0 || 255 < KeyCode)
2861 KeyState[KeyCode] = False;
2865 if (menFaster.Enabled)
2871 if (menSlower.Enabled)
2877 if (2 == Shift) // ctrl+space
2879 if (menPlayDemo.Enabled)
2880 menPlayDemo_Click();
2885 if (menPlay.Enabled)
2892 if (menStop.Enabled)
2905 if (menPause.Enabled && (Shift == 0))
2911 if (MouseButton == 0 && EditFlag)
2912 picPane.MousePointer = 0;
2917 static void picPane_MouseDown(int Button, int Shift, float X, float Y)
2921 MouseButton = Button;
2922 OldEdMode = EditMode;
2925 if (Button == 2 && Shift != 2)
2927 EditMode = edSelect;
2945 picPane.MousePointer = 5; // size
2946 UserDragFlag = True;
2950 SetField(X, Y, ToolBox.ASpriteIndex);
2954 FMark.SetPoint1 EdGetX(X), EdGetY(Y);
2959 EditMode = OldEdMode;
2962 static void picPane_MouseMove(int Button, int Shift, float X, float Y)
2967 OldEdMode = EditMode;
2970 if (EditFlag && Button == 2 && Shift != 2)
2972 EditMode = edSelect;
2986 Oldflag = NoDisplayFlag;
2987 NoDisplayFlag = False;
2988 ScrollTo(OSX - X + MDX, OSY - Y + MDY);
2990 NoDisplayFlag = Oldflag;
2994 SetField(X, Y, ToolBox.ASpriteIndex);
2998 FMark.SetPoint2 EdGetX(X), EdGetY(Y);
3003 EditMode = OldEdMode;
3006 static void picPane_MouseUp(int Button, int Shift, float X, float Y)
3008 MouseButton = MouseButton ^ Button;
3009 picPane.MousePointer = 0;
3010 UserDragFlag = False;
3011 if (menEditMain.Enabled && Button == 2)
3013 if (MDX == X && MDY == Y)
3014 PopupMenu menEditMain;
3020 static void picPane_Paint()
3024 Oldflag = NoDisplayFlag;
3025 NoDisplayFlag = False;
3031 NoDisplayFlag = Oldflag;
3034 static void ReStretch(float NewStretch)
3039 long BW2, LW, LH, i;
3043 printf("::: MainForm.c: ReStretch(): %d, %d\n", Loaded, LevelLoaded);
3049 printf("::: NewStretch == %f\n", NewStretch);
3052 Stretch = NewStretch;
3058 SET_TO_NOTHING(&Stage, sizeof(Stage));
3059 SET_TO_NOTHING(&StretchedSprites, sizeof(StretchedSprites));
3060 menStretch(Stretch / 0.25).Checked = False;
3063 Stretch = NewStretch;
3066 menStretch(Stretch / 0.25).Checked = True;
3067 // StretchWidth = BaseWidth ' * NewStretch
3068 // StretchWidth2 = StretchWidth \ 2
3069 // TwoPixels = 2 '* Stretch
3070 // StretchLoad Sprites, imgMpx.Picture, 16, 16
3073 BW2 = StretchWidth / 2;
3074 LW = (FieldWidth + 2) * BaseWidth; // StretchWidth
3075 LH = (FieldHeight + 2) * BaseWidth; // StretchWidth
3078 // i = bmpStage.CreateAtSize(LW, LH)
3079 // Stage = New DDScrollBuffer; // (handle this later, if needed)
3080 i = Stage.CreateAtSize(LW, LH, picPane.hWnd);
3081 // Set StretchedSprites = NormalSprites.GetStretchCopy(Stretch)
3082 ReLoadStretchSprites();
3083 if (i == 0 || IS_NOTHING(&StretchedSprites, sizeof(StretchedSprites)))
3085 // menStretch(Stretch / 0.5).Enabled = False
3087 ReStretch(Stretch - 0.25);
3093 StretchedSprites.DestXOff = 1 * BaseWidth; // StretchWidth
3094 StretchedSprites.DestYOff = 1 * BaseWidth; // StretchWidth
3095 Stage.DestXOff = 1 * StretchWidth;
3096 Stage.DestYOff = 1 * StretchWidth;
3097 StretchedSprites.DestinationSurface = Stage.Surface;
3103 if (Loaded && LevelLoaded)
3106 printf("::: MainForm.c: ReStretch(): ...\n");
3110 picViewPort_Resize();
3114 subCalculateScreenScrollPos();
3117 printf("::: MainForm.c: ReStretch(): %d, %d\n", ScreenScrollXPos, ScreenScrollYPos);
3120 ScrollTo(ScreenScrollXPos, ScreenScrollYPos);
3135 static void SetScrollEdges()
3137 void SetScrollEdges()
3141 printf("::: MainForm.c: SetScrollEdges() ... [%ld, %ld, %ld, %ld] [%f, %d] [%d, %d, %d, %d]\n",
3142 DisplayMinX, DisplayMinY, DisplayMaxX, DisplayMaxY,
3144 ScrollMinX, ScrollMinY, ScrollMaxX, ScrollMaxY);
3147 ScrollMinX = (int)(DisplayMinX - 0.5) * Stretch * BaseWidth;
3148 ScrollMinY = (int)(DisplayMinY - 0.5) * Stretch * BaseWidth;
3149 ScrollMaxX = (int)(DisplayMaxX + 1.5) * Stretch * BaseWidth - picPane.Width;
3150 ScrollMaxY = (int)(DisplayMaxY + 1.5) * Stretch * BaseWidth - picPane.Height;
3153 printf("::: MainForm.c: SetScrollEdges() done [%d, %d, %d, %d]\n",
3154 ScrollMinX, ScrollMinY, ScrollMaxX, ScrollMaxY);
3158 void DrawField(int X, int Y)
3163 Tmp = LowByte(PlayField16[tsi]);
3167 if (Tmp == fiRAM || Tmp == fiHardWare)
3168 Tmp = DisPlayField[tsi];
3170 if (Tmp == fiBug || Tmp == 40)
3171 Tmp = DisPlayField[tsi];
3175 if (Tmp > fiOrangeDisk && Tmp < fiSnikSnak)
3176 Tmp = DisPlayField[tsi];
3180 if (Tmp >= 0 && Tmp <= 40)
3182 subCopyImageToScreen(tsi, fiGraphic[Tmp]);
3185 if (Tmp != fiSpace && Tmp != fiSnikSnak && Tmp != fiElectron)
3186 GfxGraphic[X][Y] = fiGraphic[Tmp];
3190 StretchedSprites.BltEx(StretchWidth * X, StretchWidth * Y, Tmp);
3194 void DrawFieldAnimated(int X, int Y)
3199 Tmp = LowByte(PlayField16[tsi]);
3203 subDrawAnimatedSnikSnaks(tsi);
3207 subDrawAnimatedElectrons(tsi);
3211 // If 40 < Tmp Then Tmp = 0
3212 // If Tmp = fiRAM Or Tmp = fiHardWare Then Tmp = DisPlayField(tsi)
3213 // If Tmp = fiBug Or Tmp = 40 Then Tmp = DisPlayField(tsi)
3215 // If fiOrangeDisk < Tmp And Tmp < fiSnikSnak Then Tmp = DisPlayField(tsi)
3217 // StretchedSprites.BltEx StretchWidth * X, StretchWidth * Y, Tmp
3222 void DrawFieldNoAnimated(int X, int Y)
3227 Tmp = LowByte(PlayField16[tsi]);
3232 subCopyImageToScreen(tsi, aniSpace);
3234 StretchedSprites.BltEx(StretchWidth * X, StretchWidth * Y, fiSpace);
3240 subCopyImageToScreen(tsi, aniSpace);
3242 StretchedSprites.BltEx(StretchWidth * X, StretchWidth * Y, fiSpace);
3250 if (Tmp == fiRAM || Tmp == fiHardWare)
3251 Tmp = DisPlayField[tsi];
3253 if (Tmp == fiBug || Tmp == 40)
3254 Tmp = DisPlayField[tsi];
3258 if (Tmp > fiOrangeDisk && Tmp < fiSnikSnak)
3259 Tmp = DisPlayField[tsi];
3264 printf("::: MainForm.c: DrawFieldNoAnimated(): %d, %d [%d]\n",
3269 if (Tmp >= 0 && Tmp <= 40)
3271 subCopyImageToScreen(tsi, fiGraphic[Tmp]);
3274 if (Tmp != fiSpace && Tmp != fiSnikSnak && Tmp != fiElectron)
3275 GfxGraphic[X][Y] = fiGraphic[Tmp];
3279 StretchedSprites.BltEx(StretchWidth * X, StretchWidth * Y, Tmp);
3286 void DrawSprite(int X, int Y, int SpritePos)
3288 StretchedSprites.BltEx(StretchWidth * X, StretchWidth * Y, SpritePos);
3293 void InvalidateRect(long XMin, long YMin, long XMax, long YMax)
3297 // For Y = YMin To YMax
3298 // For X = XMin To XMax
3299 // Field(X, Y).GraphicsValid = 0
3304 static void picViewPort_MouseUp(int Button, int Shift, float X, float Y)
3306 FocusTim.Enabled = True;
3309 static void picViewPort_Paint()
3311 // Debug.Print "picViewPort_Paint()"
3316 static void picViewPort_Resize()
3319 long bdX, bdY, PanelVisibility;
3324 bdX = picFrame.Width - picFrame.ScaleWidth;
3325 bdY = picFrame.Height - picFrame.ScaleHeight;
3326 dx = Min(picViewPort.ScaleWidth - bdX, (DisplayWidth - 1) * Stretch * BaseWidth);
3328 dY = Min(picViewPort.ScaleHeight - bdX, (DisplayHeight - 1) * Stretch * BaseWidth);
3330 B = s.Read("LimitToOriginalFieldSize", False);
3331 PanelVisibility = 24 * (Panel.Height - PanelSeq - (float)1) / Panel.Height;
3334 dx = Min(320 * Stretch, dx);
3335 dY = Min((200 - PanelVisibility) * Stretch, dY);
3338 X = Max((picViewPort.ScaleWidth - dx) / 2, 0);
3339 Y = Max((picViewPort.ScaleHeight - dY) / 2, 0);
3340 picPane.Move X, Y, dx, dY;
3341 picFrame.Move X - bdX / 2, Y - bdY / 2, dx + bdX, dY + bdY;
3347 printf("::: MainForm.c: picViewPort_Resize(): %d, %d\n", ScrollX, ScrollY);
3350 ScrollTo(ScrollX, ScrollY);
3352 // SizeTim.Interval = 1
3358 // Private Sub SizeTim_Timer()
3360 // SizeTim.Interval = 0
3361 // wdX = Max(0, picViewPort.ScaleWidth - picPane.Width) * Screen.TwipsPerPixelX
3362 // wdY = Max(0, picViewPort.ScaleHeight - picPane.Height) * Screen.TwipsPerPixelY
3363 // If (0 < wdX) Or (0 < wdY) Then
3364 // Move Left, Top, Width - wdX, Height - wdY
3368 static void LoadKeyIndicators()
3372 picKeys.BackColor = vbButtonFace;
3373 for (i = 2; i <= 5; i++)
3378 for (i = 1; i <= 5; i++)
3380 shpKey(i).FillColor = vbButtonFace;
3381 shpKey(i).Visible = True;
3384 shpKey(1).Move 7, 0;
3385 shpKey(2).Move 0, 7;
3386 shpKey(3).Move 7, 14;
3387 shpKey(4).Move 14, 7;
3388 shpKey(5).Move 7, 7;
3391 void ShowKey(int KeyVar)
3393 boolean State[5 + 1];
3397 static boolean LastState[5 + 1];
3409 State[KeyVar] = True;
3415 State[KeyVar - 4] = True;
3419 for (i = 1; i <= 5; i++)
3422 if (Tmp ^ LastState[i])
3424 Col = (i == 5 ? vbRed : vbGreen);
3425 shpKey(i).FillColor = (Tmp ? Col : vbButtonFace);
3432 static void GetSettings()
3442 APath = WithSlash(App.Path);
3443 CurPath = s.Read("LastPath", APath);
3445 // window width and height
3446 X = s.Read("Width", Width);
3447 Y = s.Read("Height", Height);
3448 if (X < 0 Then X == 0: If Y < 0)
3451 if (Screen.Width < X)
3454 if (Screen.Height < Y)
3459 // window position and state
3460 X = s.Read("Left", left);
3461 Y = s.Read("Top", top);
3462 if (X < 0 Then X == 0: If Y < 0)
3465 if (Screen.Width < (X + Width))
3466 X = Screen.Width - Width;
3468 if (Screen.Height < (Y + Height))
3469 Y = Screen.Height - Height;
3473 WindowState = s.Read("WinState", vbNormal);
3475 Flag = s.Read("ShowToolTips", True);
3477 menToolTips_Click();
3479 menBorder.Checked = ! CBool(s.Read("ShowBorder", False));
3480 Flag = CBool(s.Read("AutoScroll", True));
3483 AutoScrollFlag = False;
3484 menAutoScroll.Checked = False;
3487 Flag = CBool(s.Read("SoundFX", True));
3488 FXOnFlag = (Flag ? -1 : 0);
3489 menSoundFX.Checked = Flag;
3490 SignatureDelay = CLng(s.Read("SignatureDelay", 3000));
3491 AllowRedDiskCheat = CInt(s.Read("AllowRedDiskCheat", 1));
3492 AllowEatRightRedDiskBug = CInt(s.Read("AllowEatRightRedDiskBug", 1));
3493 MySignature = s.Read("MySignature", "");
3495 X = s.Read("FrameDelayPlay", 1000000 / 35);
3496 i = GetSpeedIndex(X);
3497 menPlaySpeed_Click(i);
3498 X = s.Read("FrameDelayDemo", 1000000 / 35);
3499 i = GetSpeedIndex(X);
3500 menDemoSpeed_Click(i);
3502 i = s.Read("Stretch", 4);
3503 if (i < menStretch.LBound || menStretch.UBound < i)
3506 menStretch_Click (i);
3510 static void SaveSettings()
3516 s.Save "LastPath", (ModifiedFlag ? OrigPath : CurPath);
3517 if (WindowState != vbMinimized)
3519 s.Save "Width", Width;
3520 s.Save "Height", Height;
3521 s.Save "Left", left;
3523 s.Save "WinState", WindowState;
3526 s.Save "ShowToolTips", menToolTips.Checked;
3527 s.Save "ShowBorder", menBorder.Checked;
3528 s.Save "AutoScroll", menAutoScroll.Checked;
3529 s.Save "SoundFX", menSoundFX.Checked;
3530 s.Save "SignatureDelay", SignatureDelay;
3531 s.Save "AllowRedDiskCheat", AllowRedDiskCheat;
3532 s.Save "AllowEatRightRedDiskBug", AllowEatRightRedDiskBug;
3533 s.Save "MySignature", MySignature;
3535 s.Save "FrameDelayPlay", DeltaTPlay;
3536 s.Save "FrameDelayDemo", DeltaTDemo;
3538 for (i = menStretch.LBound; i <= menStretch.UBound; i++)
3540 if (menStretch(i).Checked)
3544 s.Save "Stretch", i;
3549 void ReLoadStretchSprites()
3552 BitMapObject NBMP, SBMP;
3555 // If Stretch = 1 Then
3556 MpxBmp = App.Path & "/Mpx.bmp";
3558 // MpxBmp = App.Path & "\Mpx" & Stretch & ".bmp"
3559 // tmpMpxBmp = App.Path & "\Mpx.bmp"
3560 // If FileExists(MpxBmp) And FileExists(tmpMpxBmp) Then
3561 // If FileDateTime(MpxBmp) < FileDateTime(tmpMpxBmp) Then
3565 // If Not FileExists(MpxBmp) Then
3566 // MousePointer = 11
3567 // // Set NBMP = New BitMapObject // (handle this later, if needed)
3568 // tmpMpxBmp = App.Path & "\Mpx.bmp"
3569 // If Not FileExists(tmpMpxBmp) Then
3570 // ReportError "ReLoadStretchSprites", "File not found: " & tmpMpxBmp
3571 // MESSAGE_BOX("an error occured"); // MsgBox "File not found: " & tmpMpxBmp, vbCritical, "MegaPlex - Error"
3574 // NBMP.CreateFromFile tmpMpxBmp
3575 // Set SBMP = NBMP.GetStretchCopy(Stretch)
3576 // SBMP.SaveToFile MpxBmp
3577 // Set NBMP = Nothing
3578 // Set SBMP = Nothing
3582 // StretchedSprites = New DDSpriteBuffer; // (handle this later, if needed)
3583 if (! StretchedSprites.CreateFromFile(MpxBmp, 16, 16))
3584 SET_TO_NOTHING(&StretchedSprites, sizeof(StretchedSprites));
3587 void SaveSnapshot(currency Number)
3591 Path = CAT(WithSlash(App.Path), "Capture");
3595 Path = Path & "\" & Format(Number, "00000000") & ".bmp";
3596 SavePicture CaptureWindow(picPane.hWnd, True, 0, 0, picPane.ScaleWidth, picPane.ScaleHeight), Path;