Previous 199869 Revisions Next

r17786 Tuesday 11th September, 2012 at 02:46:41 UTC by Angelo Salese
Understood how the Seibu COP collision detection really works, greatly improving Godzilla, Heated Barrel and SD Gundam RT gameplay [Angelo Salese, Smitdogg]
[src/mame/drivers]legionna.c
[src/mame/machine]seicop.c

trunk/src/mame/machine/seicop.c
r17785r17786
17291729
17301730static UINT16 cop_status,cop_dist,cop_angle;
17311731static UINT16 cop_hit_status;
1732static INT32 cop_hit_val_x,cop_hit_val_y;
1732static INT16 cop_hit_val_x,cop_hit_val_y,cop_hit_val_z,cop_hit_val_unk;
17331733static UINT32 cop_sort_lookup,cop_sort_ram_addr,cop_sort_param;
17341734static INT8 cop_angle_compare;
17351735static UINT8 cop_angle_mod_val;
r17785r17786
17381738   int x,y;
17391739   int min_x,min_y,max_x,max_y;
17401740   UINT16 hitbox;
1741   UINT16 hitbox_x,hitbox_y;
17411742}cop_collision_info[2];
17421743
17431744/* RE from Seibu Cup Soccer bootleg */
r17785r17786
17571758   u1 == _u1_ && u2 == _u2_) \
17581759
17591760
1761/*
1762Godzilla 0x12c0 height 50m
1763Megaron  0x12d0 height 55m
1764King Ghidorah 0x12c8 100m
1765Mecha Ghidorah 0x12dc 140m
1766Mecha Godzilla 0x12d4 50m
1767Gigan 0x12cc 55m
1768*/
17601769static UINT8 cop_calculate_collsion_detection(running_machine &machine)
17611770{
17621771   static UINT8 res;
r17785r17786
17731782
17741783   /* TODO: Legionnaire does collision detection via the other two regs,
17751784             for now just implement a version that allows the player to spam flying kicks and hit everything else on the screen ;-) */
1776   cop_hit_val_x = (res & 1) ? cop_collision_info[0].max_x - cop_collision_info[1].min_x : 0;
1777   cop_hit_val_y = (res & 2) ? cop_collision_info[0].max_y - cop_collision_info[1].min_y : 0;
1785   cop_hit_val_x = (cop_collision_info[0].min_x - cop_collision_info[1].min_x) >> 16;
1786   cop_hit_val_y = (cop_collision_info[0].min_y - cop_collision_info[1].min_y) >> 16;
1787   cop_hit_val_z = 1;
1788   cop_hit_val_unk = 0;//((cop_collision_info[0].min_y >> 16) != (cop_collision_info[1].min_y >> 16));
17781789
17791790   //if(res == 0)
1780   //  printf("0:%08x %08x 1:%08x %08x\n",cop_collision_info[0].min_x,cop_collision_info[0].min_y,cop_collision_info[1].min_x,cop_collision_info[1].min_y);
1791   //popmessage("0:%08x %08x %08x 1:%08x %08x %08x\n",cop_collision_info[0].x,cop_collision_info[0].y,cop_collision_info[0].hitbox,cop_collision_info[1].x,cop_collision_info[1].y,cop_collision_info[1].hitbox);
17811792
17821793   return res;
17831794}
17841795
1796
17851797static READ16_HANDLER( generic_cop_r )
17861798{
17871799   UINT16 retvalue;
r17785r17786
18021814         return cop_hit_status;
18031815
18041816      /* these two controls facing direction in Godzilla opponents (only vs.) - x value compare? */
1817      case 0x182/2:
1818         return (cop_hit_val_y);
1819
18051820      case 0x184/2:
1806         return (cop_hit_val_x & 0xffff0000) >> 16;
1821         return (cop_hit_val_x);
18071822
1808      case 0x182/2:
1809         return cop_hit_val_x & 0xffff;
1823      /* Legionnaire only - z value compare? */
1824      case 0x186/2:
1825         return (cop_hit_val_z);
18101826
1811      /* Legionnaire only - y value compare? */
18121827      case 0x188/2:
1813         return (cop_hit_val_y & 0xffff0000) >> 16;
1828         return cop_hit_val_unk;
18141829
1815      case 0x186/2:
1816         return cop_hit_val_y & 0xffff;
1817
18181830      /* BCD */
18191831      case 0x190/2:
18201832      case 0x192/2:
r17785r17786
22862298         //(heatbrl)  | 9 | ffff | b080 | b40 bc0 bc2
22872299         if(COP_CMD(0xb40,0xbc0,0xbc2,0x000,0x000,0x000,0x000,0x000,u1,u2))
22882300         {
2289            /* Take hitbox param, TODO */
2301            UINT8 start_x,start_y,end_x,end_y;
22902302            cop_collision_info[0].hitbox = space->read_word(cop_register[2]);
2303            cop_collision_info[0].hitbox_y = space->read_word((cop_register[2]&0xffff0000)|(cop_collision_info[0].hitbox));
2304            cop_collision_info[0].hitbox_x = space->read_word(((cop_register[2]&0xffff0000)|(cop_collision_info[0].hitbox))+2);
2305            // TODO: z
22912306
2292            if(cop_collision_info[0].hitbox == 0xc8) //hack for SD Gundam
2293            {
2294               cop_collision_info[0].min_x = cop_collision_info[0].x + (0 << 16);
2295               cop_collision_info[0].min_y = cop_collision_info[0].y - (0x10 << 16);
2296               cop_collision_info[0].max_x = cop_collision_info[0].x + (0xc0 << 16);
2297               cop_collision_info[0].max_y = cop_collision_info[0].y + (0 << 16);
2298            }
2307            start_x = (cop_collision_info[0].hitbox_x & 0xff);
2308            start_y = (cop_collision_info[0].hitbox_y & 0xff);
2309            end_x = (cop_collision_info[0].hitbox_x >> 8);
2310            end_y = (cop_collision_info[0].hitbox_y >> 8);
2311
2312            /* TODO: understand this one */
2313            if(start_x == 0)
2314               cop_collision_info[0].min_x = cop_collision_info[0].x - ((0x10) << 16);
22992315            else
2300            {
2301               cop_collision_info[0].min_x = cop_collision_info[0].x + (0 << 16);
2302               cop_collision_info[0].min_y = cop_collision_info[0].y + (0 << 16);
2303               cop_collision_info[0].max_x = cop_collision_info[0].x + (0x10 << 16);
2304               cop_collision_info[0].max_y = cop_collision_info[0].y + (0x10 << 16);
2305            }
2316               cop_collision_info[0].min_x = cop_collision_info[0].x + ((0) << 16);
2317
2318            cop_collision_info[0].min_y = cop_collision_info[0].y + ((0) << 16);
2319            cop_collision_info[0].max_x = cop_collision_info[0].x + ((end_x) << 16);
2320            cop_collision_info[0].max_y = cop_collision_info[0].y + ((end_y) << 16);
2321
23062322            /* do the math */
23072323            cop_hit_status = cop_calculate_collsion_detection(space->machine());
2324
23082325            return;
23092326         }
23102327
r17785r17786
23182335         //(heatbrl)  | 6 | ffff | b880 | b60 be0 be2
23192336         if(COP_CMD(0xb60,0xbe0,0xbe2,0x000,0x000,0x000,0x000,0x000,u1,u2))
23202337         {
2338            UINT8 start_x,start_y, end_x,end_y;
2339
23212340            /* Take hitbox param, TODO */
23222341            cop_collision_info[1].hitbox = space->read_word(cop_register[3]);
2342            cop_collision_info[1].hitbox_y = space->read_word((cop_register[3]&0xffff0000)|(cop_collision_info[1].hitbox));
2343            cop_collision_info[1].hitbox_x = space->read_word(((cop_register[3]&0xffff0000)|(cop_collision_info[1].hitbox))+2);
2344            // TODO: z
23232345
2324            cop_collision_info[1].min_x = cop_collision_info[1].x + (0 << 16);
2325            cop_collision_info[1].min_y = cop_collision_info[1].y + (0 << 16);
2326            cop_collision_info[1].max_x = cop_collision_info[1].x + (0x10 << 16);
2327            cop_collision_info[1].max_y = cop_collision_info[1].y + (0x10 << 16);
2346            start_x = (cop_collision_info[0].hitbox_x & 0xff);
2347            start_y = (cop_collision_info[0].hitbox_y & 0xff);
2348            end_x = (cop_collision_info[0].hitbox_x >> 8);
2349            end_y = (cop_collision_info[0].hitbox_y >> 8);
23282350
2351            /* TODO: understand this one */
2352            if(start_x == 0)
2353               cop_collision_info[1].min_x = cop_collision_info[1].x - ((0x10) << 16);
2354            else
2355               cop_collision_info[1].min_x = cop_collision_info[1].x + ((0) << 16);
2356
2357            cop_collision_info[1].min_y = cop_collision_info[1].y + ((0) << 16);
2358            cop_collision_info[1].max_x = cop_collision_info[1].x + ((end_x) << 16);
2359            cop_collision_info[1].max_y = cop_collision_info[1].y + ((end_y) << 16);
2360
23292361            //if(cop_collision_info[0].x || cop_collision_info[1].x)
2330            //popmessage("0: %08x %08x %08x 1: %08x %08x %08x",cop_collision_info[0].x,cop_collision_info[0].y,cop_collision_info[0].hitbox,cop_collision_info[1].x,cop_collision_info[1].y,cop_collision_info[1].hitbox);
23312362
23322363            /* do the math */
23332364            cop_hit_status = cop_calculate_collsion_detection(space->machine());
trunk/src/mame/drivers/legionna.c
r17785r17786
23052305GAME( 1992, heatbrlu, heatbrl,  heatbrl,  heatbrl, driver_device,  0,         ROT0, "TAD Corporation", "Heated Barrel (US)", GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING )
23062306GAME( 1992, heatbrle, heatbrl,  heatbrl,  heatbrl, driver_device,  0,         ROT0, "TAD Corporation", "Heated Barrel (Electronic Devices license)", GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING )
23072307
2308GAME( 1993, godzilla, 0,        godzilla, godzilla, driver_device, 0,         ROT0, "Banpresto", "Godzilla", GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING )
2308GAME( 1993, godzilla, 0,        godzilla, godzilla, driver_device, 0,         ROT0, "Banpresto", "Godzilla (Japan)", GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING )
23092309GAME( 1993, grainbow, 0,        grainbow, grainbow, driver_device, 0,         ROT0, "Banpresto", "SD Gundam Sangokushi Rainbow Tairiku Senki", GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING )
23102310GAME( 1993, denjinmk, 0,        denjinmk, denjinmk, legionna_state, denjinmk,  ROT0, "Banpresto", "Denjin Makai", GAME_IMPERFECT_GRAPHICS )
23112311

Previous 199869 Revisions Next


© 1997-2024 The MAME Team