From f20a89c455eedc37890d5382500d85ca75e92a23 Mon Sep 17 00:00:00 2001 From: angelosa Date: Sun, 15 Sep 2024 14:19:48 +0200 Subject: funtech/supracan.cpp: assume sprite ysizes are non-linear --- src/mame/funtech/supracan.cpp | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/src/mame/funtech/supracan.cpp b/src/mame/funtech/supracan.cpp index 64a1d2273d8..0090357d112 100644 --- a/src/mame/funtech/supracan.cpp +++ b/src/mame/funtech/supracan.cpp @@ -293,6 +293,8 @@ private: int supracan_state::get_tilemap_region(int layer) { + // TODO: anything that refers to 2bpp region (2) can actually be layer 1bpp selectable too + // From layer mode bit 7? switch(layer) { case 0: @@ -301,7 +303,6 @@ int supracan_state::get_tilemap_region(int layer) case 1: static const int layer1_mode[8] = { 2, 1, 1, 1, 2, 2, 2, 2 }; return layer1_mode[m_gfx_mode & 7]; - // HACK: can be 2bpp or 1bpp case 2: return 2; case 3: @@ -325,13 +326,15 @@ void supracan_state::get_tilemap_info_common(int layer, tile_data &tileinfo, int uint16_t tile_bank = 0; uint16_t palette_shift = 0; + // TODO: convert this to a static table, verify case 7 switch (gfx_mode) { case 7: tile_bank = 0x1c00; break; - case 6: // gambling lord + // gamblord + case 6: tile_bank = 0x0c00; break; @@ -808,6 +811,24 @@ void supracan_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &maskmap, bi { uint16_t *vram = m_vram; + // ysizes are normally setting +1, except on higher ranges where values are higher + // TODO: check on real HW + static const int ysizes_table[16] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, + // 0x9: speedyd intro dash frame + 11, + // 0xa: A'Can logo + 12, + // 0xb/0xc: jttlaugh stage 1-3 (particularly on the web scrolling jump platforms) + 16, + 20, + // 0xd: slghtsag character select + 22, + // 0xe/0xf: , check me + 24, + 26 + }; + uint32_t skip_count = 0; uint32_t start_word = (m_sprite_base_addr >> 1) + skip_count * 4; uint32_t end_word = start_word + (m_sprite_count - skip_count) * 4; @@ -836,9 +857,7 @@ void supracan_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &maskmap, bi if ((vram[i + 0] & 0x4000)) { int xsize = 1 << (vram[i + 1] & 7); - // TODO: this looks non-linear, particularly at bit 3 ON settings - // cfr. A'Can logo, speedyd intro, slghtsag character select - int ysize = ((vram[i + 0] & 0x1e00) >> 9) + 1; + int ysize = ysizes_table[(vram[i + 0] & 0x1e00) >> 9]; // HACK: sonevil sets 1x1 tiles in game, and expecting to take this path. // Most likely former condition is wrong, and it just "direct sprite" when latter occurs. @@ -865,6 +884,12 @@ void supracan_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &maskmap, bi // I think the xsize must influence the ysize somehow, there are too many conflicting cases otherwise // there don't appear to be any special markers in the actual looked up tile data to indicate skip / end of list + //if (((vram[i + 0] & 0x1e00) >> 9) == test_target) + //{ + // ysize = test_value; + //} + + for (int ytile = 0; ytile < ysize; ytile++) { for (int xtile = 0; xtile < xsize; xtile++) @@ -895,7 +920,7 @@ void supracan_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &maskmap, bi } } - // TODO: scaling + // TODO: scaling, find places where it occurs #if 0 if (xscale == 0) continue; uint32_t delta = (1 << 17) / xscale; @@ -1074,6 +1099,7 @@ uint32_t supracan_state::screen_update(screen_device &screen, bitmap_ind16 &bitm { int which_tilemap_size = get_tilemap_dimensions(xsize, ysize, layer); bitmap_ind16 &src_bitmap = m_tilemap_sizes[layer][which_tilemap_size]->pixmap(); + // TODO: per-tile priority, thru ->flagsmap() int gfx_region = get_tilemap_region(layer); int transmask = 0xff; -- cgit v1.2.3