void CopyNativeLevel_RND_to_SP(struct LevelInfo *level)
{
- /* ... yet to be written ... */
+ struct LevelInfo_SP *level_sp = level->native_sp_level;
+ LevelInfoType *header = &level_sp->header;
+ int i, x, y;
+
+ level_sp->width = level->fieldx;
+ level_sp->height = level->fieldy;
+
+ for (x = 0; x < level->fieldx; x++)
+ {
+ for (y = 0; y < level->fieldy; y++)
+ {
+ int element_old = level->field[x][y];
+ int element_new;
+
+ if (element_old >= EL_SP_START &&
+ element_old <= EL_SP_END)
+ element_new = element_old - EL_SP_START;
+ else if (element_old == EL_INVISIBLE_WALL)
+ element_new = 0x28;
+ else
+ element_new = 0x20; /* map unknown elements to yellow "hardware" */
+
+ level_sp->playfield[x][y] = element_new;
+ }
+ }
+
+ header->InitialGravity = (level->initial_player_gravity[0] ? 1 : 0);
+
+ for (i = 0; i < SP_LEVEL_NAME_LEN; i++)
+ header->LevelTitle[i] = level->name[i];
+ /* !!! NO STRING TERMINATION IN SUPAPLEX VB CODE YET -- FIX THIS !!! */
+
+ header->InfotronsNeeded = level->gems_needed;
+
+ /* !!! ADD SPECIAL PORT DATABASE STUFF !!! */
}
void CopyNativeLevel_SP_to_RND(struct LevelInfo *level)
{
- LevelInfoType *header = &native_sp_level.header;
+ struct LevelInfo_SP *level_sp = level->native_sp_level;
+ LevelInfoType *header = &level_sp->header;
int i, x, y;
- level->fieldx = native_sp_level.width;
- level->fieldy = native_sp_level.height;
+ level->fieldx = level_sp->width;
+ level->fieldy = level_sp->height;
for (x = 0; x < level->fieldx; x++)
{
for (y = 0; y < level->fieldy; y++)
{
- int element_old = native_sp_level.playfield[x][y];
+ int element_old = level_sp->playfield[x][y];
int element_new;
if (element_old <= 0x27)
level->yamyam_content[i].e[x][y] = EL_EMPTY;
}
+static void setTapeInfoToDefaults();
+
+static void CopyNativeTape_SP_to_RND(struct LevelInfo *level)
+{
+ struct LevelInfo_SP *level_sp = level->native_sp_level;
+ struct DemoInfo_SP *demo = &level_sp->demo;
+ int i;
+
+ /* always start with reliable default values */
+ setTapeInfoToDefaults();
+
+ tape.level_nr = demo->level_nr; /* (currently not used) */
+ tape.length = demo->length - 1; /* without "end of demo" byte */
+ tape.random_seed = level_sp->header.DemoRandomSeed;
+
+ // tape.date = <SET FROM FILE DATE OF *.SP FILE>
+
+ for (i = 0; i < demo->length - 1; i++)
+ {
+ int demo_action = demo->data[i] & 0x0f;
+ int demo_repeat = (demo->data[i] & 0xf0) >> 4;
+
+ tape.pos[i].action[0] = map_key_SP_to_RND(demo_action);
+ tape.pos[i].delay = demo_repeat + 1;
+ }
+
+ tape.length_seconds = GetTapeLength();
+}
+
/* ------------------------------------------------------------------------- */
/* functions for loading DC level */
case LEVEL_FILE_TYPE_SP:
LoadLevelFromFileInfo_SP(level, level_file_info);
-#if 1
level->game_engine_type = GAME_ENGINE_TYPE_SP;
-#endif
break;
case LEVEL_FILE_TYPE_DC:
char *filename = getSolutionTapeFilename(nr);
LoadTapeFromFilename(filename);
+
+#if 1
+ if (TAPE_IS_EMPTY(tape) &&
+ level.game_engine_type == GAME_ENGINE_TYPE_SP &&
+ level.native_sp_level->demo.is_available)
+ CopyNativeTape_SP_to_RND(&level);
+#endif
}
static void SaveTape_VERS(FILE *file, struct TapeInfo *tape)