diff options
author | David Haywood <28625134+DavidHaywood@users.noreply.github.com> | 2021-07-10 18:32:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-10 13:32:52 -0400 |
commit | c15624e0da0074712a64eb97f4d090f10d7f9b5a (patch) | |
tree | 194daddb4374b39eefb24aa0a1e0bc28f1e95c27 | |
parent | 94064e44746c6abcdfbf15bfb64b8ed6b72705fe (diff) |
chanbara.cpp - render low priority sprites (#8269)
-rw-r--r-- | src/mame/drivers/chanbara.cpp | 82 |
1 files changed, 43 insertions, 39 deletions
diff --git a/src/mame/drivers/chanbara.cpp b/src/mame/drivers/chanbara.cpp index c4f7adc8c53..adcfc0d7224 100644 --- a/src/mame/drivers/chanbara.cpp +++ b/src/mame/drivers/chanbara.cpp @@ -43,10 +43,11 @@ Notes: Driver by Tomasz Slanina & David Haywood Inputs and Dip Switches by stephh -ToDo: - there might still be some sprite banking issues - support screen flipping for sprites - +TODO: + - Support screen flipping for sprites + - If you force-scroll an enemy off the screen rather than fight them, you'll get graphical + corruption (bad sprites) before a new enemy appears, does this happen on the PCB? + - BGM tempo is incorrect, but clocks are verfied above? ( see https://www.youtube.com/watch?v=pW9nhx1hcLM ) ****************************************************************************************/ @@ -94,7 +95,7 @@ private: TILE_GET_INFO_MEMBER(get_bg2_tile_info); void chanbara_palette(palette_device &palette) const; uint32_t screen_update_chanbara(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void chanbara_map(address_map &map); /* memory pointers */ @@ -179,57 +180,60 @@ void chanbara_state::video_start() m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(chanbara_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS,8, 8, 32, 32); m_bg2_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(chanbara_state::get_bg2_tile_info)), TILEMAP_SCAN_ROWS,16, 16, 16, 32); m_bg_tilemap->set_transparent_pen(0); + m_bg2_tilemap->set_transparent_pen(0); } -void chanbara_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) +void chanbara_state::draw_sprites(screen_device &screen, bitmap_ind16& bitmap, const rectangle& cliprect) { - int offs; - - for (offs = 0; offs < 0x80; offs += 4) + for (int offs = 0x80 - 4; offs >= 0x00; offs -= 4) { - if (m_spriteram[offs + 0x80] & 0x80) + int pri_mask = (m_spriteram[offs + 0x80] & 0x80) ? 0xfffc : 0xfffe; + int attr = m_spriteram[offs + 0]; + int code = m_spriteram[offs + 1]; + int color = m_spriteram[offs + 0x80] & 0x1f; + int flipx = attr & 4; + int flipy = attr & 2; + int sx = 240 - m_spriteram[offs + 3]; + int sy = 232 - m_spriteram[offs + 2]; + + sy += 16; + + // could be simplified by rearranging gfx in loading / init + if (m_spriteram[offs + 0x80] & 0x10) code += 0x200; + if (m_spriteram[offs + 0x80] & 0x20) code += 0x400; + if (m_spriteram[offs + 0x80] & 0x40) code += 0x100; + + if (attr & 0x10) { - int attr = m_spriteram[offs + 0]; - int code = m_spriteram[offs + 1]; - int color = m_spriteram[offs + 0x80] & 0x1f; - int flipx = attr & 4; - int flipy = attr & 2; - int sx = 240 - m_spriteram[offs + 3]; - int sy = 232 - m_spriteram[offs + 2]; - - sy+=16; - - if (m_spriteram[offs + 0x80] & 0x10) code += 0x200; - if (m_spriteram[offs + 0x80] & 0x20) code += 0x400; - if (m_spriteram[offs + 0x80] & 0x40) code += 0x100; - - if (attr & 0x10) + if (!flipy) { - if (!flipy) - { - m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, code, color, flipx, flipy, sx, sy-16, 0); - m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, code+1, color, flipx, flipy, sx, sy, 0); - } - else - { - m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, code, color, flipx, flipy, sx, sy, 0); - m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, code+1, color, flipx, flipy, sx, sy-16, 0); - } + m_gfxdecode->gfx(1)->prio_transpen(bitmap, cliprect, code, color, flipx, flipy, sx, sy - 16, screen.priority(), pri_mask, 0); + m_gfxdecode->gfx(1)->prio_transpen(bitmap, cliprect, code + 1, color, flipx, flipy, sx, sy, screen.priority(), pri_mask, 0); } else { - m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, code, color, flipx, flipy, sx, sy, 0); + m_gfxdecode->gfx(1)->prio_transpen(bitmap, cliprect, code, color, flipx, flipy, sx, sy, screen.priority(), pri_mask, 0); + m_gfxdecode->gfx(1)->prio_transpen(bitmap, cliprect, code + 1, color, flipx, flipy, sx, sy - 16, screen.priority(), pri_mask, 0); } } + else + { + m_gfxdecode->gfx(1)->prio_transpen(bitmap, cliprect, code, color, flipx, flipy, sx, sy, screen.priority(), pri_mask, 0); + } } } uint32_t chanbara_state::screen_update_chanbara(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { + screen.priority().fill(0, cliprect); + m_bg2_tilemap->set_scrolly(0, m_scroll | (m_scrollhi << 8)); - m_bg2_tilemap->draw(screen, bitmap, cliprect, 0, 0); - draw_sprites(bitmap, cliprect); - m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + m_bg2_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); // ensure bg pen for each tile gets drawn behind sprites + m_bg2_tilemap->draw(screen, bitmap, cliprect, 0, 1); + m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 2); + + draw_sprites(screen, bitmap, cliprect); + return 0; } |