/* functions for loading Supaplex level */
/* ------------------------------------------------------------------------- */
+void setTapeInfoToDefaults_SP()
+{
+ native_sp_level.demo.is_available = FALSE;
+ native_sp_level.demo.length = 0;
+}
+
void setLevelInfoToDefaults_SP()
{
LevelInfoType *header = &native_sp_level.header;
char *empty_title = "-------- EMPTY --------";
int i, x, y;
- native_sp_level.width = SP_PLAYFIELD_WIDTH;
- native_sp_level.height = SP_PLAYFIELD_HEIGHT;
+ native_sp_level.game_sp = &game_sp;
+
+ native_sp_level.width = SP_STD_PLAYFIELD_WIDTH;
+ native_sp_level.height = SP_STD_PLAYFIELD_HEIGHT;
for (x = 0; x < native_sp_level.width; x++)
for (y = 0; y < native_sp_level.height; y++)
for (i = 0; i < SP_HEADER_SIZE; i++)
native_sp_level.header_raw_bytes[i] = 0x20;
- native_sp_level.demo.is_available = FALSE;
- native_sp_level.demo.length = 0;
+ setTapeInfoToDefaults_SP();
}
void copyInternalEngineVars_SP()
preceding_buffer_size += 8; /* eight 16-bit integer values */
#endif
+ /* needed for engine snapshots */
+ game_sp.preceding_buffer_size = preceding_buffer_size;
+
LInfo = native_sp_level.header;
FieldWidth = native_sp_level.width;
strSuffixLower(filename, ".mpx"));
boolean demo_available = is_single_level_file;
boolean is_mpx_file = strSuffixLower(filename, ".mpx");
- int file_seek_pos = level_pos * SP_LEVEL_SIZE;
- int level_width = SP_PLAYFIELD_WIDTH;
- int level_height = SP_PLAYFIELD_HEIGHT;
+ int file_seek_pos = level_pos * SP_STD_LEVEL_SIZE;
+ int level_width = SP_STD_PLAYFIELD_WIDTH;
+ int level_height = SP_STD_PLAYFIELD_HEIGHT;
/* always start with reliable default values */
setLevelInfoToDefaults_SP();
multipart_xpos, multipart_ypos, multipart_level.header.LevelTitle);
#endif
- if (multipart_xpos * SP_PLAYFIELD_WIDTH > SP_MAX_PLAYFIELD_WIDTH ||
- multipart_ypos * SP_PLAYFIELD_HEIGHT > SP_MAX_PLAYFIELD_HEIGHT)
+ if (multipart_xpos * SP_STD_PLAYFIELD_WIDTH > SP_MAX_PLAYFIELD_WIDTH ||
+ multipart_ypos * SP_STD_PLAYFIELD_HEIGHT > SP_MAX_PLAYFIELD_HEIGHT)
{
Error(ERR_WARN, "multi-part level is too big -- ignoring part of it");
}
multipart_level.width = MAX(multipart_level.width,
- multipart_xpos * SP_PLAYFIELD_WIDTH);
+ multipart_xpos * SP_STD_PLAYFIELD_WIDTH);
multipart_level.height = MAX(multipart_level.height,
- multipart_ypos * SP_PLAYFIELD_HEIGHT);
+ multipart_ypos * SP_STD_PLAYFIELD_HEIGHT);
/* copy level part at the right position of multi-part level */
- for (x = 0; x < SP_PLAYFIELD_WIDTH; x++)
+ for (x = 0; x < SP_STD_PLAYFIELD_WIDTH; x++)
{
- for (y = 0; y < SP_PLAYFIELD_HEIGHT; y++)
+ for (y = 0; y < SP_STD_PLAYFIELD_HEIGHT; y++)
{
- int start_x = (multipart_xpos - 1) * SP_PLAYFIELD_WIDTH;
- int start_y = (multipart_ypos - 1) * SP_PLAYFIELD_HEIGHT;
+ int start_x = (multipart_xpos - 1) * SP_STD_PLAYFIELD_WIDTH;
+ int start_y = (multipart_ypos - 1) * SP_STD_PLAYFIELD_HEIGHT;
multipart_level.playfield[start_x + x][start_y + y] =
native_sp_level.playfield[x][y];
return TRUE;
}
+
+void SaveNativeLevel_SP(char *filename)
+{
+ LevelInfoType *header = &native_sp_level.header;
+ FILE *file;
+ int i, x, y;
+
+ if (!(file = fopen(filename, MODE_WRITE)))
+ {
+ Error(ERR_WARN, "cannot save native level file '%s'", filename);
+
+ return;
+ }
+
+ /* write level playfield (width * height == 60 * 24 tiles == 1440 bytes) */
+ for (y = 0; y < native_sp_level.height; y++)
+ for (x = 0; x < native_sp_level.width; x++)
+ putFile8Bit(file, native_sp_level.playfield[x][y]);
+
+ /* write level header (96 bytes) */
+
+ WriteUnusedBytesToFile(file, 4);
+
+ putFile8Bit(file, header->InitialGravity);
+ putFile8Bit(file, header->Version);
+
+ for (i = 0; i < SP_LEVEL_NAME_LEN; i++)
+ putFile8Bit(file, header->LevelTitle[i]);
+
+ putFile8Bit(file, header->InitialFreezeZonks);
+ putFile8Bit(file, header->InfotronsNeeded);
+ putFile8Bit(file, header->SpecialPortCount);
+
+ for (i = 0; i < SP_MAX_SPECIAL_PORTS; i++)
+ {
+ SpecialPortType *port = &header->SpecialPort[i];
+
+ putFile16BitBE(file, port->PortLocation);
+ putFile8Bit(file, port->Gravity);
+ putFile8Bit(file, port->FreezeZonks);
+ putFile8Bit(file, port->FreezeEnemies);
+
+ WriteUnusedBytesToFile(file, 1);
+ }
+
+ putFile8Bit(file, header->SpeedByte);
+ putFile8Bit(file, header->CheckSumByte);
+ putFile16BitLE(file, header->DemoRandomSeed);
+
+ /* also save demo tape, if available */
+
+ if (native_sp_level.demo.is_available)
+ {
+ putFile8Bit(file, native_sp_level.demo.level_nr);
+
+ for (i = 0; i < native_sp_level.demo.length; i++)
+ putFile8Bit(file, native_sp_level.demo.data[i]);
+ }
+
+ fclose(file);
+}