1 // ----------------------------------------------------------------------------
3 // ----------------------------------------------------------------------------
9 static void SaveMPX(char *Path);
10 static void SaveSP(char *Path);
13 // static char *VB_Name = "modMPX";
14 // --- Option Explicit
17 boolean bSignatureAvailable;
19 const char MPX_ID[4] = "MPX ";
21 // ::: #ifndef HAS_LevelDescriptor
28 // ::: } LevelDescriptor;
29 // ::: #define HAS_LevelDescriptor
34 boolean DemoAvailable;
35 LevelDescriptor *LDesc;
39 boolean MpxOpen(char *Path)
49 // --- On Error GoTo OpenMPXEH
50 // OFile = FreeFile();
51 OFile = fopen(CurPath, "rb");
52 FILE_GET(OFile, -1, &readID, sizeof(readID));
56 FILE_GET(OFile, -1, &MPXVersion, sizeof(MPXVersion));
57 FILE_GET(OFile, -1, &LevelCount, sizeof(LevelCount));
58 LDesc = REDIM_1D(sizeof(LevelDescriptor), 0, LevelCount + 1 - 1);
59 FILE_GET(OFile, -1, &LDesc, sizeof(LDesc));
70 boolean MpxLoadLInfo(int i)
81 Off = LDesc[i].OffSet;
82 Off = Off + LDesc[i].Width * LDesc[i].Height;
84 // --- On Error GoTo MpxLoadLInfoEH
85 FILE_GET(OFile, Off, &LInfo, sizeof(LInfo));
113 Trace("modMPX", "--> ReadMPX");
115 // --- On Error GoTo ReadMPXEH
116 // FNum = FreeFile();
117 Trace("modMPX", "open file");
118 FNum = fopen(CurPath, "rb");
119 FILE_GET(FNum, -1, &readID, sizeof(readID));
120 if (readID != MPX_ID)
123 FILE_GET(FNum, -1, &MPXVersion, sizeof(MPXVersion));
127 FILE_GET(FNum, -1, &LevelCount, sizeof(LevelCount));
131 LDesc = REDIM_1D(sizeof(LevelDescriptor), 0, LevelCount + 1 - 1);
132 Trace("modMPX", "--> read LevelDescriptor");
133 FILE_GET(FNum, -1, &LDesc, sizeof(LDesc));
134 FieldWidth = LDesc[LevelNumber].Width;
135 FieldHeight = LDesc[LevelNumber].Height;
137 FieldMax = (FieldWidth * FieldHeight) + HeaderSize - 1;
138 LevelMax = (FieldWidth * FieldHeight) - 1;
139 FileMax = LDesc[LevelNumber].Size - 1;
140 if (FileMax < FieldMax)
143 Trace("modMPX", "ReDim PlayField8");
144 PlayField8 = REDIM_1D(sizeof(byte), 0, FileMax + 1 - 1);
145 DisPlayField = REDIM_1D(sizeof(byte), 0, FieldMax + 1 - 1);
146 i = LDesc[LevelNumber].OffSet;
148 FILE_GET(FNum, i, PlayField8, FileMax + 1);
150 FILE_GET(FNum, i, &PlayField8, sizeof(PlayField8));
152 i = i + LevelMax + 1;
153 FILE_GET(FNum, i, &LInfo, sizeof(LInfo)); // store level info in an extra structure
155 // --- On Error GoTo 0
157 Trace("modMPX", "file closed");
158 if (FieldMax < FileMax)
159 DemoAvailable = True;
161 Trace("modMPX", "read signature");
163 Trace("modMPX", "ReDim PlayField16");
164 PlayField16 = REDIM_1D(sizeof(int), -FieldWidth, FieldMax);
165 for (i = 0; i <= FieldMax; i++)
167 PlayField16[i] = PlayField8[i];
168 DisPlayField[i] = PlayField8[i];
172 AnimationPosTable = REDIM_1D(sizeof(int), 0, LevelMax - 2 *FieldWidth);
173 AnimationSubTable = REDIM_1D(sizeof(byte), 0, LevelMax - 2 *FieldWidth);
174 TerminalState = REDIM_1D(sizeof(byte), 0, FieldMax + 1 - 1);
175 GravityFlag = LInfo.InitialGravity;
176 FreezeZonks = LInfo.InitialFreezeZonks;
177 DemoPointer = FieldMax + 1;
178 DemoOffset = DemoPointer;
179 DemoKeyRepeatCounter = 0;
182 // Debug.Print "ReadMPX: " & Hex(LInfo.DemoRandomSeed)
183 RandomSeed = LInfo.DemoRandomSeed;
191 MainForm.SetDisplayRegion();
193 if (CurPath != TmpPath)
194 Let_ModifiedFlag(False);
196 Trace("modMPX", "--> ReadMPX");
202 ReportError("modMPX", CAT("Error reading MPX file ", CurPath));
203 Trace("modMPX", "Error reading MPX file");
204 Trace("modMPX", "--> ReadMPX");
209 static void SaveMPX(char *Path)
221 if ((FileMax < FieldMax) || ! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)))
224 LDesc = REDIM_1D(sizeof(LevelDescriptor), 0, LevelCount + 1 - 1);
226 LDesc[LevelNumber].Width = FieldWidth;
227 LDesc[LevelNumber].Height = FieldHeight;
228 LDesc[LevelNumber].OffSet = 4 + 2 * strlen(INT_TO_STR(LevelCount)) +
229 LevelCount * sizeof(LDesc[1]) + 1;
230 LDesc[LevelNumber].Size = FileMax + 1;
231 if (! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)))
233 LDesc[LevelNumber].Size = LDesc[LevelNumber].Size + DemoBuffer.Size + 2;
234 if (0 < strlen(MySignature))
235 LDesc[LevelNumber].Size = LDesc[LevelNumber].Size + strlen(MySignature) + 1;
242 // --- On Error GoTo SaveMPXEH
243 // FNum = FreeFile();
244 if (FileExists(Path))
247 FNum = fopen(Path, "wb");
248 FILE_PUT(FNum, -1, &MPX_ID, sizeof(MPX_ID));
249 FILE_PUT(FNum, -1, &MPXVersion, sizeof(MPXVersion));
250 FILE_PUT(FNum, -1, &LevelCount, sizeof(LevelCount));
251 FILE_PUT(FNum, -1, &LDesc, sizeof(LDesc));
252 i = LDesc[LevelNumber].OffSet;
253 FILE_PUT(FNum, i, &PlayField8, sizeof(PlayField8));
254 FILE_PUT(FNum, i, &DisPlayField, sizeof(DisPlayField));
255 i = i + LevelMax + 1;
256 FILE_PUT(FNum, i, &LInfo, sizeof(LInfo)); // store level info
257 if (! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer))) // demo was recorded
259 // Debug.Print "SaveMPX: " & Hex(LInfo.DemoRandomSeed)
260 FILE_PUT(FNum, -1, &FirstDemoByte, sizeof(FirstDemoByte));
261 if (! DemoBuffer.Serialize(FNum))
264 FILE_PUT(FNum, -1, &FF, sizeof(FF));
265 if (0 < strlen(MySignature))
267 FILE_PUT(FNum, -1, &MySignature, sizeof(MySignature));
268 FILE_PUT(FNum, -1, &FF, sizeof(FF));
273 // --- On Error GoTo 0
280 Let_ModifiedFlag(False);
293 static void SaveSP(char *Path)
302 if (! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)))
303 LInfo.CheckSumByte = DemoBuffer.CheckSumByte;
305 if ((FileMax < FieldMax) || ! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)))
310 // --- On Error GoTo SaveSPEH
311 // FNum = FreeFile();
312 FNum = fopen(Path, "wb");
313 FILE_PUT(FNum, 1, &PlayField8, sizeof(PlayField8));
314 FILE_PUT(FNum, 1, &DisPlayField, sizeof(DisPlayField));
316 FILE_PUT(FNum, i, &LInfo, sizeof(LInfo)); // store level info
317 if (! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer))) // demo was recorded
319 // Debug.Print "SaveMPX: " & Hex(LInfo.DemoRandomSeed)
320 // If Not DemoBuffer.Serialize(FNum) Then GoTo SaveSPEH
322 // Debug.Assert(False);
326 // --- On Error GoTo 0
333 Let_ModifiedFlag(False);
343 void CreateLevel(int LWidth, int LHeight)
348 CurPath = "Untitled";
352 FieldHeight = LHeight;
354 FieldMax = (FieldWidth * FieldHeight) + HeaderSize - 1;
355 LevelMax = (FieldWidth * FieldHeight) - 1;
357 PlayField8 = REDIM_1D(sizeof(byte), 0, FileMax + 1 - 1);
358 DisPlayField = REDIM_1D(sizeof(byte), 0, FieldMax + 1 - 1);
359 Tmp = FieldWidth * (FieldHeight - 1);
360 for (i = 0; i <= FieldWidth - 1; i++)
362 PlayField8[i] = fiHardWare;
363 PlayField8[Tmp + i] = fiHardWare;
367 for (i = FieldWidth; i <= Tmp; i += FieldWidth)
369 PlayField8[i] = fiHardWare;
370 PlayField8[i - 1] = fiHardWare;
374 LInfo.DemoRandomSeed = 0;
375 LInfo.InfotronsNeeded = 0;
376 LInfo.InitialFreezeZonks = 0;
377 LInfo.InitialGravity = 0;
378 strcpy(LInfo.LevelTitle, "------ New Level ------");;
379 LInfo.SpecialPortCount = 0;
380 LInfo.Version = 0x74; // immitate speedfix version 5.4
382 PlayField16 = REDIM_1D(sizeof(int), -FieldWidth, FieldMax);
383 for (i = 0; i <= FieldMax; i++)
385 PlayField16[i] = PlayField8[i];
386 DisPlayField[i] = PlayField8[i];
390 AnimationPosTable = REDIM_1D(sizeof(int), 0, LevelMax - 2 *FieldWidth);
391 AnimationSubTable = REDIM_1D(sizeof(byte), 0, LevelMax - 2 *FieldWidth);
392 TerminalState = REDIM_1D(sizeof(byte), 0, FieldMax + 1 - 1);
393 GravityFlag = LInfo.InitialGravity;
394 FreezeZonks = LInfo.InitialFreezeZonks;
395 RandomSeed = LInfo.DemoRandomSeed;
396 DemoAvailable = False;
397 SET_TO_NOTHING(&DemoBuffer, sizeof(DemoBuffer));
399 Let_ModifiedFlag(True);
406 Trace("modMPX", "--> ReadSignature");
407 bSignatureAvailable = False;
410 // ##################################################### ReRecording-Test
411 if ((DemoFlag == 1) && (RecordDemoFlag == 1))
413 FirstDemoByte = PlayField8[DemoPointer];
414 MySignature = gSignature;
417 // ##################################################### ReRecording-Test
419 // gSignature = String(511, "A"): bSignatureAvailable = False: Exit Sub 'test
420 if (! (FieldMax < FileMax))
423 // !!! Debug.Assert PlayField8(FileMax) = &HFF
424 Trace("modMPX", "settin iMin/Max");
425 iMin = FileMax - 512;
426 if (iMin < (FieldMax + 2))
430 Trace("modMPX", " For i == iMax To iMin Step -1");
431 for (i = iMax; i <= iMin; i += -1)
433 if (PlayField8[i] == 0xFF)
440 for (i = i + 1; i <= iMax; i++)
442 gSignature = CAT(gSignature, (char)(PlayField8[i]));
445 // ##################################################### ReRecording-Test
446 if ((DemoFlag == 1) && (RecordDemoFlag == 1))
447 MySignature = gSignature;
449 // ##################################################### ReRecording-Test
452 bSignatureAvailable = True;
454 Trace("modMPX", "<-- ReadSignature");