mirror of
https://github.com/holub/mame
synced 2025-06-24 21:34:43 +03:00
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:
parent
c49a3bbdc1
commit
2aad5308c6
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user