From a9b55449cd07fa3b14134f4d0c366443df0a4043 Mon Sep 17 00:00:00 2001 From: Gregory Montoir Date: Fri, 13 Jul 2018 20:34:11 +0800 Subject: [PATCH] Import blues from 627051f5 --- blues1.png | Bin 11023 -> 5499 bytes blues2.png | Bin 14806 -> 4519 bytes decode.c | 20 ++++++++++++++++++++ decode.h | 1 + game.c | 24 +++++++++++++++++++++--- game.h | 1 - level.c | 35 ++++++++++++++--------------------- main.c | 1 - resource.c | 22 ++++++++++++++-------- resource.h | 1 + screen.c | 35 ++++++++++++++++++++++++++++------- sys.h | 9 +++------ sys_sdl2.c | 12 ++++++------ 13 files changed, 108 insertions(+), 53 deletions(-) diff --git a/blues1.png b/blues1.png index 94d4509ad9e63bd91c1ae8a497b780e50538dcd7..fc05f00547e4a2fd67f6bc9e01db31d3382af220 100644 GIT binary patch literal 5499 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 diff --git a/blues2.png b/blues2.png index 5f89f6b0b70a5772185eb7e1c7bea26e9c723de6..19a65f55e459e05f3408efda450b203f83aa5087 100644 GIT binary patch literal 4519 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 1) { @@ -284,6 +290,18 @@ void game_main() { g_sys.set_screen_size(GAME_SCREEN_W, GAME_SCREEN_H, "Blues Brothers"); g_vars.start_level = 0; load_sqv("sprite.sqv", g_res.spr_sqv, 0); + if (g_options.amiga_sprites) { + load_spr("sprite", g_res.spr_sqv, 0); + // load_spr("objet", g_res.spr_sqv, 101); + } + if (g_options.amiga_colors) { + uint16_t palette[16]; + for (int i = 0; i < 16; ++i) { + assert(_colors2_data[i * 2] == 0x1a0 + i * 2); + palette[i] = _colors2_data[i * 2 + 1]; + } + g_sys.set_palette_amiga(palette, 16); + } do_title_screen(); while (g_sys.input.quit == 0) { if (!g_vars.level_completed_flag) { diff --git a/game.h b/game.h index 92002b9..a182d85 100644 --- a/game.h +++ b/game.h @@ -43,7 +43,6 @@ struct options_t { bool amiga_copper_bars; bool amiga_colors; bool amiga_sprites; - bool amiga_lbms; bool amiga_data; }; diff --git a/level.c b/level.c index 4dba431..41e7a27 100644 --- a/level.c +++ b/level.c @@ -15,11 +15,6 @@ static const uint16_t _copper_data[18 * MAX_LEVELS] = { 0x198,0x400,0x500,0x600,0x700,0x800,0x900,0xa00,0xb00,0xc00,0xd00,0xe00,0xf00,0xf11,0xf22,0xf33,0xf44,0xf55 }; -static const uint16_t _colors2_data[] = { - 0x1a0,0x000,0x1a2,0xfdd,0x1a4,0x678,0x1a6,0x046,0x1a8,0x000,0x1aa,0xa20,0x1ac,0xf87,0x1ae,0x955, - 0x1b0,0xbcf,0x1b2,0xfca,0x1b4,0x30a,0x1b6,0xa9a,0x1b8,0x900,0x1ba,0x666,0x1bc,0x747,0x1be,0x020 -}; - static const uint16_t _colors_data[16 * MAX_LEVELS] = { 0x000,0xc77,0x989,0x669,0x147,0xfda,0xdb9,0xf87,0x4af,0x050,0x091,0x111,0xbcf,0xa20,0x630,0xfff, 0x000,0xa67,0xb89,0x067,0x046,0xeb8,0xca5,0xf87,0x4af,0x660,0x980,0x111,0x59c,0xa25,0x635,0xfff, @@ -49,15 +44,18 @@ static const struct { }; static const struct { + const char *blk; + const char *tbl; const char *m; const char *bin; + const char *ennemi; } _levels_amiga[MAX_LEVELS] = { - { "mag.m", "magasin.bin" }, - { "ent.m", "entrepo.bin" }, - { "pris.m", "prison.bin" }, - { "egou.m", "egout.bin" }, - { "ville.m", "ville.bin" }, - { 0, "concert.bin" }, + { "mag.blk", "mag.tbl", "mag.m", "magasin.bin", "ennemi1" }, + { "ent.blk", "ent.tbl", "ent.m", "entrepo.bin", "ennemi2" }, + { "prison.blk", "prison.tbl", "pris.m", "prison.bin", "ennemi3" }, + { "egout.blk", "egout.tbl", "egou.m", "egout.bin", "ennemi4" }, + { "ville.blk", "ville.tbl", "ville.m", "ville.bin", "ennemi5" }, + { "concert.blk", "concert.tbl", 0, "concert.bin", "ennemi6" }, }; static const char *_demo_filenames[] = { @@ -76,15 +74,15 @@ void load_level_data(int num) { load_sql(_levels[num].sql); } if (g_options.amiga_data) { + load_blk(_levels_amiga[num].blk); + read_file(_levels_amiga[num].tbl, g_res.sql, 0); load_bin(_levels_amiga[num].bin); } else { load_bin(_levels[num].bin); } load_avt(_levels[num].avt, g_res.avt_sqv, 0); if (g_options.amiga_sprites) { - char name[16]; - snprintf(name, sizeof(name), "ennemi%d", 1 + num); - load_spr(name, g_res.tmp, SPRITES_COUNT); + load_spr(_levels_amiga[num].ennemi, g_res.tmp, SPRITES_COUNT); } else { load_sqv(_levels[num].sqv, g_res.tmp, SPRITES_COUNT); } @@ -304,6 +302,7 @@ static void do_level_update_tiles_anim() { } else { const int current = data[0]; num = data[current + 1]; + *ptr = num; t->unk16 = num; } if (num >= 128) { @@ -2173,13 +2172,7 @@ void do_level() { g_sys.set_copper_bars(_copper_data + g_vars.level * 18); } if (g_options.amiga_colors) { - uint16_t palette[32]; - memcpy(palette, _colors_data + g_vars.level * 16, 16 * sizeof(uint16_t)); - for (int i = 0; i < 16; ++i) { - assert(_colors2_data[i * 2] == 0x1a0 + i * 2); - palette[16 + i] = _colors2_data[i * 2 + 1]; - } - g_sys.set_palette_amiga(palette); + g_sys.set_palette_amiga(_colors_data + g_vars.level * 16, 0); } // _time_sync_ptr[1] = 1: g_vars.inp_keyboard[0xB9] = 0; // SPACE diff --git a/main.c b/main.c index 2e29017..0de9ca9 100644 --- a/main.c +++ b/main.c @@ -24,7 +24,6 @@ int main(int argc, char *argv[]) { g_options.amiga_copper_bars = true; g_options.amiga_colors = true; // g_options.amiga_sprites = true; - // g_options.amiga_lbms = true; // g_options.amiga_data = true; const char *data_path = DEFAULT_DATA_PATH; if (argc == 2) { diff --git a/resource.c b/resource.c index af1ac79..edb5e8b 100644 --- a/resource.c +++ b/resource.c @@ -8,7 +8,7 @@ struct resource_data_t g_res; void res_init() { - static const int SQL_SIZE = 1000 * 16; + static const int SQL_SIZE = 640 * 25; g_res.sql = (uint8_t *)malloc(SQL_SIZE); if (!g_res.sql) { print_error("Failed to allocate sql buffer, %d bytes", SQL_SIZE); @@ -223,6 +223,10 @@ void load_bin(const char *filename) { } } +void load_blk(const char *filename) { + read_file(filename, g_res.tiles, 256 * 16 * 8); +} + void load_ck(const char *filename, uint16_t offset) { const int size = read_compressed_file(filename, g_res.tmp); switch (offset) { @@ -255,7 +259,7 @@ void load_img(const char *filename) { memcpy(g_res.vga, g_res.tmp + 32000, 64000); } -static int load_spr_helper(int offset, const uint8_t *ptr, uint16_t (*read16)(const uint8_t *)) { +static int load_spr_helper(int offset, const uint8_t *ptr, uint16_t (*read16)(const uint8_t *), int depth) { const int count = read16(ptr); ptr += 6; print_debug(DBG_RESOURCE, "spr count %d", count); assert(offset + count <= MAX_SPR_FRAMES); @@ -264,16 +268,18 @@ static int load_spr_helper(int offset, const uint8_t *ptr, uint16_t (*read16)(co const int h = read16(ptr - 4); const int w = read16(ptr - 2); assert((w & 3) == 0); - const int size = (w >> 1) * h + 4; + const int size = h * w * depth / 8; print_debug(DBG_RESOURCE, "sprite %d, dim %d,%d size %d", i, w, h, size); - ptr += size; + ptr += size + 4; } return count; } void load_spr(const char *filename, uint8_t *dst, int offset) { read_file(filename, dst, 0); - const int count = load_spr_helper(offset, dst, READ_BE_UINT16); + // player sprites use 8 colors + const int depth = (offset == 0) ? 3 : 4; + const int count = load_spr_helper(offset, dst, READ_BE_UINT16, depth); g_res.spr_count = offset + count; // convert to little endian uint8_t *ptr = dst; @@ -285,14 +291,14 @@ void load_spr(const char *filename, uint8_t *dst, int offset) { ptr[4] = w; ptr[5] = 0; assert((w & 3) == 0); - const int size = (w >> 1) * h + 4; - ptr += size; + const int size = h * w * depth / 8; + ptr += size + 4; } } void load_sqv(const char *filename, uint8_t *dst, int offset) { read_compressed_file(filename, dst); - const int count = load_spr_helper(offset, dst, READ_LE_UINT16); + const int count = load_spr_helper(offset, dst, READ_LE_UINT16, 4); g_res.spr_count = offset + count; } diff --git a/resource.h b/resource.h index e03b153..c852aaa 100644 --- a/resource.h +++ b/resource.h @@ -54,6 +54,7 @@ extern int read_file(const char *filename, uint8_t *dst, int size); extern int read_compressed_file(const char *filename, uint8_t *dst); extern void load_avt(const char *filename, uint8_t *dst, int offset); extern void load_bin(const char *filename); +extern void load_blk(const char *filename); extern void load_ck(const char *filename, uint16_t offset); extern void load_img(const char *filename); extern void load_spr(const char *filename, uint8_t *dst, int offset); diff --git a/screen.c b/screen.c index 53686a7..dde3a3f 100644 --- a/screen.c +++ b/screen.c @@ -160,7 +160,6 @@ void screen_add_game_sprite4(int x, int y, int frame, int blinking_counter) { } static void decode_graphics(int spr_type, int start, int end) { - const bool amiga = g_options.amiga_sprites && start != 0; struct sys_rect_t r[MAX_SPR_FRAMES]; uint8_t *data = (uint8_t *)calloc(MAX_SPRITESHEET_W * MAX_SPRITESHEET_H, 1); if (data) { @@ -170,6 +169,10 @@ static void decode_graphics(int spr_type, int start, int end) { int max_h = 0; for (int i = start; i < end; ++i) { const uint8_t *ptr = g_res.spr_frames[i]; + if (!ptr) { + memset(&r[i], 0, sizeof(struct sys_rect_t)); + continue; + } const int h = READ_LE_UINT16(ptr - 4); const int w = READ_LE_UINT16(ptr - 2); const int j = i - start; @@ -180,16 +183,16 @@ static void decode_graphics(int spr_type, int start, int end) { } current_x = 0; max_h = h; - if (amiga) { - decode_amiga_planar8(ptr, w / 8, h, 4, data, MAX_SPRITESHEET_W, current_x, current_y); + if (g_options.amiga_sprites) { + decode_amiga_planar8(ptr, w / 8, h, (start == 0) ? 3 : 4, data, MAX_SPRITESHEET_W, current_x, current_y); } else { decode_ega_spr(ptr, w, w, h, data, MAX_SPRITESHEET_W, current_x, current_y); } r[j].x = current_x; r[j].y = current_y; } else { - if (amiga) { - decode_amiga_planar8(ptr, w / 8, h, 4, data, MAX_SPRITESHEET_W, current_x, current_y); + if (g_options.amiga_sprites) { + decode_amiga_planar8(ptr, w / 8, h, (start == 0) ? 3 : 4, data, MAX_SPRITESHEET_W, current_x, current_y); } else { decode_ega_spr(ptr, w, w, h, data, MAX_SPRITESHEET_W, current_x, current_y); } @@ -206,7 +209,8 @@ static void decode_graphics(int spr_type, int start, int end) { assert(max_w <= MAX_SPRITESHEET_W); assert(current_y + max_h <= MAX_SPRITESHEET_H); render_unload_sprites(spr_type); - render_load_sprites(spr_type, end - start, r, data, MAX_SPRITESHEET_W, current_y + max_h); + const int palette_offset = (g_options.amiga_sprites && start == 0) ? 16 : 0; + render_load_sprites(spr_type, end - start, r, data, MAX_SPRITESHEET_W, current_y + max_h, palette_offset); free(data); } } @@ -216,6 +220,7 @@ void screen_load_graphics() { decode_graphics(RENDER_SPR_GAME, 0, SPRITES_COUNT); } else { decode_graphics(RENDER_SPR_LEVEL, SPRITES_COUNT, g_res.spr_count); + // foreground tiles struct sys_rect_t r[MAX_SPR_FRAMES]; static const int FG_TILE_W = 16; static const int FG_TILE_H = 16; @@ -230,8 +235,24 @@ void screen_load_graphics() { r[i].h = FG_TILE_H; } render_unload_sprites(RENDER_SPR_FG); - render_load_sprites(RENDER_SPR_FG, g_res.avt_count, r, data, g_res.avt_count * FG_TILE_W, FG_TILE_H); + render_load_sprites(RENDER_SPR_FG, g_res.avt_count, r, data, g_res.avt_count * FG_TILE_W, FG_TILE_H, 0); free(data); } + // background tiles (Amiga) - re-arrange to match DOS .ck1/.ck2 layout + if (g_options.amiga_data) { + static const int BG_TILES_COUNT = 256; + static const int W = 320 / 16; + memcpy(g_res.tmp, g_res.tiles, BG_TILES_COUNT * 16 * 8); + for (int i = 0; i < 128; ++i) { + const int y = (i / W); + const int x = (i % W); + decode_amiga_blk(g_res.tmp + i * 16 * 8, g_res.tiles + (y * 640 + x) * 16, 640); + } + for (int i = 128; i < 256; ++i) { + const int y = ((i - 128) / W); + const int x = ((i - 128) % W) + W; + decode_amiga_blk(g_res.tmp + i * 16 * 8, g_res.tiles + (y * 640 + x) * 16, 640); + } + } } } diff --git a/sys.h b/sys.h index a567581..8e444bd 100644 --- a/sys.h +++ b/sys.h @@ -34,7 +34,7 @@ struct sys_t { void (*fini)(); void (*set_screen_size)(int w, int h, const char *caption); void (*set_screen_palette)(const uint8_t *colors, int); - void (*set_palette_amiga)(const uint16_t *colors); + void (*set_palette_amiga)(const uint16_t *colors, int offset); void (*set_copper_bars)(const uint16_t *data); void (*fade_in_palette)(); void (*fade_out_palette)(); @@ -52,14 +52,11 @@ extern struct sys_t g_sys; #define RENDER_SPR_GAME 0 /* player sprites */ #define RENDER_SPR_LEVEL 1 /* level sprites */ -#define RENDER_SPR_FONT 2 /* font (digits) */ -#define RENDER_SPR_FG 3 /* foreground tiles */ +#define RENDER_SPR_FG 2 /* foreground tiles */ -extern void render_load_sprites(int spr_type, int count, const struct sys_rect_t *r, const uint8_t *data, int w, int h); +extern void render_load_sprites(int spr_type, int count, const struct sys_rect_t *r, const uint8_t *data, int w, int h, int palette_offset); extern void render_unload_sprites(int spr_type); extern void render_add_sprite(int spr_type, int frame, int x, int y, int xflip); extern void render_clear_sprites(); -extern void render_draw_tilemap(int x, int y); -extern void render_draw_image(); #endif /* SYS_H__ */ diff --git a/sys_sdl2.c b/sys_sdl2.c index 533220f..fda3f1e 100644 --- a/sys_sdl2.c +++ b/sys_sdl2.c @@ -14,7 +14,7 @@ struct spritesheet_t { SDL_Texture *texture; }; -static struct spritesheet_t _spritesheets[4]; +static struct spritesheet_t _spritesheets[3]; struct sprite_t { int sheet; @@ -102,9 +102,9 @@ static uint32_t convert_amiga_color(uint16_t color) { return SDL_MapRGB(_fmt, r, g, b); } -static void sdl2_set_palette_amiga(const uint16_t *colors) { - for (int i = 0; i < 32; ++i) { - _screen_palette[i] = convert_amiga_color(colors[i]); +static void sdl2_set_palette_amiga(const uint16_t *colors, int offset) { + for (int i = 0; i < 16; ++i) { + _screen_palette[offset + i] = convert_amiga_color(colors[i]); } } @@ -322,7 +322,7 @@ struct sys_t g_sys = { .unlock_audio = sdl2_unlock_audio, }; -void render_load_sprites(int spr_type, int count, const struct sys_rect_t *r, const uint8_t *data, int w, int h) { +void render_load_sprites(int spr_type, int count, const struct sys_rect_t *r, const uint8_t *data, int w, int h, int palette_offset) { assert(spr_type < ARRAYSIZE(_spritesheets)); struct spritesheet_t *spr_sheet = &_spritesheets[spr_type]; spr_sheet->count = count; @@ -341,7 +341,7 @@ void render_load_sprites(int spr_type, int count, const struct sys_rect_t *r, co spr_sheet->texture = SDL_CreateTexture(_renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, w, h); SDL_SetTextureBlendMode(spr_sheet->texture, SDL_BLENDMODE_BLEND); for (int i = 0; i < w * h; ++i) { - argb[i] = (data[i] == 0) ? 0 : (0xFF000000 | _screen_palette[data[i]]); + argb[i] = (data[i] == 0) ? 0 : (0xFF000000 | _screen_palette[palette_offset + data[i]]); } SDL_UpdateTexture(spr_sheet->texture, 0, argb, w * sizeof(uint32_t)); free(argb);