X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_sp%2Ffile.c;h=5a525214b44576414d5e68a76578e6316d15aa6d;hb=f926e522aef77158e0011ae5ad2cf8805509d6d1;hp=bc828c0ee47fdd08fea0e353294379c6aa079c43;hpb=3d7779514ea1fa0a79312ec8e98f08e5b1096fcb;p=rocksndiamonds.git diff --git a/src/game_sp/file.c b/src/game_sp/file.c index bc828c0e..5a525214 100644 --- a/src/game_sp/file.c +++ b/src/game_sp/file.c @@ -13,8 +13,8 @@ void setLevelInfoToDefaults_SP() 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.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++) @@ -55,20 +55,20 @@ void copyInternalEngineVars_SP() { char *preceding_playfield_memory[] = { - "95 89 95 89 95 89 95 89 95 89 3b 8a 3b 8a 3b 8a", // |..........;.;.;.| - "3b 8a 3b 8a 3b 8a 3b 8a 3b 8a e8 8a e8 8a e8 8a", // |;.;.;.;.;.è.è.è.| - "e8 8a e8 8a e8 8a e8 8a e8 8a b1 8b b1 8b b1 8b", // |è.è.è.è.è.±.±.±.| - "b1 8b b1 8b b1 8b b1 8b b1 8b 85 8c 85 8c 85 8c", // |±.±.±.±.±.......| - "85 8c 85 8c 85 8c 85 8c 85 8c 5b 8d 5b 8d 5b 8d", // |..........[.[.[.| - "5b 8d 5b 8d 5b 8d 5b 8d 5b 8d 06 8e 06 8e 06 8e", // |[.[.[.[.[.......| - "06 8e 06 8e 06 8e 06 8e 06 8e ac 8e ac 8e ac 8e", // |..........¬.¬.¬.| - "ac 8e ac 8e ac 8e ac 8e ac 8e 59 8f 59 8f 59 8f", // |¬.¬.¬.¬.¬.Y.Y.Y.| - "59 8f 59 8f 59 8f 59 8f 59 8f 00 00 70 13 00 00", // |Y.Y.Y.Y.Y...p...| - "00 00 e8 17 00 00 00 00 00 00 69 38 00 00 00 00", // |..è.......i8....| - "00 00 00 00 00 00 00 00 00 00 00 00 d0 86 00 00", // |............Ð...| - "b2 34 00 00 00 00 00 00 00 00 8f 8b 1d 34 00 00", // |²4...........4..| - "00 00 00 00 00 00 00 00 23 39 09 09 00 0c 00 08", // |........#9......| - "00 58 00 00 00 00 00 25 77 06 7f 00 00 00 01 00", // |.X.....%w.......| + "95 89 95 89 95 89 3b 8a 3b 8a 3b 8a 3b 8a 3b 8a", // |......;.;.;.;.;.| + "3b 8a 3b 8a 3b 8a e8 8a e8 8a e8 8a e8 8a e8 8a", // |;.;.;.è.è.è.è.è.| + "e8 8a e8 8a e8 8a b1 8b b1 8b b1 8b b1 8b b1 8b", // |è.è.è.±.±.±.±.±.| + "b1 8b b1 8b b1 8b 85 8c 85 8c 85 8c 85 8c 85 8c", // |±.±.±...........| + "85 8c 85 8c 85 8c 5b 8d 5b 8d 5b 8d 5b 8d 5b 8d", // |......[.[.[.[.[.| + "5b 8d 5b 8d 5b 8d 06 8e 06 8e 06 8e 06 8e 06 8e", // |[.[.[...........| + "06 8e 06 8e 06 8e ac 8e ac 8e ac 8e ac 8e ac 8e", // |......¬.¬.¬.¬.¬.| + "ac 8e ac 8e ac 8e 59 8f 59 8f 59 8f 59 8f 59 8f", // |¬.¬.¬.Y.Y.Y.Y.Y.| + "59 8f 59 8f 59 8f 00 00 70 13 00 00 00 00 e8 17", // |Y.Y.Y...p.....è.| + "00 00 00 00 00 00 69 38 00 00 00 00 00 00 00 00", // |......i8........| + "00 00 00 00 00 00 00 00 d0 86 00 00 b2 34 00 00", // |........Ð...²4..| + "00 00 00 00 00 00 8f 8b 1d 34 00 00 00 00 00 00", // |.........4......| + "00 00 00 00 23 39 09 09 00 0c 00 08 00 58 00 00", // |....#9.......X..| + "00 00 00 25 77 06 7f 00 00 00 01 00 00 00 00 00", // |...%w...........| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| @@ -77,20 +77,20 @@ void copyInternalEngineVars_SP() "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 00 00 00 ec 06 26", // |.............ì.&| - "05 00 00 00 00 00 00 01 00 00 00 00 31 32 33 34", // |............1234| - "35 36 37 38 39 30 2d 00 08 00 51 57 45 52 54 59", // |567890-...QWERTY| - "55 49 4f 50 00 00 0a 00 41 53 44 46 47 48 4a 4b", // |UIOP....ASDFGHJK| - "4c 00 00 00 00 00 5a 58 43 56 42 4e 4d 00 00 00", // |L.....ZXCVBNM...| - "00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00", // |... ............| + "00 00 00 00 00 00 00 00 00 ec 06 26 05 00 00 00", // |.........ì.&....| + "00 00 00 01 00 00 00 00 31 32 33 34 35 36 37 38", // |........12345678| + "39 30 2d 00 08 00 51 57 45 52 54 59 55 49 4f 50", // |90-...QWERTYUIOP| + "00 00 0a 00 41 53 44 46 47 48 4a 4b 4c 00 00 00", // |....ASDFGHJKL...| + "00 00 5a 58 43 56 42 4e 4d 00 00 00 00 00 00 20", // |..ZXCVBNM...... | "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00 00 00 00 00 00 00 2e 00 1e 00 31 00", // |..............1.| - "14 00 39 00 1f 00 14 00 18 00 ff ff 01 00 01 4c", // |..9.......ÿÿ...L| - "45 56 45 4c 53 2e 44 41 54 00 00 00 00 00 00 00", // |EVELS.DAT.......| + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| + "00 00 00 00 00 00 2e 00 1e 00 31 00 14 00 39 00", // |..........1...9.| + "1f 00 14 00 18 00 ff ff 01 00 01 4c 45 56 45 4c", // |......ÿÿ...LEVEL| + "53 2e 44 41 54 00 00 00 00 00 00 00 00 00 00 00", // |S.DAT...........| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| @@ -98,12 +98,20 @@ void copyInternalEngineVars_SP() "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", // |................| - "00 00 00 00", // |.... | NULL }; - int i, x, y; + int preceding_buffer_size = 0; int count; + int i, x, y; + +#if 1 + for (i = 0; preceding_playfield_memory[i] != NULL; i++) + 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; @@ -118,26 +126,51 @@ void copyInternalEngineVars_SP() PlayField8 = REDIM_1D(sizeof(byte), 0, FileMax + 1 - 1); DisPlayField = REDIM_1D(sizeof(byte), 0, FieldMax + 1 - 1); -#if 0 - PlayField16 = REDIM_1D(sizeof(int), -FieldWidth, FieldMax); +#if 1 + PlayField16 = REDIM_1D(sizeof(int), -preceding_buffer_size, FieldMax); #else - PlayField16 = REDIM_1D(sizeof(int), -FieldWidth * 2, FieldMax); + PlayField16 = REDIM_1D(sizeof(int), -FieldWidth, FieldMax); #endif #if 1 -#if 1 - /* fill preceding playfield buffer zone with (indestructible) "hardware" */ - for (i = -FieldWidth * 2; i < -FieldWidth; i++) - PlayField16[i] = 0x20; -#endif - #if 0 /* fill preceding playfield buffer zone with (indestructible) "hardware" */ for (i = -FieldWidth; i < 0; i++) PlayField16[i] = 0x20; #endif +#if 1 + count = 0; + for (i = 0; preceding_playfield_memory[i] != NULL; i++) + { + char *s = preceding_playfield_memory[i]; + boolean hi_byte = FALSE; /* little endian data => start with low byte */ + + while (s[0] != '\0' && s[1] != '\0') + { + int hi_nibble = s[0] - (s[0] > '9' ? 'a' - 10 : '0'); + int lo_nibble = s[1] - (s[1] > '9' ? 'a' - 10 : '0'); + int byte = (hi_nibble << 4) | lo_nibble; + + if (hi_byte) + byte <<= 8; + + PlayField16[-preceding_buffer_size + count] |= byte; + + if (hi_byte) + count++; + + hi_byte = !hi_byte; + + s += 2; + + while (*s == ' ') + s++; + } + } +#endif + count = 0; for (y = 0; y < native_sp_level.height; y++) for (x = 0; x < native_sp_level.width; x++) @@ -154,6 +187,28 @@ void copyInternalEngineVars_SP() PlayField8[i] = 0; } +#if 0 + { + static int x = 0; + + if (x == 1) + { + printf("++++++++"); + printf("----------\n"); + for (i = 0; i < preceding_buffer_size + FieldMax; i++) + { + int x = PlayField16[-preceding_buffer_size + i]; + + printf("%c%c", x & 0xff, x >> 8); + } + printf("----------\n"); + exit(0); + } + + x++; + } +#endif + #else for (i = 0; y = 0; y < native_sp_level.height; y++) @@ -364,9 +419,9 @@ boolean LoadNativeLevel_SP(char *filename, int level_pos) 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(); @@ -559,8 +614,8 @@ boolean LoadNativeLevel_SP(char *filename, int level_pos) 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"); @@ -568,17 +623,17 @@ boolean LoadNativeLevel_SP(char *filename, int level_pos) } 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];