Improved sprite-tile priorities in SD Gundam Sangokushi Rainbow Tairiku Senki [David Haywood]

This commit is contained in:
Angelo Salese 2011-01-05 00:24:23 +00:00
parent 5235212dc6
commit 9a9709ddaa
4 changed files with 90 additions and 15 deletions

View File

@ -1153,7 +1153,7 @@ static MACHINE_CONFIG_START( godzilla, driver_device )
MCFG_GFXDECODE(heatbrl) MCFG_GFXDECODE(heatbrl)
MCFG_PALETTE_LENGTH(128*16) MCFG_PALETTE_LENGTH(128*16)
MCFG_VIDEO_START(legionna) MCFG_VIDEO_START(godzilla)
MCFG_VIDEO_UPDATE(godzilla) MCFG_VIDEO_UPDATE(godzilla)
/* sound hardware */ /* sound hardware */

View File

@ -14,6 +14,7 @@ VIDEO_START( legionna );
VIDEO_START( cupsoc ); VIDEO_START( cupsoc );
VIDEO_START( denjinmk ); VIDEO_START( denjinmk );
VIDEO_START( grainbow ); VIDEO_START( grainbow );
VIDEO_START( godzilla );
VIDEO_UPDATE( legionna ); VIDEO_UPDATE( legionna );
VIDEO_UPDATE( godzilla ); VIDEO_UPDATE( godzilla );
VIDEO_UPDATE( grainbow ); VIDEO_UPDATE( grainbow );

View File

@ -1495,6 +1495,7 @@ static WRITE16_HANDLER( seibu_common_video_regs_w )
case (0x026/2): { legionna_scrollram16[3] = seibu_vregs[offset]; break; } case (0x026/2): { legionna_scrollram16[3] = seibu_vregs[offset]; break; }
case (0x028/2): { legionna_scrollram16[4] = seibu_vregs[offset]; break; } case (0x028/2): { legionna_scrollram16[4] = seibu_vregs[offset]; break; }
case (0x02a/2): { legionna_scrollram16[5] = seibu_vregs[offset]; break; } case (0x02a/2): { legionna_scrollram16[5] = seibu_vregs[offset]; break; }
default: { logerror("seibu_common_video_regs_w unhandled offset %02x %04x\n",offset,data); break; }
} }
} }

View File

@ -12,6 +12,8 @@ UINT16 *legionna_back_data,*legionna_fore_data,*legionna_mid_data,*legionna_scro
static tilemap_t *background_layer,*foreground_layer,*midground_layer,*text_layer; static tilemap_t *background_layer,*foreground_layer,*midground_layer,*text_layer;
UINT16 legionna_layer_disable; UINT16 legionna_layer_disable;
int legionna_sprite_xoffs,legionna_sprite_yoffs; int legionna_sprite_xoffs,legionna_sprite_yoffs;
static int legionna_has_extended_banking;
static int legionna_has_extended_priority;
/******************************************************************************/ /******************************************************************************/
@ -148,6 +150,9 @@ VIDEO_START( legionna )
legionna_sprite_xoffs = 0; legionna_sprite_xoffs = 0;
legionna_sprite_yoffs = 0; legionna_sprite_yoffs = 0;
legionna_has_extended_banking = 0;
legionna_has_extended_priority = 0;
tilemap_set_transparent_pen(background_layer,15); tilemap_set_transparent_pen(background_layer,15);
tilemap_set_transparent_pen(midground_layer,15); tilemap_set_transparent_pen(midground_layer,15);
tilemap_set_transparent_pen(foreground_layer,15); tilemap_set_transparent_pen(foreground_layer,15);
@ -165,6 +170,9 @@ VIDEO_START( denjinmk )
legionna_sprite_xoffs = 0; legionna_sprite_xoffs = 0;
legionna_sprite_yoffs = 0; legionna_sprite_yoffs = 0;
legionna_has_extended_banking = 1;
legionna_has_extended_priority = 0;
tilemap_set_transparent_pen(background_layer,15); tilemap_set_transparent_pen(background_layer,15);
tilemap_set_transparent_pen(midground_layer,15); tilemap_set_transparent_pen(midground_layer,15);
tilemap_set_transparent_pen(foreground_layer,15); tilemap_set_transparent_pen(foreground_layer,15);
@ -182,6 +190,9 @@ VIDEO_START( cupsoc )
legionna_sprite_xoffs = 0; legionna_sprite_xoffs = 0;
legionna_sprite_yoffs = 0; legionna_sprite_yoffs = 0;
legionna_has_extended_banking = 0;
legionna_has_extended_priority = 1;
tilemap_set_transparent_pen(background_layer,15); tilemap_set_transparent_pen(background_layer,15);
tilemap_set_transparent_pen(midground_layer,15); tilemap_set_transparent_pen(midground_layer,15);
tilemap_set_transparent_pen(foreground_layer,15); tilemap_set_transparent_pen(foreground_layer,15);
@ -193,7 +204,19 @@ VIDEO_START(grainbow)
VIDEO_START_CALL(legionna); VIDEO_START_CALL(legionna);
legionna_sprite_xoffs = legionna_sprite_yoffs = 16; legionna_sprite_xoffs = legionna_sprite_yoffs = 16;
legionna_has_extended_banking = 0;
legionna_has_extended_priority = 1;
} }
VIDEO_START(godzilla)
{
VIDEO_START_CALL(legionna);
legionna_has_extended_banking = 1;
legionna_has_extended_priority = 0;
}
/************************************************************************* /*************************************************************************
Legionnaire Spriteram (similar to Dcon) Legionnaire Spriteram (similar to Dcon)
@ -207,7 +230,7 @@ VIDEO_START(grainbow)
+0 ..x..... ........ Flip y ??? +0 ..x..... ........ Flip y ???
+0 ...xxx.. ........ Width: do this many tiles horizontally +0 ...xxx.. ........ Width: do this many tiles horizontally
+0 ......xx x....... Height: do this many tiles vertically +0 ......xx x....... Height: do this many tiles vertically
+0 ........ .x...... Tile bank,used in Denjin Makai +0 ........ .x...... Tile bank,used in Denjin Makai / extra Priority in Grainbow (to external pin?)
+0 ........ ..xxxxxx Color bank +0 ........ ..xxxxxx Color bank
+1 xx...... ........ Priority? (1=high?) +1 xx...... ........ Priority? (1=high?)
@ -227,27 +250,76 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
int dx,dy,ax,ay; int dx,dy,ax,ay;
int pri_mask; int pri_mask;
for (offs = 0;offs < 0x400-4;offs += 4) for (offs = 0;offs < 0x400;offs += 4)
{ {
UINT16 data = spriteram16[offs]; UINT16 data = spriteram16[offs];
if (!(data &0x8000)) continue; if (!(data &0x8000)) continue;
cur_pri = (spriteram16[offs+1] & 0xc000) >> 14;
pri_mask = 0; pri_mask = 0;
switch (cur_pri) if (legionna_has_extended_priority)
{ {
case 0: pri_mask = 0xfffc; break; //?
case 1: pri_mask = 0xfffc; break; //? cur_pri = (spriteram16[offs+1] & 0xc000) >> 14;
case 2: pri_mask = 0xfffc; break; // player sprites in legionnaire
case 3: pri_mask = 0xfffe; break; // stuff that goes behind the playfield (barriers on train level in legionnaire) if(data & 0x0040)
{
cur_pri |= 0x4; // definitely seems to be needed by grainbow
}
//
// -4 behind bg? (mask sprites)
// -32 behind mid
// -256 behind tx
// 0 above all
// is the low bit REALLY priority?
switch (cur_pri)
{
case 0: pri_mask = -256; break; // gumdam swamp monster l2
case 1: pri_mask = -256; break; // cupsoc
case 2: pri_mask = -4; break; // masking effect for gundam l2 monster
case 3: pri_mask = -4; break; // cupsoc (not sure what..)
case 4: pri_mask = -32; break; // gundam level 2/3 player
//case 5: pri_mask = 0; break;
case 6: pri_mask = 0; break; // insert coin in gundam
//case 7: pri_mask = 0; break;
default: printf("unhandled pri %d\n",cur_pri); pri_mask=0;
}
}
else
{
cur_pri = (spriteram16[offs+1] & 0xc000) >> 14;
switch (cur_pri)
{
case 0: pri_mask = 0xfffc; break; //?
case 1: pri_mask = 0xfffc; break; //?
case 2: pri_mask = 0xfffc; break; // player sprites in legionnaire
case 3: pri_mask = 0xfffe; break; // stuff that goes behind the playfield (barriers on train level in legionnaire)
}
} }
sprite = spriteram16[offs+1]; sprite = spriteram16[offs+1];
sprite &= 0x3fff; sprite &= 0x3fff;
if(data & 0x0040) sprite |= 0x4000;//tile banking,used in Denjin Makai
if(spriteram16[offs+3] & 0x8000) sprite |= 0x8000;//tile banking?,used in Denjin Makai if (legionna_has_extended_banking)
{
if(data & 0x0040)
{
sprite |= 0x4000;//tile banking,used in Denjin Makai
}
if(spriteram16[offs+3] & 0x8000)
{
sprite |= 0x8000;//tile banking?,used in Denjin Makai
}
}
y = spriteram16[offs+3]; y = spriteram16[offs+3];
x = spriteram16[offs+2]; x = spriteram16[offs+2];
@ -362,6 +434,7 @@ VIDEO_UPDATE( legionna )
return 0; return 0;
} }
VIDEO_UPDATE( godzilla ) VIDEO_UPDATE( godzilla )
{ {
// tilemap_set_scrollx( text_layer, 0, 0 ); // tilemap_set_scrollx( text_layer, 0, 0 );
@ -406,16 +479,16 @@ VIDEO_UPDATE( grainbow )
bitmap_fill(screen->machine->priority_bitmap,cliprect,0); bitmap_fill(screen->machine->priority_bitmap,cliprect,0);
if(!(legionna_layer_disable & 1)) if(!(legionna_layer_disable & 1))
tilemap_draw(bitmap,cliprect,background_layer,0,0); tilemap_draw(bitmap,cliprect,background_layer,0,1);
if(!(legionna_layer_disable & 2)) if(!(legionna_layer_disable & 2))
tilemap_draw(bitmap,cliprect,midground_layer,0,0); tilemap_draw(bitmap,cliprect,midground_layer,0,2);
if(!(legionna_layer_disable & 4)) if(!(legionna_layer_disable & 4))
tilemap_draw(bitmap,cliprect,foreground_layer,0,1); tilemap_draw(bitmap,cliprect,foreground_layer,0,4);
if(!(legionna_layer_disable & 8)) if(!(legionna_layer_disable & 8))
tilemap_draw(bitmap,cliprect,text_layer,0,2); tilemap_draw(bitmap,cliprect,text_layer,0,8);
draw_sprites(screen->machine,bitmap,cliprect); draw_sprites(screen->machine,bitmap,cliprect);