X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_sp%2Ffile.c;h=2a657fccc732077c0b7380d98a0f641fdd0ab1d9;hb=2af2c61f4dde2d22c1dc0e8dfad033b40d81dc6c;hp=7a0c2c87127196c573babc546a153170b350c216;hpb=07d1e990ebdd1e5eca3d310f8e9b9a3a8411a4dd;p=rocksndiamonds.git diff --git a/src/game_sp/file.c b/src/game_sp/file.c index 7a0c2c87..2a657fcc 100644 --- a/src/game_sp/file.c +++ b/src/game_sp/file.c @@ -43,6 +43,10 @@ void setLevelInfoToDefaults_SP() port->FreezeEnemies = 0; } + /* set raw header bytes (used for subsequent buffer zone) to "hardware" */ + 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; } @@ -50,6 +54,7 @@ void setLevelInfoToDefaults_SP() void copyInternalEngineVars_SP() { int i, x, y; + int count; LInfo = native_sp_level.header; @@ -66,7 +71,33 @@ void copyInternalEngineVars_SP() DisPlayField = REDIM_1D(sizeof(byte), 0, FieldMax + 1 - 1); PlayField16 = REDIM_1D(sizeof(int), -FieldWidth, FieldMax); - for (i = 0, y = 0; y < native_sp_level.height; y++) +#if 1 + +#if 0 + /* fill preceding playfield buffer zone with (indestructible) "hardware" */ + for (i = -FieldWidth; i < 0; i++) + PlayField16[i] = 0x20; +#endif + + count = 0; + for (y = 0; y < native_sp_level.height; y++) + for (x = 0; x < native_sp_level.width; x++) + PlayField8[count++] = native_sp_level.playfield[x][y]; + + /* add raw header bytes to subsequent playfield buffer zone */ + for (i = 0; i < SP_HEADER_SIZE; i++) + PlayField8[count++] = native_sp_level.header_raw_bytes[i]; + + for (i = 0; i < count; i++) + { + PlayField16[i] = PlayField8[i]; + DisPlayField[i] = PlayField8[i]; + PlayField8[i] = 0; + } + +#else + + for (i = 0; y = 0; y < native_sp_level.height; y++) { for (x = 0; x < native_sp_level.width; x++) { @@ -80,6 +111,8 @@ void copyInternalEngineVars_SP() } } +#endif + if (native_sp_level.demo.is_available) { DemoAvailable = True; @@ -102,7 +135,7 @@ void copyInternalEngineVars_SP() FreezeZonks = LInfo.InitialFreezeZonks; #if 1 - /* set by main game tape code directly */ + /* this is set by main game tape code to native random generator directly */ #else #if 1 @@ -203,6 +236,7 @@ static void LoadNativeLevelFromFileStream_SP(FILE *file, boolean demo_available) /* random seed used for recorded demos */ header->DemoRandomSeed = getFile16BitLE(file); /* yes, little endian */ + // header->DemoRandomSeed = getFile16BitBE(file); /* !!! TEST ONLY !!! */ #if 0 printf("::: file.c: DemoRandomSeed == %d\n", header->DemoRandomSeed); @@ -219,6 +253,12 @@ static void LoadNativeLevelFromFileStream_SP(FILE *file, boolean demo_available) header->InfotronsNeeded &= 0xff; /* only use low byte -- see above */ } + /* read raw level header bytes (96 bytes) */ + + fseek(file, -(SP_HEADER_SIZE), SEEK_CUR); /* rewind file */ + for (i = 0; i < SP_HEADER_SIZE; i++) + native_sp_level.header_raw_bytes[i] = fgetc(file); + /* also load demo tape, if available */ if (demo_available) @@ -307,13 +347,20 @@ boolean LoadNativeLevel_SP(char *filename, int pos) ((name_first == '?' || name_first == '1') && (name_last == '?' || name_last == '1')); - /* correct leading multipart level meta information in level name */ - for (i = 0; i < SP_LEVEL_NAME_LEN && header->LevelTitle[i] == name_first; i++) - header->LevelTitle[i] = '-'; - - /* correct trailing multipart level meta information in level name */ - for (i = SP_LEVEL_NAME_LEN - 1; i >= 0 && header->LevelTitle[i] == name_last; i--) - header->LevelTitle[i] = '-'; + if (is_multipart_level) + { + /* correct leading multipart level meta information in level name */ + for (i = 0; + i < SP_LEVEL_NAME_LEN && header->LevelTitle[i] == name_first; + i++) + header->LevelTitle[i] = '-'; + + /* correct trailing multipart level meta information in level name */ + for (i = SP_LEVEL_NAME_LEN - 1; + i >= 0 && header->LevelTitle[i] == name_last; + i--) + header->LevelTitle[i] = '-'; + } /* ---------- check for normal single level ---------- */