X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_sp%2Ffile.c;h=12b52c3a24e7327aac681e8545e081e9e79e407d;hb=0d0c4e532d37b7ce14dc59b604a3c1e2fc325e7f;hp=2aa0ddf5e34e39adff14a286f8874db1dadf28ad;hpb=98edd2c02783d6cf8ffe4d7aec340fe80cc8bcff;p=rocksndiamonds.git diff --git a/src/game_sp/file.c b/src/game_sp/file.c index 2aa0ddf5..12b52c3a 100644 --- a/src/game_sp/file.c +++ b/src/game_sp/file.c @@ -43,13 +43,18 @@ void setLevelInfoToDefaults_SP() port->FreezeEnemies = 0; } - native_sp_level.demo_available = FALSE; - native_sp_level.demo_length = 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; } void copyInternalEngineVars_SP() { int i, x, y; + int count; LInfo = native_sp_level.header; @@ -60,13 +65,33 @@ void copyInternalEngineVars_SP() FieldMax = (FieldWidth * FieldHeight) + HeaderSize - 1; LevelMax = (FieldWidth * FieldHeight) - 1; - FileMax = FieldMax + native_sp_level.demo_length; + FileMax = FieldMax + native_sp_level.demo.length; PlayField8 = REDIM_1D(sizeof(byte), 0, FileMax + 1 - 1); 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 + + 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,12 +105,16 @@ void copyInternalEngineVars_SP() } } - if (native_sp_level.demo_available) +#endif + + if (native_sp_level.demo.is_available) { DemoAvailable = True; - for (i = 0; i < native_sp_level.demo_length; i++) - PlayField8[FieldMax + i + 1] = native_sp_level.demo[i]; + PlayField8[FieldMax + 1] = native_sp_level.demo.level_nr; + + for (i = 0; i < native_sp_level.demo.length; i++) + PlayField8[FieldMax + i + 2] = native_sp_level.demo.data[i]; } AnimationPosTable = REDIM_1D(sizeof(int), 0, LevelMax - 2 * FieldWidth); @@ -99,8 +128,18 @@ void copyInternalEngineVars_SP() GravityFlag = LInfo.InitialGravity; FreezeZonks = LInfo.InitialFreezeZonks; +#if 1 + /* this is set by main game tape code to native random generator directly */ +#else + +#if 1 + printf("::: file.c: copyInternalEngineVars_SP(): RandomSeed = LInfo.DemoRandomSeed\n"); +#endif + RandomSeed = LInfo.DemoRandomSeed; +#endif + LevelLoaded = True; } @@ -191,6 +230,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); @@ -207,15 +247,29 @@ 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) { + int level_nr = getFile8Bit(file); + + level_nr &= 0x7f; /* clear highest bit */ + level_nr = (level_nr < 1 ? 1 : + level_nr > 111 ? 111 : level_nr); + + native_sp_level.demo.level_nr = level_nr; + for (i = 0; i < SP_MAX_TAPE_LEN && !feof(file); i++) { - native_sp_level.demo[i] = getFile8Bit(file); + native_sp_level.demo.data[i] = getFile8Bit(file); - if (native_sp_level.demo[i] == 0xff) /* "end of demo" byte */ + if (native_sp_level.demo.data[i] == 0xff) /* "end of demo" byte */ { i++; @@ -223,8 +277,8 @@ static void LoadNativeLevelFromFileStream_SP(FILE *file, boolean demo_available) } } - native_sp_level.demo_length = i; - native_sp_level.demo_available = (native_sp_level.demo_length > 0); + native_sp_level.demo.length = i; + native_sp_level.demo.is_available = (native_sp_level.demo.length > 0); } }