From 9ec6c6d7b0e2ab54fb12b1baa07c30974260eaaa Mon Sep 17 00:00:00 2001 From: Gregory Montoir Date: Sun, 16 Dec 2018 22:28:52 +0800 Subject: [PATCH] Import blues from c39a5c48 --- bb/fileio.c | 16 +------- bb/level.c | 6 +-- bb/screen.c | 16 +++++--- ja/game.c | 5 +-- ja/game.h | 11 +++--- ja/level.c | 100 +++++++++++++++++++++++++++---------------------- ja/resource.c | 10 +++++ ja/resource.h | 1 + ja/screen.c | 36 +++++++++++++----- ja/staticres.c | 7 +--- ja/unpack.c | 5 --- sys.h | 19 +++++----- sys_sdl2.c | 57 +++++++++++++++------------- util.c | 18 +++++++++ util.h | 4 ++ 15 files changed, 177 insertions(+), 134 deletions(-) diff --git a/bb/fileio.c b/bb/fileio.c index 38b0650..e182f1c 100644 --- a/bb/fileio.c +++ b/bb/fileio.c @@ -32,18 +32,6 @@ void fio_init(const char *data_path) { void fio_fini() { } -static FILE *fio_open_no_case(const char *filename) { - char buf[MAXPATHLEN]; - snprintf(buf, sizeof(buf), "%s/%s", _data_path, filename); - FILE *fp = fopen(buf, "rb"); - if (!fp) { - char *p = buf + strlen(_data_path) + 1; - string_upper(p); - fp = fopen(buf, "rb"); - } - return fp; -} - int fio_open(const char *filename, int error_flag) { int slot = find_free_slot(); if (slot < 0) { @@ -51,7 +39,7 @@ int fio_open(const char *filename, int error_flag) { } else { struct fileio_slot_t *file_slot = &_fileio_slots_table[slot]; memset(file_slot, 0, sizeof(fileio_slot_t)); - file_slot->fp = fio_open_no_case(filename); + file_slot->fp = fopen_nocase(_data_path, filename); if (!file_slot->fp) { if (error_flag) { print_error("Unable to open file '%s'", filename); @@ -98,7 +86,7 @@ int fio_read(int slot, void *data, int len) { } int fio_exists(const char *filename) { - FILE *fp = fio_open_no_case(filename); + FILE *fp = fopen_nocase(_data_path, filename); if (fp) { fclose(fp); return 1; diff --git a/bb/level.c b/bb/level.c index 4f2c8f9..deb9342 100644 --- a/bb/level.c +++ b/bb/level.c @@ -2073,7 +2073,7 @@ static void draw_foreground_tiles() { if (avt_num != 255) { const int tile_y = g_vars.screen_tilemap_yoffset + j * 16 + TILEMAP_OFFSET_Y; const int tile_x = g_vars.screen_tilemap_xoffset + i * 16; - render_add_sprite(RENDER_SPR_FG, avt_num, tile_x, tile_y, 0); + g_sys.render_add_sprite(RENDER_SPR_FG, avt_num, tile_x, tile_y, 0); } } ++y; @@ -2105,7 +2105,7 @@ void do_level() { g_vars.quit_level_flag = 0; g_vars.player2_scrolling_flag = 0; g_vars.found_music_instrument_flag = 0; - render_set_sprites_clipping_rect(0, TILEMAP_OFFSET_Y, TILEMAP_SCREEN_W, TILEMAP_SCREEN_H); + g_sys.render_set_sprites_clipping_rect(0, TILEMAP_OFFSET_Y, TILEMAP_SCREEN_W, TILEMAP_SCREEN_H); bool screen_transition_flag = true; do { const uint32_t timestamp = g_sys.get_timestamp(); @@ -2156,6 +2156,6 @@ void do_level() { if (g_options.amiga_copper_bars) { g_sys.set_copper_bars(0); } - render_set_sprites_clipping_rect(0, 0, GAME_SCREEN_W, GAME_SCREEN_H); + g_sys.render_set_sprites_clipping_rect(0, 0, GAME_SCREEN_W, GAME_SCREEN_H); g_vars.inp_keyboard[0xBF] = 0; } diff --git a/bb/screen.c b/bb/screen.c index 2013806..afdbc4c 100644 --- a/bb/screen.c +++ b/bb/screen.c @@ -17,11 +17,15 @@ void screen_init() { } void screen_clear_sprites() { - render_clear_sprites(); + g_sys.render_clear_sprites(); } static void add_game_sprite(int x, int y, int frame, int xflip) { const uint8_t *p = g_res.spr_frames[frame]; + if (!p) { + print_warning("add_game_sprite missing frame %d", frame); + return; + } const int h = READ_LE_UINT16(p - 4); const int w = READ_LE_UINT16(p - 2); int spr_type = RENDER_SPR_GAME; @@ -34,7 +38,7 @@ static void add_game_sprite(int x, int y, int frame, int xflip) { y += _offset_y; } } - render_add_sprite(spr_type, frame, x - w / 2, y - h, xflip); + g_sys.render_add_sprite(spr_type, frame, x - w / 2, y - h, xflip); } void screen_add_sprite(int x, int y, int frame) { @@ -256,9 +260,9 @@ static void decode_graphics(int spr_type, int start, int end, const uint8_t *dit } assert(max_w <= MAX_SPRITESHEET_W); assert(current_y + max_h <= MAX_SPRITESHEET_H); - render_unload_sprites(spr_type); + g_sys.render_unload_sprites(spr_type); const int palette_offset = (g_res.amiga_data && start == 0) ? 16 : 0; - render_load_sprites(spr_type, end - start, r, data, MAX_SPRITESHEET_W, current_y + max_h, palette_offset, color_key); + g_sys.render_load_sprites(spr_type, end - start, r, data, MAX_SPRITESHEET_W, current_y + max_h, palette_offset, color_key); free(data); } } @@ -286,8 +290,8 @@ void screen_load_graphics(const uint8_t *dither_lut_sqv, const uint8_t *dither_l if (dither_lut_avt) { dither_graphics(data, FG_TILE_W * g_res.avt_count, FG_TILE_W * g_res.avt_count, FG_TILE_H, dither_lut_avt, color_key); } - 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, 0, color_key); + g_sys.render_unload_sprites(RENDER_SPR_FG); + g_sys.render_load_sprites(RENDER_SPR_FG, g_res.avt_count, r, data, g_res.avt_count * FG_TILE_W, FG_TILE_H, 0, color_key); free(data); } // background tiles (Amiga) - re-arrange to match DOS .ck1/.ck2 layout diff --git a/ja/game.c b/ja/game.c index 4d01073..d0fca37 100644 --- a/ja/game.c +++ b/ja/game.c @@ -96,7 +96,6 @@ static void do_select_screen() { int bl = 2; while (!g_sys.input.quit) { int bh = bl; - video_vsync(60); if (g_sys.input.direction & INPUT_DIRECTION_RIGHT) { g_sys.input.direction &= ~INPUT_DIRECTION_RIGHT; ++bl; @@ -104,7 +103,6 @@ static void do_select_screen() { if (bl == 0) { bl = 1; } - video_vsync(60); } if (g_sys.input.direction & INPUT_DIRECTION_LEFT) { g_sys.input.direction &= ~INPUT_DIRECTION_LEFT; @@ -113,7 +111,6 @@ static void do_select_screen() { if (bl == 0) { bl = 3; } - video_vsync(60); } bh ^= bl; if (bh & 1) { @@ -316,7 +313,7 @@ void game_main() { do_splash_screen(); g_sys.set_screen_palette(common_palette_data, 0, 128, 6); video_load_sprites(); - render_set_sprites_clipping_rect(0, 0, TILEMAP_SCREEN_W, TILEMAP_SCREEN_H); + g_sys.render_set_sprites_clipping_rect(0, 0, TILEMAP_SCREEN_W, TILEMAP_SCREEN_H); while (!g_sys.input.quit) { update_input(); g_vars.level = g_options.start_level; diff --git a/ja/game.h b/ja/game.h index 12b7872..ac72506 100644 --- a/ja/game.h +++ b/ja/game.h @@ -4,9 +4,10 @@ #include "intern.h" -#define CHEATS_OBJECT_NO_HIT (1 << 0) -#define CHEATS_ONE_HIT_VINYL (1 << 1) -#define CHEATS_DECOR_NO_HIT (1 << 2) +#define CHEATS_OBJECT_NO_HIT (1 << 0) +#define CHEATS_ONE_HIT_VINYL (1 << 1) +#define CHEATS_DECOR_NO_HIT (1 << 2) +#define CHEATS_UNLIMITED_VINYLS (1 << 3) extern struct options_t g_options; @@ -129,7 +130,6 @@ struct vars_t { uint16_t buffer[128 * 2]; // level objects state 0xFFFF, 0xFF20 or g_vars.objects_table index int16_t dragon_coords[1 + 128]; struct player_t players_table[2]; - uint8_t player_hit_counter; int16_t player_xscroll, player_map_offset; struct object_t objects_table[OBJECTS_COUNT]; int level_start_1p_x_pos, level_start_1p_y_pos; @@ -172,7 +172,6 @@ extern const uint8_t monster_spr_anim_data0[]; extern const uint8_t monster_spr_anim_data1[]; extern const uint8_t monster_spr_anim_data2[]; extern const uint8_t monster_spr_anim_data3[]; -extern const uint8_t monster_spr_anim_data4[]; extern const uint8_t monster_spr_anim_data6[]; extern const uint8_t monster_spr_anim_data8[]; extern const uint8_t monster_spr_anim_data9[]; @@ -208,12 +207,12 @@ extern void video_draw_dot_pattern(int offset); extern void video_draw_sprite(int num, int x, int y, int flag); extern void video_draw_string(const char *s, int offset, int hspace); extern void video_copy_vga(int size); -extern void video_vsync(int delay); extern void fade_in_palette(); extern void fade_out_palette(); extern void ja_decode_spr(const uint8_t *src, int w, int h, uint8_t *dst, int dst_pitch, uint8_t pal_mask); extern void ja_decode_chr(const uint8_t *buffer, const int size, uint8_t *dst, int dst_pitch); extern void ja_decode_tile(const uint8_t *buffer, uint8_t pal_mask, uint8_t *dst, int dst_pitch, int x, int y); +extern void ja_decode_motif(int num, uint8_t color); extern void video_load_sprites(); /* sound.c */ diff --git a/ja/level.c b/ja/level.c index d9b7a59..843cd7e 100644 --- a/ja/level.c +++ b/ja/level.c @@ -22,6 +22,16 @@ static void level_player_draw_powerdown_animation(struct player_t *player); static void level_player_draw_powerup_animation(struct player_t *player, struct object_t *obj); static void level_update_tiles(struct object_t *obj, int ax, int dx, int bp); +static void do_end_of_level() { + static const uint8_t color_index = 127; + ja_decode_motif(g_vars.level_num % 9, color_index); + static const uint8_t white[] = { 0x3F, 0x3F, 0x3F }; + g_sys.set_palette_color(color_index, white); + g_sys.update_screen(g_res.vga, 1); + g_sys.sleep(1000); + fade_out_palette(); +} + static void level_player_die(struct player_t *player) { g_vars.player_xscroll = 0; player_flags2(&player->obj) |= 8; @@ -81,8 +91,8 @@ static void level_update_palette() { } static uint8_t level_lookup_tile(uint8_t num) { - uint8_t _al = g_vars.tilemap_lut_type[num]; - if (_al == 2) { + const uint8_t type = g_vars.tilemap_lut_type[num]; + if (type == 2) { if ((g_vars.tilemap_flags & 2) != 0 && (g_vars.level_loop_counter & 0x20) != 0) { return 0; } @@ -93,11 +103,11 @@ static uint8_t level_lookup_tile(uint8_t num) { } } } - _al = g_vars.tilemap_current_lut[num]; - if (_al == 248 && (g_vars.tilemap_flags & 1) != 0) { - ++_al; + num = g_vars.tilemap_current_lut[num]; + if (num == 248 && (g_vars.tilemap_flags & 1) != 0) { + ++num; } - return _al; + return num; } static uint8_t level_get_tile(int offset) { @@ -218,7 +228,6 @@ static void level_hit_player(struct player_t *p) { player_flags(&g_vars.players_table[1].obj) &= ~0x40; player_flags2(&g_vars.players_table[0].obj) &= ~1; player_flags2(&g_vars.players_table[1].obj) &= ~1; - g_vars.player_hit_counter = 7; } static void level_player_hit_object(struct player_t *p, struct object_t *obj) { @@ -483,9 +492,13 @@ static void level_update_player_anim_6(struct player_t *player) { int ax = ((player_flags(&player->obj) & PLAYER_FLAGS_POWERUP) != 0) ? 0x200 : 0x100; if (player_power(&player->obj) >= 33) { ax = 0x4000; - player->vinyls_count -= 4; + if ((g_options.cheats & CHEATS_UNLIMITED_VINYLS) == 0) { + player->vinyls_count -= 4; + } + } + if ((g_options.cheats & CHEATS_UNLIMITED_VINYLS) == 0) { + --player->vinyls_count; } - --player->vinyls_count; object22_damage(obj) = ax; player_flags(&player->obj) |= PLAYER_FLAGS_THROW_VINYL; player_power(&player->obj) = 0; @@ -606,7 +619,6 @@ static void level_update_player_anim_26(struct player_t *player) { } static void level_update_player_anim_27(struct player_t *player) { - g_vars.player_hit_counter = 7; player->obj.spr_num = 27; level_player_update_xvelocity(player, 0); if (player_throw_counter(&player->obj) == 0) { @@ -1299,7 +1311,7 @@ static void level_update_object82_type3(struct object_t *obj) { if (al == 0) { if (level_get_closest_player(obj, 160)) { object82_state(obj) = 1; - object82_anim_data(obj) = monster_spr_anim_data4; + object82_anim_data(obj) = monster_spr_anim_data3 + 4; object82_counter(obj) = 40; } } else if (al == 1) { @@ -1346,7 +1358,7 @@ static void level_update_object82_type2(struct object_t *obj) { obj->data[5].w = -56; obj->data[4].b[0] = obj->data[4].b[1]; obj->data[4].b[1] = -obj->data[4].b[1]; - obj->data[1].b[0] += 2; + object82_anim_data(obj) += 2; object82_counter(obj) = 4; } } else { @@ -1600,7 +1612,7 @@ static void level_update_triggers() { if (num == 21) { obj->spr_num = 228; // closed trap type = 3; - object82_anim_data(obj) = monster_spr_anim_data4 + 18; + object82_anim_data(obj) = monster_spr_anim_data3 + 24; } else { obj->spr_num = 225; // open trap object82_anim_data(obj) = monster_spr_anim_data3; @@ -1921,6 +1933,8 @@ static void level_update_triggers() { } if (player_bounce_counter(&g_vars.players_table[0].obj) != 0) { --player_bounce_counter(&g_vars.players_table[0].obj); + } + if (player_bounce_counter(&g_vars.players_table[0].obj) != 0) { level_update_bouncing_tiles(&g_vars.players_table[0]); } assert(g_vars.player != 2); @@ -1937,7 +1951,7 @@ static void level_update_triggers() { } p += num << 1; // loop } - obj->spr_num = num | ((object82_hflip(obj) & 0x80) << 8); // hflip + obj->spr_num = num | ((object82_hflip(obj) & 0x80) << 8); object82_anim_data(obj) = p + 2; switch (object82_type(obj)) { case 0: @@ -1982,7 +1996,7 @@ static void level_update_triggers() { if (object82_type(obj) == 5) { // jukebox for end of level if ((player_flags2(&player->obj) & 8) == 0) { if (level_collide_objects(obj, &g_vars.objects_table[0])) { - // do_end_of_level(); + do_end_of_level(); g_vars.change_next_level_flag = 1; continue; } @@ -2028,7 +2042,7 @@ static void level_update_player(struct player_t *player) { continue; } else { // rotating platforms if (player_y_delta(&player->obj) < 0) { - break; // 10D51 + goto bonus_objects; } if (obj->y_pos < player_obj->y_pos) { continue; @@ -2042,7 +2056,7 @@ static void level_update_player(struct player_t *player) { player_y_delta(&player->obj) = 0; player_flags(&player->obj) |= 1; player_jump_counter(&player->obj) = 7; - goto bonus_objects; // 10D51 + goto bonus_objects; } } if (player_y_delta(&player->obj) >= 0) { @@ -2073,7 +2087,7 @@ static void level_update_player(struct player_t *player) { if (object64_counter(obj) != 0) { --object64_counter(obj); } - goto bonus_objects; // 10D51; + goto bonus_objects; } } player_obj->y_pos -= 8; @@ -2232,15 +2246,15 @@ static void level_draw_objects() { } else { // video_set_palette_index(sprite_palettes[num]); } - const int spr_flag = ((obj->spr_num & 0x8000) != 0) ? 1 : 0; + const int spr_hflip = ((obj->spr_num & 0x8000) != 0) ? 1 : 0; const int spr_y_pos = obj->y_pos - ((g_vars.tilemap_y << 4) + g_vars.tilemap_scroll_dy) - (sprite_offsets[num] >> 8); - int _dx = obj->x_pos - ((g_vars.tilemap_x << 4) + (g_vars.tilemap_scroll_dx << 2)); - int _cl = (sprite_sizes[num] & 255); - if (spr_flag) { - _cl = (sprite_offsets[num] & 255) - _cl; + int spr_x_pos = obj->x_pos - ((g_vars.tilemap_x << 4) + (g_vars.tilemap_scroll_dx << 2)); + int spr_w = (sprite_sizes[num] & 255); + if (spr_hflip) { + spr_w = (sprite_offsets[num] & 255) - spr_w; } - const int spr_x_pos = _dx - _cl; - video_draw_sprite(num, spr_x_pos, spr_y_pos, spr_flag); + spr_x_pos -= spr_w; + video_draw_sprite(num, spr_x_pos, spr_y_pos, spr_hflip); } } @@ -2613,14 +2627,14 @@ static void level_update_tiles(struct object_t *obj, int ax, int dx, int bp) { level_tile_func(tile_funcs3[_al], obj, bp, _al * 2); } -static bool sub_15D99(struct player_t *player, int ax, int dx) { +static bool level_adjust_player_spr_num_helper(struct player_t *player, int ax, int dx) { if ((player_flags2(&player->obj) & 1) == 0) { return false; } if (player->change_hdir_counter < 30) { const int offset = (dx >> 4) * g_vars.tilemap_w + (ax >> 4); - uint8_t _al = level_get_tile(offset - g_vars.tilemap_w); - if (tile_funcs3[_al] != 0x5E58) { + const uint8_t num = level_get_tile(offset - g_vars.tilemap_w); + if (tile_funcs3[num] != 0x5E58) { return true; } } @@ -2628,7 +2642,7 @@ static bool sub_15D99(struct player_t *player, int ax, int dx) { return true; } -static void sub_15BA5(struct player_t *player) { +static void level_adjust_player_spr_num(struct player_t *player) { struct object_t *obj = &g_vars.objects_table[player_obj_num(&player->obj)]; obj->x_pos = player->obj.x_pos; obj->y_pos = player->obj.y_pos; @@ -2655,7 +2669,7 @@ static void sub_15BA5(struct player_t *player) { } } player_flags(&player->obj) &= ~PLAYER_FLAGS_STAIRS; - if (!sub_15D99(player, player->obj.x_pos, player->obj.y_pos)) { + if (!level_adjust_player_spr_num_helper(player, player->obj.x_pos, player->obj.y_pos)) { level_update_tiles(&player->obj, player->obj.x_pos, player->obj.y_pos, 0); } } @@ -2674,10 +2688,7 @@ static void sub_15BA5(struct player_t *player) { } static void level_adjust_player_position() { - if (g_vars.player_hit_counter != 0) { - --g_vars.player_hit_counter; - } - sub_15BA5(&g_vars.players_table[0]); + level_adjust_player_spr_num(&g_vars.players_table[0]); assert(g_vars.player < 2); } @@ -2688,7 +2699,7 @@ static void level_sync() { --g_vars.level_time; } g_sys.update_screen(g_res.vga, 1); - render_clear_sprites(); + g_sys.render_clear_sprites(); const int diff = (g_vars.timestamp + (1000 / 30)) - g_sys.get_timestamp(); g_sys.sleep(MAX(diff, 10)); g_vars.timestamp = g_sys.get_timestamp(); @@ -2840,7 +2851,6 @@ static void load_level_data(uint16_t level) { static void reset_level_data() { memset(g_vars.objects_table, 0xFF, sizeof(g_vars.objects_table)); g_vars.change_next_level_flag = 0; - g_vars.player_hit_counter = 0; g_vars.player_xscroll = 0; g_vars.player_map_offset = 0; g_vars.throw_vinyl_counter = 0; @@ -2889,12 +2899,12 @@ static void level_init_tilemap() { g_vars.tilemap_scroll_dx = 0; g_vars.tilemap_scroll_dy = 0; while (1) { - const int current_y = g_vars.tilemap_y; - const int _dx = g_vars.tilemap_y + 11; - const int _ax = g_vars.players_table[0].obj.y_pos >> 4; - if (_dx > _ax) { + const int bottom_y = g_vars.tilemap_y + 11; + const int player_y = g_vars.players_table[0].obj.y_pos >> 4; + if (bottom_y > player_y) { break; } + const int current_y = g_vars.tilemap_y; level_adjust_vscroll_down(16); if (g_vars.tilemap_y == current_y) { break; @@ -2902,15 +2912,15 @@ static void level_init_tilemap() { } level_adjust_vscroll_down(16); level_adjust_vscroll_down(16); - int bp = _undefined; + int prev_x = _undefined; while (1) { - const int _dx = g_vars.tilemap_x + 10; - const int _ax = g_vars.players_table[0].obj.x_pos >> 4; - if (_dx >= _ax || bp == _dx) { + const int right_x = g_vars.tilemap_x + 10; + const int player_x = g_vars.players_table[0].obj.x_pos >> 4; + if (right_x >= player_x || prev_x == right_x) { break; } level_adjust_hscroll_right(4); - bp = _dx; + prev_x = right_x; } } diff --git a/ja/resource.c b/ja/resource.c index 3802237..3504cb1 100644 --- a/ja/resource.c +++ b/ja/resource.c @@ -33,6 +33,14 @@ void res_init(const char *path, int vga_size) { snprintf(filepath, sizeof(filepath), "%s/board.eat", _datapath); unpack(filepath, g_res.board, BOARD_SIZE); + static const int MOTIF_SIZE = 320 * 25 * 9; + g_res.motif = (uint8_t *)malloc(MOTIF_SIZE); + if (!g_res.motif) { + print_error("Failed to allocate motif buffer, %d bytes", MOTIF_SIZE); + } + snprintf(filepath, sizeof(filepath), "%s/motif.eat", _datapath); + unpack(filepath, g_res.motif, MOTIF_SIZE); + static const int SPRITES_SIZE = 108044; g_res.sprites = (uint8_t *)malloc(SPRITES_SIZE); if (!g_res.sprites) { @@ -70,6 +78,8 @@ void res_fini() { g_res.font = 0; free(g_res.board); g_res.board = 0; + free(g_res.motif); + g_res.motif = 0; free(g_res.sprites); g_res.sprites = 0; free(g_res.tmp); diff --git a/ja/resource.h b/ja/resource.h index cfea669..cd3a0ec 100644 --- a/ja/resource.h +++ b/ja/resource.h @@ -7,6 +7,7 @@ struct resource_t { uint8_t *font; uint8_t *board; + uint8_t *motif; uint8_t *sprites; uint8_t *samples; uint8_t *tmp; diff --git a/ja/screen.c b/ja/screen.c index 7d8eeb5..e1bdd6f 100644 --- a/ja/screen.c +++ b/ja/screen.c @@ -22,7 +22,7 @@ void video_draw_dot_pattern(int offset) { } void video_draw_sprite(int num, int x, int y, int flag) { - render_add_sprite(RENDER_SPR_GAME, num, x, y, flag != 0); + g_sys.render_add_sprite(RENDER_SPR_GAME, num, x, y, flag != 0); } void video_draw_string(const char *s, int offset, int hspace) { @@ -44,8 +44,8 @@ void video_copy_vga(int size) { if (size == 0xB500) { memcpy(g_res.background, g_res.tmp + 768, 64000); } else { - g_sys.set_screen_palette(g_res.tmp, 0, 256, 6); assert(size == 0x7D00); + g_sys.set_screen_palette(g_res.tmp, 0, 256, 6); const uint8_t *src = g_res.tmp + 768; if (GAME_SCREEN_W * GAME_SCREEN_H == 64000) { memcpy(g_res.vga, src, 64000); @@ -60,9 +60,6 @@ void video_copy_vga(int size) { } } -void video_vsync(int delay) { -} - void fade_in_palette() { if (!g_sys.input.quit) { g_sys.fade_in_palette(); @@ -167,6 +164,28 @@ void ja_decode_tile(const uint8_t *buffer, uint8_t pal_mask, uint8_t *dst, int d } } +static void decode_motif(const uint8_t *src, uint8_t *dst, uint8_t color) { + for (int x = 0; x < 40; ++x) { + for (int b = 0; b < 8; ++b) { + const uint8_t mask = 1 << (7 - b); + if (src[x] & mask) { + dst[x * 8 + b] = color; + } + } + } +} + +void ja_decode_motif(int num, uint8_t color) { + const uint8_t *src = g_res.motif + 25 * 320 * num; + int y = 0; + for (int j = 0; j < 25; ++j) { + for (int i = 0; i < 8; ++i) { + decode_motif(src + i * 40 + j * 320, g_res.vga + y * GAME_SCREEN_W, color); + ++y; + } + } +} + void video_load_sprites() { struct sys_rect_t r[MAX_SPRITES]; uint8_t *data = (uint8_t *)calloc(MAX_SPRITESHEET_W * MAX_SPRITESHEET_H, 1); @@ -211,15 +230,12 @@ void video_load_sprites() { r[i].w = w; r[i].h = h; current_x += w; - if (h > max_h) { - max_h = h; - } } assert(count <= MAX_SPRITES); assert(max_w <= MAX_SPRITESHEET_W); assert(current_y + max_h <= MAX_SPRITESHEET_H); - render_unload_sprites(RENDER_SPR_GAME); - render_load_sprites(RENDER_SPR_GAME, count, r, data, MAX_SPRITESHEET_W, current_y + max_h, 0, 0x0); + g_sys.render_unload_sprites(RENDER_SPR_GAME); + g_sys.render_load_sprites(RENDER_SPR_GAME, count, r, data, MAX_SPRITESHEET_W, current_y + max_h, 0, 0x0); free(data); } } diff --git a/ja/staticres.c b/ja/staticres.c index bec990e..cec66e9 100644 --- a/ja/staticres.c +++ b/ja/staticres.c @@ -268,11 +268,8 @@ const uint8_t monster_spr_anim_data2[] = { 0xDA,0x00,0xF7,0xFF,0x00,0x7D,0xDC,0x00,0xFF,0xFF }; const uint8_t monster_spr_anim_data3[] = { - 0xE1,0x00,0xFF,0xFF -}; -const uint8_t monster_spr_anim_data4[] = { - 0xE1,0x00,0xE1,0x00,0xE2,0x00,0xE3,0x00,0xE3,0x00,0xE2,0x00,0xE1,0x00,0xE1,0x00, - 0xF8,0xFF,0xE4,0x00,0xFF,0xFF,0x00,0x7D,0xE5,0x00,0xFF,0xFF + 0xE1,0x00,0xFF,0xFF,0xE1,0x00,0xE1,0x00,0xE2,0x00,0xE3,0x00,0xE3,0x00,0xE2,0x00, + 0xE1,0x00,0xE1,0x00,0xF8,0xFF,0xE4,0x00,0xFF,0xFF,0x00,0x7D,0xE5,0x00,0xFF,0xFF }; const uint8_t monster_spr_anim_data6[] = { 0xEC,0x00,0xEC,0x00,0xED,0x00,0xED,0x00,0xFC,0xFF,0xEE,0x00,0xFF,0xFF,0x00,0x7D, diff --git a/ja/unpack.c b/ja/unpack.c index 7c0a492..a60df58 100644 --- a/ja/unpack.c +++ b/ja/unpack.c @@ -13,11 +13,6 @@ struct unpack_eat_t { static struct unpack_eat_t g_unpack; -static uint16_t fread_le16(FILE *fp) { - const uint16_t val = fgetc(fp); - return val | (fgetc(fp) << 8); -} - static int next_bit(struct unpack_eat_t *u) { const int bit = (u->bits & (1 << (16 - u->len))) != 0; --u->len; diff --git a/sys.h b/sys.h index 31120bc..1bc9fcb 100644 --- a/sys.h +++ b/sys.h @@ -11,6 +11,10 @@ #define SYS_AUDIO_FREQ 22050 +#define RENDER_SPR_GAME 0 /* player sprites */ +#define RENDER_SPR_LEVEL 1 /* level sprites */ +#define RENDER_SPR_FG 2 /* foreground tiles */ + struct input_t { uint8_t direction; bool quit; @@ -51,18 +55,13 @@ struct sys_t { void (*stop_audio)(); void (*lock_audio)(); void (*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, int palette_offset, uint8_t color_key); + void (*render_unload_sprites)(int spr_type); + void (*render_add_sprite)(int spr_type, int frame, int x, int y, int xflip); + void (*render_clear_sprites)(); + void (*render_set_sprites_clipping_rect)(int x, int y, int w, int h); }; extern struct sys_t g_sys; -#define RENDER_SPR_GAME 0 /* player sprites */ -#define RENDER_SPR_LEVEL 1 /* level sprites */ -#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, int palette_offset, uint8_t color_key); -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_set_sprites_clipping_rect(int x, int y, int w, int h); - #endif /* SYS_H__ */ diff --git a/sys_sdl2.c b/sys_sdl2.c index 1018b6c..762a3ae 100644 --- a/sys_sdl2.c +++ b/sys_sdl2.c @@ -511,28 +511,7 @@ static void sdl2_unlock_audio() { SDL_UnlockAudio(); } -struct sys_t g_sys = { - .init = sdl2_init, - .fini = sdl2_fini, - .set_screen_size = sdl2_set_screen_size, - .set_screen_palette = sdl2_set_screen_palette, - .set_palette_amiga = sdl2_set_palette_amiga, - .set_copper_bars = sdl2_set_copper_bars, - .set_palette_color = sdl2_set_palette_color, - .fade_in_palette = sdl2_fade_in_palette, - .fade_out_palette = sdl2_fade_out_palette, - .update_screen = sdl2_update_screen, - .transition_screen = sdl2_transition_screen, - .process_events = sdl2_process_events, - .sleep = sdl2_sleep, - .get_timestamp = sdl2_get_timestamp, - .start_audio = sdl2_start_audio, - .stop_audio = sdl2_stop_audio, - .lock_audio = sdl2_lock_audio, - .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, int palette_offset, uint8_t color_key) { +static 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, uint8_t color_key) { assert(spr_type < ARRAYSIZE(_spritesheets)); struct spritesheet_t *spr_sheet = &_spritesheets[spr_type]; spr_sheet->count = count; @@ -558,7 +537,7 @@ void render_load_sprites(int spr_type, int count, const struct sys_rect_t *r, co } } -void render_unload_sprites(int spr_type) { +static void render_unload_sprites(int spr_type) { struct spritesheet_t *spr_sheet = &_spritesheets[spr_type]; free(spr_sheet->r); if (spr_sheet->texture) { @@ -567,7 +546,7 @@ void render_unload_sprites(int spr_type) { memset(spr_sheet, 0, sizeof(struct spritesheet_t)); } -void render_add_sprite(int spr_type, int frame, int x, int y, int xflip) { +static void render_add_sprite(int spr_type, int frame, int x, int y, int xflip) { assert(_sprites_count < ARRAYSIZE(_sprites)); struct sprite_t *spr = &_sprites[_sprites_count]; spr->sheet = spr_type; @@ -578,13 +557,39 @@ void render_add_sprite(int spr_type, int frame, int x, int y, int xflip) { ++_sprites_count; } -void render_clear_sprites() { +static void render_clear_sprites() { _sprites_count = 0; } -void render_set_sprites_clipping_rect(int x, int y, int w, int h) { +static void render_set_sprites_clipping_rect(int x, int y, int w, int h) { _sprites_cliprect.x = x; _sprites_cliprect.y = y; _sprites_cliprect.w = w; _sprites_cliprect.h = h; } + +struct sys_t g_sys = { + .init = sdl2_init, + .fini = sdl2_fini, + .set_screen_size = sdl2_set_screen_size, + .set_screen_palette = sdl2_set_screen_palette, + .set_palette_amiga = sdl2_set_palette_amiga, + .set_copper_bars = sdl2_set_copper_bars, + .set_palette_color = sdl2_set_palette_color, + .fade_in_palette = sdl2_fade_in_palette, + .fade_out_palette = sdl2_fade_out_palette, + .update_screen = sdl2_update_screen, + .transition_screen = sdl2_transition_screen, + .process_events = sdl2_process_events, + .sleep = sdl2_sleep, + .get_timestamp = sdl2_get_timestamp, + .start_audio = sdl2_start_audio, + .stop_audio = sdl2_stop_audio, + .lock_audio = sdl2_lock_audio, + .unlock_audio = sdl2_unlock_audio, + .render_load_sprites = render_load_sprites, + .render_unload_sprites = render_unload_sprites, + .render_add_sprite = render_add_sprite, + .render_clear_sprites = render_clear_sprites, + .render_set_sprites_clipping_rect = render_set_sprites_clipping_rect +}; diff --git a/util.c b/util.c index e7ef171..509ba5c 100644 --- a/util.c +++ b/util.c @@ -1,5 +1,6 @@ #include +#include #include "util.h" int g_debug_mask = 0; @@ -58,3 +59,20 @@ void print_info(const char *msg, ...) { va_end(va); fprintf(stdout, "%s\n", buf); } + +FILE *fopen_nocase(const char *path, const char *filename) { + char buf[MAXPATHLEN]; + snprintf(buf, sizeof(buf), "%s/%s", path, filename); + FILE *fp = fopen(buf, "rb"); + if (!fp) { + char *p = buf + strlen(path) + 1; + string_upper(p); + fp = fopen(buf, "rb"); + } + return fp; +} + +uint16_t fread_le16(FILE *fp) { + const uint16_t val = fgetc(fp); + return val | (fgetc(fp) << 8); +} diff --git a/util.h b/util.h index 4d0e793..a3a3c7d 100644 --- a/util.h +++ b/util.h @@ -16,9 +16,13 @@ extern int g_debug_mask; extern void string_lower(char *p); extern void string_upper(char *p); + extern void print_debug(int debug_channel, const char *msg, ...); extern void print_warning(const char *msg, ...); extern void print_error(const char *msg, ...); extern void print_info(const char *msg, ...); +extern FILE * fopen_nocase(const char *path, const char *filename); +extern uint16_t fread_le16(FILE *fp); + #endif /* UTIL_H__ */