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;
147 FILE_GET(FNum, i, &PlayField8, sizeof(PlayField8));
148 i = i + LevelMax + 1;
149 FILE_GET(FNum, i, &LInfo, sizeof(LInfo)); // store level info in an extra structure
151 // --- On Error GoTo 0
153 Trace("modMPX", "file closed");
154 if (FieldMax < FileMax)
155 DemoAvailable = True;
157 Trace("modMPX", "read signature");
159 Trace("modMPX", "ReDim PlayField16");
160 PlayField16 = REDIM_1D(sizeof(int), -FieldWidth, FieldMax);
161 for (i = 0; i <= FieldMax; i++)
163 PlayField16[i] = PlayField8[i];
164 DisPlayField[i] = PlayField8[i];
168 AnimationPosTable = REDIM_1D(sizeof(int), 0, LevelMax - 2 *FieldWidth);
169 AnimationSubTable = REDIM_1D(sizeof(byte), 0, LevelMax - 2 *FieldWidth);
170 TerminalState = REDIM_1D(sizeof(byte), 0, FieldMax + 1 - 1);
171 GravityFlag = LInfo.InitialGravity;
172 FreezeZonks = LInfo.InitialFreezeZonks;
173 DemoPointer = FieldMax + 1;
174 DemoOffset = DemoPointer;
175 DemoKeyRepeatCounter = 0;
178 // Debug.Print "ReadMPX: " & Hex(LInfo.DemoRandomSeed)
179 RandomSeed = LInfo.DemoRandomSeed;
187 MainForm.SetDisplayRegion();
189 if (CurPath != TmpPath)
190 Let_ModifiedFlag(False);
192 Trace("modMPX", "--> ReadMPX");
198 ReportError("modMPX", CAT("Error reading MPX file ", CurPath));
199 Trace("modMPX", "Error reading MPX file");
200 Trace("modMPX", "--> ReadMPX");
205 static void SaveMPX(char *Path)
217 if ((FileMax < FieldMax) || ! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)))
220 LDesc = REDIM_1D(sizeof(LevelDescriptor), 0, LevelCount + 1 - 1);
222 LDesc[LevelNumber].Width = FieldWidth;
223 LDesc[LevelNumber].Height = FieldHeight;
224 LDesc[LevelNumber].OffSet = 4 + 2 * strlen(INT_TO_STR(LevelCount)) +
225 LevelCount * sizeof(LDesc[1]) + 1;
226 LDesc[LevelNumber].Size = FileMax + 1;
227 if (! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)))
229 LDesc[LevelNumber].Size = LDesc[LevelNumber].Size + DemoBuffer.Size + 2;
230 if (0 < strlen(MySignature))
231 LDesc[LevelNumber].Size = LDesc[LevelNumber].Size + strlen(MySignature) + 1;
238 // --- On Error GoTo SaveMPXEH
239 // FNum = FreeFile();
240 if (FileExists(Path))
243 FNum = fopen(Path, "wb");
244 FILE_PUT(FNum, -1, &MPX_ID, sizeof(MPX_ID));
245 FILE_PUT(FNum, -1, &MPXVersion, sizeof(MPXVersion));
246 FILE_PUT(FNum, -1, &LevelCount, sizeof(LevelCount));
247 FILE_PUT(FNum, -1, &LDesc, sizeof(LDesc));
248 i = LDesc[LevelNumber].OffSet;
249 FILE_PUT(FNum, i, &PlayField8, sizeof(PlayField8));
250 FILE_PUT(FNum, i, &DisPlayField, sizeof(DisPlayField));
251 i = i + LevelMax + 1;
252 FILE_PUT(FNum, i, &LInfo, sizeof(LInfo)); // store level info
253 if (! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer))) // demo was recorded
255 // Debug.Print "SaveMPX: " & Hex(LInfo.DemoRandomSeed)
256 FILE_PUT(FNum, -1, &FirstDemoByte, sizeof(FirstDemoByte));
257 if (! DemoBuffer.Serialize(FNum))
260 FILE_PUT(FNum, -1, &FF, sizeof(FF));
261 if (0 < strlen(MySignature))
263 FILE_PUT(FNum, -1, &MySignature, sizeof(MySignature));
264 FILE_PUT(FNum, -1, &FF, sizeof(FF));
269 // --- On Error GoTo 0
276 Let_ModifiedFlag(False);
289 static void SaveSP(char *Path)
298 if (! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)))
299 LInfo.CheckSumByte = DemoBuffer.CheckSumByte;
301 if ((FileMax < FieldMax) || ! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer)))
306 // --- On Error GoTo SaveSPEH
307 // FNum = FreeFile();
308 FNum = fopen(Path, "wb");
309 FILE_PUT(FNum, 1, &PlayField8, sizeof(PlayField8));
310 FILE_PUT(FNum, 1, &DisPlayField, sizeof(DisPlayField));
312 FILE_PUT(FNum, i, &LInfo, sizeof(LInfo)); // store level info
313 if (! IS_NOTHING(&DemoBuffer, sizeof(DemoBuffer))) // demo was recorded
315 // Debug.Print "SaveMPX: " & Hex(LInfo.DemoRandomSeed)
316 // If Not DemoBuffer.Serialize(FNum) Then GoTo SaveSPEH
318 // Debug.Assert(False);
322 // --- On Error GoTo 0
329 Let_ModifiedFlag(False);
339 void CreateLevel(int LWidth, int LHeight)
344 CurPath = "Untitled";
348 FieldHeight = LHeight;
350 FieldMax = (FieldWidth * FieldHeight) + HeaderSize - 1;
351 LevelMax = (FieldWidth * FieldHeight) - 1;
353 PlayField8 = REDIM_1D(sizeof(byte), 0, FileMax + 1 - 1);
354 DisPlayField = REDIM_1D(sizeof(byte), 0, FieldMax + 1 - 1);
355 Tmp = FieldWidth * (FieldHeight - 1);
356 for (i = 0; i <= FieldWidth - 1; i++)
358 PlayField8[i] = fiHardWare;
359 PlayField8[Tmp + i] = fiHardWare;
363 for (i = FieldWidth; i <= Tmp; i += FieldWidth)
365 PlayField8[i] = fiHardWare;
366 PlayField8[i - 1] = fiHardWare;
370 LInfo.DemoRandomSeed = 0;
371 LInfo.InfotronsNeeded = 0;
372 LInfo.InitialFreezeZonks = 0;
373 LInfo.InitialGravity = 0;
374 strcpy(LInfo.LevelTitle, "------ New Level ------");;
375 LInfo.SpecialPortCount = 0;
376 LInfo.Version = 0x74; // immitate speedfix version 5.4
378 PlayField16 = REDIM_1D(sizeof(int), -FieldWidth, FieldMax);
379 for (i = 0; i <= FieldMax; i++)
381 PlayField16[i] = PlayField8[i];
382 DisPlayField[i] = PlayField8[i];
386 AnimationPosTable = REDIM_1D(sizeof(int), 0, LevelMax - 2 *FieldWidth);
387 AnimationSubTable = REDIM_1D(sizeof(byte), 0, LevelMax - 2 *FieldWidth);
388 TerminalState = REDIM_1D(sizeof(byte), 0, FieldMax + 1 - 1);
389 GravityFlag = LInfo.InitialGravity;
390 FreezeZonks = LInfo.InitialFreezeZonks;
391 RandomSeed = LInfo.DemoRandomSeed;
392 DemoAvailable = False;
393 SET_TO_NOTHING(&DemoBuffer, sizeof(DemoBuffer));
395 Let_ModifiedFlag(True);
402 Trace("modMPX", "--> ReadSignature");
403 bSignatureAvailable = False;
406 // ##################################################### ReRecording-Test
407 if ((DemoFlag == 1) && (RecordDemoFlag == 1))
409 FirstDemoByte = PlayField8[DemoPointer];
410 MySignature = gSignature;
413 // ##################################################### ReRecording-Test
415 // gSignature = String(511, "A"): bSignatureAvailable = False: Exit Sub 'test
416 if (! (FieldMax < FileMax))
419 // !!! Debug.Assert PlayField8(FileMax) = &HFF
420 Trace("modMPX", "settin iMin/Max");
421 iMin = FileMax - 512;
422 if (iMin < (FieldMax + 2))
426 Trace("modMPX", " For i == iMax To iMin Step -1");
427 for (i = iMax; i <= iMin; i += -1)
429 if (PlayField8[i] == 0xFF)
436 for (i = i + 1; i <= iMax; i++)
438 gSignature = CAT(gSignature, (char)(PlayField8[i]));
441 // ##################################################### ReRecording-Test
442 if ((DemoFlag == 1) && (RecordDemoFlag == 1))
443 MySignature = gSignature;
445 // ##################################################### ReRecording-Test
448 bSignatureAvailable = True;
450 Trace("modMPX", "<-- ReadSignature");