From 2aad5308c6afabdbba6dda5e88d34965e302068a Mon Sep 17 00:00:00 2001 From: David Haywood Date: Mon, 29 Sep 2014 12:40:21 +0000 Subject: [PATCH] use common collision logic that appears to work for all games using the same commands, tested r2 etc. and 2nd boss still works, so I think we're good (nw) --- src/mame/machine/raiden2cop.c | 72 +++++++++++------------------------ src/mame/machine/raiden2cop.h | 35 +++++++++-------- 2 files changed, 41 insertions(+), 66 deletions(-) diff --git a/src/mame/machine/raiden2cop.c b/src/mame/machine/raiden2cop.c index a19f0d8d4db..c66a00d4637 100644 --- a/src/mame/machine/raiden2cop.c +++ b/src/mame/machine/raiden2cop.c @@ -147,6 +147,8 @@ void raiden2cop_device::device_start() save_item(NAME(cop_collision_info[0].spradr)); save_item(NAME(cop_collision_info[0].allow_swap)); save_item(NAME(cop_collision_info[0].flags_swap)); + save_item(NAME(cop_collision_info[0].min)); + save_item(NAME(cop_collision_info[0].max)); save_item(NAME(cop_collision_info[1].pos)); save_item(NAME(cop_collision_info[1].dx)); @@ -154,6 +156,8 @@ void raiden2cop_device::device_start() save_item(NAME(cop_collision_info[1].spradr)); save_item(NAME(cop_collision_info[1].allow_swap)); save_item(NAME(cop_collision_info[1].flags_swap)); + save_item(NAME(cop_collision_info[1].min)); + save_item(NAME(cop_collision_info[1].max)); save_item(NAME(m_cop_rng_max_value)); @@ -1454,14 +1458,11 @@ void raiden2cop_device::execute_a900(address_space &space, int offset, UINT16 da */ void raiden2cop_device::execute_b100(address_space &space, int offset, UINT16 data) { - cop_collision_update_hitbox(space, 0, cop_regs[2]); + cop_collision_update_hitbox(space, data, 0, cop_regs[2]); } -void raiden2cop_device::LEGACY_execute_b100(address_space &space, int offset, UINT16 data) -{ - LEGACY_cop_collision_update_hitbox(space, data, 0, cop_regs[2]); -} + /* ## - trig (up5) (low11) : (sq0, sq1, sq2, sq3, sq4, sq5, sq6, sq7) valu mask @@ -1470,13 +1471,10 @@ void raiden2cop_device::LEGACY_execute_b100(address_space &space, int offset, UI */ void raiden2cop_device::execute_b900(address_space &space, int offset, UINT16 data) { - cop_collision_update_hitbox(space, 1, cop_regs[3]); + cop_collision_update_hitbox(space, data, 1, cop_regs[3]); } -void raiden2cop_device::LEGACY_execute_b900(address_space &space, int offset, UINT16 data) -{ - LEGACY_cop_collision_update_hitbox(space, data, 1, cop_regs[3]); -} + /* ## - trig (up5) (low11) : (sq0, sq1, sq2, sq3, sq4, sq5, sq6, sq7) valu mask @@ -1682,35 +1680,7 @@ void raiden2cop_device::cop_collision_read_pos(address_space &space, int slot, cop_collision_info[slot].pos[i] = cop_read_word(space, spradr+6+4*i); } -void raiden2cop_device::cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr) -{ - UINT32 hitadr2 = space.read_word(hitadr) | (cop_hit_baseadr << 16); - for(int i=0; i<3; i++) { - cop_collision_info[slot].dx[i] = space.read_byte(hitadr2++); - cop_collision_info[slot].size[i] = space.read_byte(hitadr2++); - } - - cop_hit_status = 7; - - for(int i=0; i<3; i++) { - int min[2], max[2]; - for(int j=0; j<2; j++) { - if(cop_collision_info[j].allow_swap && (cop_collision_info[j].flags_swap & (1 << i))) { - max[j] = cop_collision_info[j].pos[i] - cop_collision_info[j].dx[i]; - min[j] = max[j] - cop_collision_info[j].size[i]; - } else { - min[j] = cop_collision_info[j].pos[i] + cop_collision_info[j].dx[i]; - max[j] = min[j] + cop_collision_info[j].size[i]; - } - } - if(max[0] > min[1] && min[0] < max[1]) - cop_hit_status &= ~(1 << i); - cop_hit_val[i] = cop_collision_info[0].pos[i] - cop_collision_info[1].pos[i]; - } - - cop_hit_val_stat = cop_hit_status ? 0xffff : 0x0000; -} /* Godzilla 0x12c0 X = 0x21ed Y = 0x57da @@ -1730,10 +1700,12 @@ Y = collides between 0xd0 and 0x30 (not inclusive) 0x588 bits 2 & 3 = 0x580 bits 0 & 1 */ -void raiden2cop_device::LEGACY_cop_collision_update_hitbox(address_space &space, UINT16 data, int slot, UINT32 hitadr) +void raiden2cop_device::cop_collision_update_hitbox(address_space &space, UINT16 data, int slot, UINT32 hitadr) { UINT32 hitadr2 = space.read_word(hitadr) | (cop_hit_baseadr << 16); // DON'T use cop_read_word here, doesn't need endian fixing?! int num_axis = 2; + int extraxor = 0; + if (m_cpu_is_68k) extraxor = 1; // guess, heatbrl doesn't have this set and clearly only wants 2 axis to be checked (otherwise it reads bad params into the 3rd) // everything else has it set, and legionna clearly wants 3 axis for jumping attacks to work @@ -1747,8 +1719,8 @@ void raiden2cop_device::LEGACY_cop_collision_update_hitbox(address_space &space } for(i=0; i= m_LEGACY_cop_collision_info[1].min[i] && m_LEGACY_cop_collision_info[0].min[i] <= m_LEGACY_cop_collision_info[1].max[i]) + if(cop_collision_info[0].max[i] >= cop_collision_info[1].min[i] && cop_collision_info[0].min[i] <= cop_collision_info[1].max[i]) res &= ~(1 << i); - if(m_LEGACY_cop_collision_info[1].max[i] >= m_LEGACY_cop_collision_info[0].min[i] && m_LEGACY_cop_collision_info[1].min[i] <= m_LEGACY_cop_collision_info[0].max[i]) + if(cop_collision_info[1].max[i] >= cop_collision_info[0].min[i] && cop_collision_info[1].min[i] <= cop_collision_info[0].max[i]) res &= ~(1 << i); cop_hit_val[i] = (cop_collision_info[0].pos[i] - cop_collision_info[1].pos[i]); @@ -1899,7 +1871,7 @@ WRITE16_MEMBER( raiden2cop_device::cop_cmd_w) break; case 0xb100: { - execute_b100(space, offset, data); // collisions + execute_b100(space, offset, data);// collisions break; } @@ -2273,7 +2245,7 @@ WRITE16_MEMBER(raiden2cop_device::LEGACY_cop_cmd_w) if (check_command_matches(command, 0xb40, 0xbc0, 0xbc2, 0x000, 0x000, 0x000, 0x000, 0x000, funcval, funcmask)) { executed = 1; - LEGACY_execute_b100(space, offset, data); + execute_b100(space, offset, data); return; } @@ -2288,7 +2260,7 @@ WRITE16_MEMBER(raiden2cop_device::LEGACY_cop_cmd_w) if (check_command_matches(command, 0xb60, 0xbe0, 0xbe2, 0x000, 0x000, 0x000, 0x000, 0x000, funcval, funcmask)) { executed = 1; - LEGACY_execute_b900(space, offset, data); + execute_b900(space, offset, data); return; } diff --git a/src/mame/machine/raiden2cop.h b/src/mame/machine/raiden2cop.h index 86cad139d6d..fa867b18795 100644 --- a/src/mame/machine/raiden2cop.h +++ b/src/mame/machine/raiden2cop.h @@ -129,12 +129,30 @@ public: struct colinfo { + + colinfo() + { + pos[0] = pos[1] = pos[2] = 0; + dx[0] = dx[1] = dx[2] = 0; + size[0] = size[1] = size[2] = 0; + allow_swap = false; + flags_swap = 0; + spradr = 0; + min[0] = min[1] = min[2] = 0; + max[0] = max[1] = max[2] = 0; + + } + + INT16 pos[3]; INT8 dx[3]; UINT8 size[3]; bool allow_swap; UINT16 flags_swap; UINT32 spradr; + INT16 min[3], max[3]; + + }; colinfo cop_collision_info[2]; @@ -144,7 +162,6 @@ public: UINT16 cop_hit_val_stat; void cop_collision_read_pos(address_space &space, int slot, UINT32 spradr, bool allow_swap); - void cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr); void execute_8100(address_space &space, int offset, UINT16 data); void execute_8900(address_space &space, int offset, UINT16 data); @@ -173,8 +190,6 @@ public: void LEGACY_execute_130e(address_space &space, int offset, UINT16 data); void LEGACY_execute_130e_cupsoc(address_space &space, int offset, UINT16 data); void LEGACY_execute_3b30(address_space &space, int offset, UINT16 data); - void LEGACY_execute_b100(address_space &space, int offset, UINT16 data); - void LEGACY_execute_b900(address_space &space, int offset, UINT16 data); void LEGACY_execute_42c2(address_space &space, int offset, UINT16 data); void LEGACY_execute_e30e(address_space &space, int offset, UINT16 data); void LEGACY_execute_6200(address_space &space, int offset, UINT16 data); @@ -228,20 +243,8 @@ public: int m_LEGACY_r0, m_LEGACY_r1; DECLARE_WRITE16_MEMBER(LEGACY_cop_cmd_w); - struct LEGACY_collision_info - { - LEGACY_collision_info() - { - min[0] = min[1] = min[2] = 0; - max[0] = max[1] = max[2] = 0; - - } - INT16 min[3], max[3]; - }; - - struct LEGACY_collision_info m_LEGACY_cop_collision_info[2]; - void LEGACY_cop_collision_update_hitbox(address_space &space, UINT16 data, int slot, UINT32 hitadr); + void cop_collision_update_hitbox(address_space &space, UINT16 data, int slot, UINT32 hitadr); // endian stuff? int m_cpu_is_68k;