collision rework (nw)

This commit is contained in:
Olivier Galibert 2014-09-07 14:30:22 +00:00
parent f2d2237a65
commit dcb30dc250
2 changed files with 40 additions and 62 deletions

View File

@ -135,7 +135,6 @@ Current Problem(s) - in order of priority
High Priority High Priority
Protection Protection
- raiden2 doesn't detect hits on stage 2 boss;
- zeroteam has bogus collision detection; - zeroteam has bogus collision detection;
- raiden2 has a weird movement after that the ship completes animation from the aircraft. Probably 42c2 should be floating point rounded ... - raiden2 has a weird movement after that the ship completes animation from the aircraft. Probably 42c2 should be floating point rounded ...
- (and probably more) - (and probably more)
@ -520,51 +519,48 @@ WRITE16_MEMBER(raiden2_state::cop_reg_low_w)
cop_regs[offset] = (cop_regs[offset] & ~UINT32(mem_mask)) | (data & mem_mask); cop_regs[offset] = (cop_regs[offset] & ~UINT32(mem_mask)) | (data & mem_mask);
} }
void raiden2_state::cop_take_hit_box_params(UINT8 offs) WRITE16_MEMBER(raiden2_state::cop_hitbox_baseadr_w)
{ {
INT16 start_x,start_y,end_x,end_y; COMBINE_DATA(&cop_hit_baseadr);
start_x = INT8(cop_collision_info[offs].hitbox_x);
start_y = INT8(cop_collision_info[offs].hitbox_y);
end_x = INT8(cop_collision_info[offs].hitbox_x >> 8);
end_y = INT8(cop_collision_info[offs].hitbox_y >> 8);
cop_collision_info[offs].min_x = start_x + (cop_collision_info[offs].x >> 16);
cop_collision_info[offs].min_y = start_y + (cop_collision_info[offs].y >> 16);
cop_collision_info[offs].max_x = end_x + (cop_collision_info[offs].x >> 16);
cop_collision_info[offs].max_y = end_y + (cop_collision_info[offs].y >> 16);
} }
void raiden2_state::cop_collision_read_xy(address_space &space, int slot, UINT32 spradr)
UINT8 raiden2_state::cop_calculate_collsion_detection()
{ {
static UINT8 res; cop_collision_info[slot].y = space.read_dword(spradr+4);
cop_collision_info[slot].x = space.read_dword(spradr+8);
}
res = 3; void raiden2_state::cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr)
{
UINT32 hitadr2 = space.read_dword(hitadr) + (cop_hit_baseadr << 16);
UINT32 hitbox_raw = space.read_dword(hitadr2);
INT8 hx = hitbox_raw;
UINT8 hw = hitbox_raw >> 8;
INT8 hy = hitbox_raw >> 16;
UINT8 hh = hitbox_raw >> 24;
cop_collision_info[slot].min_x = (cop_collision_info[slot].x >> 16) + hx;
cop_collision_info[slot].min_y = (cop_collision_info[slot].y >> 16) + hy;
cop_collision_info[slot].max_x = cop_collision_info[slot].min_x + hw;
cop_collision_info[slot].max_y = cop_collision_info[slot].min_y + hh;
cop_hit_status = 3;
/* outbound X check */ /* outbound X check */
if(cop_collision_info[0].max_x >= cop_collision_info[1].min_x && cop_collision_info[0].min_x <= cop_collision_info[1].max_x) if(cop_collision_info[0].max_x >= cop_collision_info[1].min_x && cop_collision_info[0].min_x <= cop_collision_info[1].max_x)
res &= ~2; cop_hit_status &= ~2;
/* outbound Y check */ /* outbound Y check */
if(cop_collision_info[0].max_y >= cop_collision_info[1].min_y && cop_collision_info[0].min_y <= cop_collision_info[1].max_y) if(cop_collision_info[0].max_y >= cop_collision_info[1].min_y && cop_collision_info[0].min_y <= cop_collision_info[1].max_y)
res &= ~1; cop_hit_status &= ~1;
cop_hit_val_x = (cop_collision_info[0].x - cop_collision_info[1].x) >> 16; cop_hit_val_x = (cop_collision_info[0].x - cop_collision_info[1].x) >> 16;
cop_hit_val_y = (cop_collision_info[0].y - cop_collision_info[1].y) >> 16; cop_hit_val_y = (cop_collision_info[0].y - cop_collision_info[1].y) >> 16;
cop_hit_val_z = 1; cop_hit_val_z = 1;
cop_hit_val_unk = res; // TODO: there's also bit 2 and 3 triggered in the tests, no known meaning cop_hit_val_unk = cop_hit_status; // TODO: there's also bit 2 and 3 triggered in the tests, no known meaning
return res;
} }
/*
TODO:
2a05: first boss
2208/2288: first enemies when they crash on the ground (collision direction?)
39b0: purple laser when it's fired up (variation of 3bb0?) - 0205: if you comment out the line that also makes zeroteam crash, triggering purple laser doesn't crash anymore, but laser isn't visible
*/
WRITE16_MEMBER(raiden2_state::cop_cmd_w) WRITE16_MEMBER(raiden2_state::cop_cmd_w)
{ {
cop_status &= 0x7fff; cop_status &= 0x7fff;
@ -758,34 +754,20 @@ WRITE16_MEMBER(raiden2_state::cop_cmd_w)
case 0xa100: case 0xa100:
case 0xa180: case 0xa180:
cop_collision_info[0].y = (space.read_dword(cop_regs[0]+4)); cop_collision_read_xy(space, 0, cop_regs[0]);
cop_collision_info[0].x = (space.read_dword(cop_regs[0]+8));
break; break;
case 0xa900: case 0xa900:
case 0xa980: case 0xa980:
cop_collision_info[1].y = (space.read_dword(cop_regs[1]+4)); cop_collision_read_xy(space, 1, cop_regs[1]);
cop_collision_info[1].x = (space.read_dword(cop_regs[1]+8));
break; break;
case 0xb100: case 0xb100:
cop_collision_info[0].hitbox = space.read_word(cop_regs[2]); cop_collision_update_hitbox(space, 0, cop_regs[2]);
cop_collision_info[0].hitbox_y = space.read_word((cop_regs[2]&0xffff0000)|(cop_collision_info[0].hitbox));
cop_collision_info[0].hitbox_x = space.read_word(((cop_regs[2]&0xffff0000)|(cop_collision_info[0].hitbox))+2);
/* do the math */
cop_take_hit_box_params(0);
cop_hit_status = cop_calculate_collsion_detection();
break; break;
case 0xb900: case 0xb900:
cop_collision_info[1].hitbox = space.read_word(cop_regs[3]); cop_collision_update_hitbox(space, 1, cop_regs[3]);
cop_collision_info[1].hitbox_y = space.read_word((cop_regs[3]&0xffff0000)|(cop_collision_info[1].hitbox));
cop_collision_info[1].hitbox_x = space.read_word(((cop_regs[3]&0xffff0000)|(cop_collision_info[1].hitbox))+2);
/* do the math */
cop_take_hit_box_params(1);
cop_hit_status = cop_calculate_collsion_detection();
break; break;
default: default:
@ -793,10 +775,6 @@ WRITE16_MEMBER(raiden2_state::cop_cmd_w)
} }
} }
// case 0x6ca:
// logerror("select bank %d %04x\n", (data >> 15) & 1, data);
// space.membank("bank1")->set_entry((data >> 15) & 1);
void raiden2_state::combine32(UINT32 *val, int offset, UINT16 data, UINT16 mem_mask) void raiden2_state::combine32(UINT32 *val, int offset, UINT16 data, UINT16 mem_mask)
{ {
@ -1559,6 +1537,7 @@ static ADDRESS_MAP_START( raiden2_cop_mem, AS_PROGRAM, 16, raiden2_state )
AM_RANGE(0x0042a, 0x0042b) AM_WRITE(cop_dma_v2_w) AM_RANGE(0x0042a, 0x0042b) AM_WRITE(cop_dma_v2_w)
AM_RANGE(0x00432, 0x00433) AM_WRITE(cop_pgm_data_w) AM_RANGE(0x00432, 0x00433) AM_WRITE(cop_pgm_data_w)
AM_RANGE(0x00434, 0x00435) AM_WRITE(cop_pgm_addr_w) AM_RANGE(0x00434, 0x00435) AM_WRITE(cop_pgm_addr_w)
AM_RANGE(0x00436, 0x00437) AM_WRITE(cop_hitbox_baseadr_w)
AM_RANGE(0x00438, 0x00439) AM_WRITE(cop_pgm_value_w) AM_RANGE(0x00438, 0x00439) AM_WRITE(cop_pgm_value_w)
AM_RANGE(0x0043a, 0x0043b) AM_WRITE(cop_pgm_mask_w) AM_RANGE(0x0043a, 0x0043b) AM_WRITE(cop_pgm_mask_w)
AM_RANGE(0x0043c, 0x0043d) AM_WRITE(cop_pgm_trigger_w) AM_RANGE(0x0043c, 0x0043d) AM_WRITE(cop_pgm_trigger_w)

View File

@ -133,21 +133,20 @@ public:
UINT16 sprite_prot_x,sprite_prot_y,dst1,cop_spr_maxx,cop_spr_off; UINT16 sprite_prot_x,sprite_prot_y,dst1,cop_spr_maxx,cop_spr_off;
UINT16 sprite_prot_src_addr[2]; UINT16 sprite_prot_src_addr[2];
struct struct {
{ int x, y;
int x,y; int min_x, min_y, max_x, max_y;
int min_x,min_y,max_x,max_y; } cop_collision_info[2];
UINT16 hitbox;
UINT16 hitbox_x,hitbox_y;
}cop_collision_info[2];
UINT16 cop_hit_status; UINT16 cop_hit_status, cop_hit_baseadr;
INT16 cop_hit_val_x,cop_hit_val_y,cop_hit_val_z,cop_hit_val_unk; INT16 cop_hit_val_x, cop_hit_val_y, cop_hit_val_z, cop_hit_val_unk;
void draw_sprites(const rectangle &cliprect); void draw_sprites(const rectangle &cliprect);
UINT8 cop_calculate_collsion_detection();
void cop_take_hit_box_params(UINT8 offs);
void cop_collision_read_xy(address_space &space, int slot, UINT32 spradr);
void cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr);
DECLARE_WRITE16_MEMBER(cop_hitbox_baseadr_w);
DECLARE_WRITE16_MEMBER(cop_sort_lookup_hi_w); DECLARE_WRITE16_MEMBER(cop_sort_lookup_hi_w);
DECLARE_WRITE16_MEMBER(cop_sort_lookup_lo_w); DECLARE_WRITE16_MEMBER(cop_sort_lookup_lo_w);
DECLARE_WRITE16_MEMBER(cop_sort_ram_addr_hi_w); DECLARE_WRITE16_MEMBER(cop_sort_ram_addr_hi_w);