trunk/src/mame/machine/seicop.c
| r17785 | r17786 | |
| 1729 | 1729 | |
| 1730 | 1730 | static UINT16 cop_status,cop_dist,cop_angle; |
| 1731 | 1731 | static UINT16 cop_hit_status; |
| 1732 | | static INT32 cop_hit_val_x,cop_hit_val_y; |
| 1732 | static INT16 cop_hit_val_x,cop_hit_val_y,cop_hit_val_z,cop_hit_val_unk; |
| 1733 | 1733 | static UINT32 cop_sort_lookup,cop_sort_ram_addr,cop_sort_param; |
| 1734 | 1734 | static INT8 cop_angle_compare; |
| 1735 | 1735 | static UINT8 cop_angle_mod_val; |
| r17785 | r17786 | |
| 1738 | 1738 | int x,y; |
| 1739 | 1739 | int min_x,min_y,max_x,max_y; |
| 1740 | 1740 | UINT16 hitbox; |
| 1741 | UINT16 hitbox_x,hitbox_y; |
| 1741 | 1742 | }cop_collision_info[2]; |
| 1742 | 1743 | |
| 1743 | 1744 | /* RE from Seibu Cup Soccer bootleg */ |
| r17785 | r17786 | |
| 1757 | 1758 | u1 == _u1_ && u2 == _u2_) \ |
| 1758 | 1759 | |
| 1759 | 1760 | |
| 1761 | /* |
| 1762 | Godzilla 0x12c0 height 50m |
| 1763 | Megaron 0x12d0 height 55m |
| 1764 | King Ghidorah 0x12c8 100m |
| 1765 | Mecha Ghidorah 0x12dc 140m |
| 1766 | Mecha Godzilla 0x12d4 50m |
| 1767 | Gigan 0x12cc 55m |
| 1768 | */ |
| 1760 | 1769 | static UINT8 cop_calculate_collsion_detection(running_machine &machine) |
| 1761 | 1770 | { |
| 1762 | 1771 | static UINT8 res; |
| r17785 | r17786 | |
| 1773 | 1782 | |
| 1774 | 1783 | /* TODO: Legionnaire does collision detection via the other two regs, |
| 1775 | 1784 | 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)); |
| 1778 | 1789 | |
| 1779 | 1790 | //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); |
| 1781 | 1792 | |
| 1782 | 1793 | return res; |
| 1783 | 1794 | } |
| 1784 | 1795 | |
| 1796 | |
| 1785 | 1797 | static READ16_HANDLER( generic_cop_r ) |
| 1786 | 1798 | { |
| 1787 | 1799 | UINT16 retvalue; |
| r17785 | r17786 | |
| 1802 | 1814 | return cop_hit_status; |
| 1803 | 1815 | |
| 1804 | 1816 | /* these two controls facing direction in Godzilla opponents (only vs.) - x value compare? */ |
| 1817 | case 0x182/2: |
| 1818 | return (cop_hit_val_y); |
| 1819 | |
| 1805 | 1820 | case 0x184/2: |
| 1806 | | return (cop_hit_val_x & 0xffff0000) >> 16; |
| 1821 | return (cop_hit_val_x); |
| 1807 | 1822 | |
| 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); |
| 1810 | 1826 | |
| 1811 | | /* Legionnaire only - y value compare? */ |
| 1812 | 1827 | case 0x188/2: |
| 1813 | | return (cop_hit_val_y & 0xffff0000) >> 16; |
| 1828 | return cop_hit_val_unk; |
| 1814 | 1829 | |
| 1815 | | case 0x186/2: |
| 1816 | | return cop_hit_val_y & 0xffff; |
| 1817 | | |
| 1818 | 1830 | /* BCD */ |
| 1819 | 1831 | case 0x190/2: |
| 1820 | 1832 | case 0x192/2: |
| r17785 | r17786 | |
| 2286 | 2298 | //(heatbrl) | 9 | ffff | b080 | b40 bc0 bc2 |
| 2287 | 2299 | if(COP_CMD(0xb40,0xbc0,0xbc2,0x000,0x000,0x000,0x000,0x000,u1,u2)) |
| 2288 | 2300 | { |
| 2289 | | /* Take hitbox param, TODO */ |
| 2301 | UINT8 start_x,start_y,end_x,end_y; |
| 2290 | 2302 | 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 |
| 2291 | 2306 | |
| 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); |
| 2299 | 2315 | 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 | |
| 2306 | 2322 | /* do the math */ |
| 2307 | 2323 | cop_hit_status = cop_calculate_collsion_detection(space->machine()); |
| 2324 | |
| 2308 | 2325 | return; |
| 2309 | 2326 | } |
| 2310 | 2327 | |
| r17785 | r17786 | |
| 2318 | 2335 | //(heatbrl) | 6 | ffff | b880 | b60 be0 be2 |
| 2319 | 2336 | if(COP_CMD(0xb60,0xbe0,0xbe2,0x000,0x000,0x000,0x000,0x000,u1,u2)) |
| 2320 | 2337 | { |
| 2338 | UINT8 start_x,start_y, end_x,end_y; |
| 2339 | |
| 2321 | 2340 | /* Take hitbox param, TODO */ |
| 2322 | 2341 | 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 |
| 2323 | 2345 | |
| 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); |
| 2328 | 2350 | |
| 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 | |
| 2329 | 2361 | //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); |
| 2331 | 2362 | |
| 2332 | 2363 | /* do the math */ |
| 2333 | 2364 | cop_hit_status = cop_calculate_collsion_detection(space->machine()); |
trunk/src/mame/drivers/legionna.c
| r17785 | r17786 | |
| 2305 | 2305 | GAME( 1992, heatbrlu, heatbrl, heatbrl, heatbrl, driver_device, 0, ROT0, "TAD Corporation", "Heated Barrel (US)", GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING ) |
| 2306 | 2306 | GAME( 1992, heatbrle, heatbrl, heatbrl, heatbrl, driver_device, 0, ROT0, "TAD Corporation", "Heated Barrel (Electronic Devices license)", GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING ) |
| 2307 | 2307 | |
| 2308 | | GAME( 1993, godzilla, 0, godzilla, godzilla, driver_device, 0, ROT0, "Banpresto", "Godzilla", GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING ) |
| 2308 | GAME( 1993, godzilla, 0, godzilla, godzilla, driver_device, 0, ROT0, "Banpresto", "Godzilla (Japan)", GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING ) |
| 2309 | 2309 | GAME( 1993, grainbow, 0, grainbow, grainbow, driver_device, 0, ROT0, "Banpresto", "SD Gundam Sangokushi Rainbow Tairiku Senki", GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING ) |
| 2310 | 2310 | GAME( 1993, denjinmk, 0, denjinmk, denjinmk, legionna_state, denjinmk, ROT0, "Banpresto", "Denjin Makai", GAME_IMPERFECT_GRAPHICS ) |
| 2311 | 2311 | |