Previous 199869 Revisions Next

r21839 Wednesday 13th March, 2013 at 21:19:04 UTC by David Haywood
popobear - sprite<->sprite priority handling (used to keep character line in order)
[src/mame/drivers]popobear.c

trunk/src/mame/drivers/popobear.c
r21838r21839
238238
239239   /*
240240   ???? ---- ---- ---- unused?
241   ---- xxxx ---- ---- priority?
241   ---- xxxx ---- ---- priority (against other sprites! used to keep the line of characters following you in order)
242242   ---- ---- x--- ---- Y direction
243243   ---- ---- -x-- ---- X direction
244244   ---- ---- --xx ---- size (height & width)
245245   ---- ---- ---- xx-- color bank
246   ---- ---- ---- --xx ??
246   ---- ---- ---- --x- NOT set on the enemy character / characters in your line
247   ---- ---- ---- ---x set on opposite to above?
247248   */
248
249   /* 0x106 = 8 x 8 */
250   /* 0x*29 = 32 x 32 */
251   for(i = 0x800-8;i >= 0; i-=8)
249   
250   for (int drawpri = 0xf;drawpri>=0x0;drawpri--)
252251   {
253      int y = vram[i+0x7f800+2]|(vram[i+0x7f800+3]<<8);
254      int x = vram[i+0x7f800+4]|(vram[i+0x7f800+5]<<8);
255      int spr_num = vram[i+0x7f800+6]|(vram[i+0x7f800+7]<<8);
256      int param = vram[i+0x7f800+0]|(vram[i+0x7f800+1]<<8);
257      int width = 8 << ((param & 0x30)>>4);
258      int height = width; // sprites are always square?
252      /* 0x106 = 8 x 8 */
253      /* 0x*29 = 32 x 32 */
254      for(i = 0x800-8;i >= 0; i-=8)
255      {
256         int y = vram[i+0x7f800+2]|(vram[i+0x7f800+3]<<8);
257         int x = vram[i+0x7f800+4]|(vram[i+0x7f800+5]<<8);
258         int spr_num = vram[i+0x7f800+6]|(vram[i+0x7f800+7]<<8);
259         int param = vram[i+0x7f800+0]|(vram[i+0x7f800+1]<<8);
260     
261         int pri = (param & 0x0f00)>>8;
262     
263         // we do this because it's sprite<->sprite priority,
264         if (pri!=drawpri)
265            continue;
259266
260      int color_bank = ((param & 0xc)<<4);
261      int x_dir = param & 0x40;
262      int y_dir = param & 0x80;
267         int width = 8 << ((param & 0x30)>>4);
268         int height = width; // sprites are always square?
263269
264      if (x&0x8000) x-= 0x10000;
265      if (y&0x8000) y-= 0x10000;
270         int color_bank = ((param & 0xc)<<4);
271         int x_dir = param & 0x40;
272         int y_dir = param & 0x80;
266273
267      if(param == 0)
268         continue;
274         if (x&0x8000) x-= 0x10000;
275         if (y&0x8000) y-= 0x10000;
269276
270      spr_num <<= 3;
277         if (param&0xf000) color_bank = (machine().rand() & 0x3);
271278
272      for(int yi=0;yi<height;yi++)
273      {
274         int y_draw = (y_dir) ? y+(height - yi) : y+yi;
279         if(param == 0)
280            continue;
275281
276         for(int xi=0;xi<width;xi++)
282         spr_num <<= 3;
283
284         for(int yi=0;yi<height;yi++)
277285         {
278            UINT8 pix = (vram[spr_num^1] & 0xff);
279            int x_draw = (x_dir) ? x+(width - xi) : x+xi;
286            int y_draw = (y_dir) ? y+((height-1) - yi) : y+yi;
280287
281            if(cliprect.contains(x_draw, y_draw) && pix)
282               bitmap.pix16(y_draw, x_draw) = machine().pens[pix+0x100+color_bank];
288            for(int xi=0;xi<width;xi++)
289            {
290               UINT8 pix = (vram[spr_num^1] & 0xff);
291               int x_draw = (x_dir) ? x+((width-1) - xi) : x+xi;
283292
284            spr_num++;
293               if(cliprect.contains(x_draw, y_draw) && pix)
294                  bitmap.pix16(y_draw, x_draw) = machine().pens[pix+0x100+color_bank];
295
296               spr_num++;
297            }
285298         }
286299      }
287300   }

Previous 199869 Revisions Next


© 1997-2024 The MAME Team