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)

This commit is contained in:
David Haywood 2014-09-29 12:40:21 +00:00
parent c49a3bbdc1
commit 2aad5308c6
2 changed files with 41 additions and 66 deletions

View File

@ -147,6 +147,8 @@ void raiden2cop_device::device_start()
save_item(NAME(cop_collision_info[0].spradr)); save_item(NAME(cop_collision_info[0].spradr));
save_item(NAME(cop_collision_info[0].allow_swap)); 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].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].pos));
save_item(NAME(cop_collision_info[1].dx)); 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].spradr));
save_item(NAME(cop_collision_info[1].allow_swap)); 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].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)); 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) 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 ## - 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) 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 ## - 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); 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 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 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?! 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 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) // 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 // 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<num_axis; i++) { for(i=0; i<num_axis; i++) {
cop_collision_info[slot].dx[i] = space.read_byte(1^ (hitadr2++)); cop_collision_info[slot].dx[i] = space.read_byte(extraxor^ (hitadr2++));
cop_collision_info[slot].size[i] = space.read_byte(1^ (hitadr2++)); cop_collision_info[slot].size[i] = space.read_byte(extraxor^ (hitadr2++));
} }
INT16 dx[3],size[3]; INT16 dx[3],size[3];
@ -1773,19 +1745,19 @@ void raiden2cop_device::LEGACY_cop_collision_update_hitbox(address_space &space
{ {
if (cop_collision_info[j].allow_swap && (cop_collision_info[j].flags_swap & (1 << i))) if (cop_collision_info[j].allow_swap && (cop_collision_info[j].flags_swap & (1 << i)))
{ {
m_LEGACY_cop_collision_info[j].max[i] = (cop_collision_info[j].pos[i]) - dx[i]; cop_collision_info[j].max[i] = (cop_collision_info[j].pos[i]) - dx[i];
m_LEGACY_cop_collision_info[j].min[i] = m_LEGACY_cop_collision_info[j].max[i] - size[i]; cop_collision_info[j].min[i] = cop_collision_info[j].max[i] - size[i];
} }
else else
{ {
m_LEGACY_cop_collision_info[j].min[i] = (cop_collision_info[j].pos[i]) + dx[i]; cop_collision_info[j].min[i] = (cop_collision_info[j].pos[i]) + dx[i];
m_LEGACY_cop_collision_info[j].max[i] = m_LEGACY_cop_collision_info[j].min[i] + size[i]; cop_collision_info[j].max[i] = cop_collision_info[j].min[i] + size[i];
} }
if(m_LEGACY_cop_collision_info[0].max[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); 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); res &= ~(1 << i);
cop_hit_val[i] = (cop_collision_info[0].pos[i] - cop_collision_info[1].pos[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; break;
case 0xb100: { case 0xb100: {
execute_b100(space, offset, data); // collisions execute_b100(space, offset, data);// collisions
break; 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)) if (check_command_matches(command, 0xb40, 0xbc0, 0xbc2, 0x000, 0x000, 0x000, 0x000, 0x000, funcval, funcmask))
{ {
executed = 1; executed = 1;
LEGACY_execute_b100(space, offset, data); execute_b100(space, offset, data);
return; 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)) if (check_command_matches(command, 0xb60, 0xbe0, 0xbe2, 0x000, 0x000, 0x000, 0x000, 0x000, funcval, funcmask))
{ {
executed = 1; executed = 1;
LEGACY_execute_b900(space, offset, data); execute_b900(space, offset, data);
return; return;
} }

View File

@ -129,12 +129,30 @@ public:
struct colinfo { 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]; INT16 pos[3];
INT8 dx[3]; INT8 dx[3];
UINT8 size[3]; UINT8 size[3];
bool allow_swap; bool allow_swap;
UINT16 flags_swap; UINT16 flags_swap;
UINT32 spradr; UINT32 spradr;
INT16 min[3], max[3];
}; };
colinfo cop_collision_info[2]; colinfo cop_collision_info[2];
@ -144,7 +162,6 @@ public:
UINT16 cop_hit_val_stat; UINT16 cop_hit_val_stat;
void cop_collision_read_pos(address_space &space, int slot, UINT32 spradr, bool allow_swap); 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_8100(address_space &space, int offset, UINT16 data);
void execute_8900(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(address_space &space, int offset, UINT16 data);
void LEGACY_execute_130e_cupsoc(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_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_42c2(address_space &space, int offset, UINT16 data);
void LEGACY_execute_e30e(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); void LEGACY_execute_6200(address_space &space, int offset, UINT16 data);
@ -228,20 +243,8 @@ public:
int m_LEGACY_r0, m_LEGACY_r1; int m_LEGACY_r0, m_LEGACY_r1;
DECLARE_WRITE16_MEMBER(LEGACY_cop_cmd_w); 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]; void cop_collision_update_hitbox(address_space &space, UINT16 data, int slot, UINT32 hitadr);
};
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);
// endian stuff? // endian stuff?
int m_cpu_is_68k; int m_cpu_is_68k;