Previous 199869 Revisions Next

r32459 Monday 29th September, 2014 at 12:40:21 UTC by David Haywood
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 raiden2cop.h

trunk/src/mame/machine/raiden2cop.c
r32458r32459
147147   save_item(NAME(cop_collision_info[0].spradr));
148148   save_item(NAME(cop_collision_info[0].allow_swap));
149149   save_item(NAME(cop_collision_info[0].flags_swap));
150   save_item(NAME(cop_collision_info[0].min));
151   save_item(NAME(cop_collision_info[0].max));
150152
151153   save_item(NAME(cop_collision_info[1].pos));
152154   save_item(NAME(cop_collision_info[1].dx));
r32458r32459
154156   save_item(NAME(cop_collision_info[1].spradr));
155157   save_item(NAME(cop_collision_info[1].allow_swap));
156158   save_item(NAME(cop_collision_info[1].flags_swap));
159   save_item(NAME(cop_collision_info[1].min));
160   save_item(NAME(cop_collision_info[1].max));
157161
158162   save_item(NAME(m_cop_rng_max_value));
159163
r32458r32459
14541458*/
14551459void raiden2cop_device::execute_b100(address_space &space, int offset, UINT16 data)
14561460{
1457   cop_collision_update_hitbox(space, 0, cop_regs[2]);
1461   cop_collision_update_hitbox(space, data, 0, cop_regs[2]);
14581462}
14591463
14601464
1461void raiden2cop_device::LEGACY_execute_b100(address_space &space, int offset, UINT16 data)
1462{
1463   LEGACY_cop_collision_update_hitbox(space, data, 0, cop_regs[2]);
1464}
14651465
1466
14661467/*
14671468## - trig (up5) (low11) :  (sq0, sq1, sq2, sq3, sq4, sq5, sq6, sq7)  valu  mask
1468146917 - b900 ( 17) (  100) :  (b60, be0, be2, 000, 000, 000, 000, 000)  6     ffff   (legionna, cupsoc, grainbow, godzilla, denjinmk, raiden2, raidendx, zeroteam, xsedae)
r32458r32459
14701471*/
14711472void raiden2cop_device::execute_b900(address_space &space, int offset, UINT16 data)
14721473{
1473   cop_collision_update_hitbox(space, 1, cop_regs[3]);
1474   cop_collision_update_hitbox(space, data, 1, cop_regs[3]);
14741475}
14751476
1476void raiden2cop_device::LEGACY_execute_b900(address_space &space, int offset, UINT16 data)
1477{
1478   LEGACY_cop_collision_update_hitbox(space, data, 1, cop_regs[3]);
1479}
14801477
1478
14811479/*
14821480## - trig (up5) (low11) :  (sq0, sq1, sq2, sq3, sq4, sq5, sq6, sq7)  valu  mask
1483148118 - c480 ( 18) (  480) :  (080, 882, 000, 000, 000, 000, 000, 000)  a     ff00   (legionna, heatbrl, cupsoc, grainbow, godzilla, denjinmk)
r32458r32459
16821680      cop_collision_info[slot].pos[i] = cop_read_word(space, spradr+6+4*i);
16831681}
16841682
1685void  raiden2cop_device::cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr)
1686{
1687   UINT32 hitadr2 = space.read_word(hitadr) | (cop_hit_baseadr << 16);
16881683
1689   for(int i=0; i<3; i++) {
1690      cop_collision_info[slot].dx[i] = space.read_byte(hitadr2++);
1691      cop_collision_info[slot].size[i] = space.read_byte(hitadr2++);
1692   }
16931684
1694   cop_hit_status = 7;
1695
1696   for(int i=0; i<3; i++) {
1697      int min[2], max[2];
1698      for(int j=0; j<2; j++) {
1699         if(cop_collision_info[j].allow_swap && (cop_collision_info[j].flags_swap & (1 << i))) {
1700            max[j] = cop_collision_info[j].pos[i] - cop_collision_info[j].dx[i];
1701            min[j] = max[j] - cop_collision_info[j].size[i];
1702         } else {
1703            min[j] = cop_collision_info[j].pos[i] + cop_collision_info[j].dx[i];
1704            max[j] = min[j] + cop_collision_info[j].size[i];
1705         }
1706      }
1707      if(max[0] > min[1] && min[0] < max[1])
1708         cop_hit_status &= ~(1 << i);
1709      cop_hit_val[i] = cop_collision_info[0].pos[i] - cop_collision_info[1].pos[i];
1710   }
1711
1712   cop_hit_val_stat = cop_hit_status ? 0xffff : 0x0000;
1713}
1714
17151685/*
17161686Godzilla 0x12c0 X = 0x21ed Y = 0x57da
17171687Megaron  0x12d0 X = 0x1ef1 Y = 0x55db
r32458r32459
173017000x588 bits 2 & 3 = 0x580 bits 0 & 1
17311701*/
17321702
1733void  raiden2cop_device::LEGACY_cop_collision_update_hitbox(address_space &space, UINT16 data, int slot, UINT32 hitadr)
1703void  raiden2cop_device::cop_collision_update_hitbox(address_space &space, UINT16 data, int slot, UINT32 hitadr)
17341704{
17351705   UINT32 hitadr2 = space.read_word(hitadr) | (cop_hit_baseadr << 16); // DON'T use cop_read_word here, doesn't need endian fixing?!
17361706   int num_axis = 2;
1707   int extraxor = 0;
1708   if (m_cpu_is_68k) extraxor = 1;
17371709
17381710   // guess, heatbrl doesn't have this set and clearly only wants 2 axis to be checked (otherwise it reads bad params into the 3rd)
17391711   // everything else has it set, and legionna clearly wants 3 axis for jumping attacks to work
r32458r32459
17471719   }
17481720
17491721   for(i=0; i<num_axis; i++) {
1750      cop_collision_info[slot].dx[i] = space.read_byte(1^ (hitadr2++));
1751      cop_collision_info[slot].size[i] = space.read_byte(1^ (hitadr2++));
1722      cop_collision_info[slot].dx[i] = space.read_byte(extraxor^ (hitadr2++));
1723      cop_collision_info[slot].size[i] = space.read_byte(extraxor^ (hitadr2++));
17521724   }
17531725
17541726   INT16 dx[3],size[3];
r32458r32459
17731745   {
17741746      if (cop_collision_info[j].allow_swap && (cop_collision_info[j].flags_swap & (1 << i)))
17751747      {
1776         m_LEGACY_cop_collision_info[j].max[i] = (cop_collision_info[j].pos[i]) - dx[i];
1777         m_LEGACY_cop_collision_info[j].min[i] = m_LEGACY_cop_collision_info[j].max[i] - size[i];
1748         cop_collision_info[j].max[i] = (cop_collision_info[j].pos[i]) - dx[i];
1749         cop_collision_info[j].min[i] = cop_collision_info[j].max[i] - size[i];
17781750      }
17791751      else
17801752      {
1781         m_LEGACY_cop_collision_info[j].min[i] = (cop_collision_info[j].pos[i]) + dx[i];
1782         m_LEGACY_cop_collision_info[j].max[i] = m_LEGACY_cop_collision_info[j].min[i] + size[i];
1753         cop_collision_info[j].min[i] = (cop_collision_info[j].pos[i]) + dx[i];
1754         cop_collision_info[j].max[i] = cop_collision_info[j].min[i] + size[i];
17831755      }
17841756
1785      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])
1757      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])
17861758         res &= ~(1 << i);
17871759
1788      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])
1760      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])
17891761         res &= ~(1 << i);
17901762
17911763      cop_hit_val[i] = (cop_collision_info[0].pos[i] - cop_collision_info[1].pos[i]);
r32458r32459
18991871      break;
19001872
19011873   case 0xb100: {
1902      execute_b100(space, offset, data); // collisions
1874      execute_b100(space, offset, data);// collisions
19031875      break;
19041876   }
19051877
r32458r32459
22732245   if (check_command_matches(command, 0xb40, 0xbc0, 0xbc2, 0x000, 0x000, 0x000, 0x000, 0x000, funcval, funcmask))
22742246   {
22752247      executed = 1;
2276      LEGACY_execute_b100(space, offset, data);
2248      execute_b100(space, offset, data);
22772249      return;
22782250   }
22792251
r32458r32459
22882260   if (check_command_matches(command, 0xb60, 0xbe0, 0xbe2, 0x000, 0x000, 0x000, 0x000, 0x000, funcval, funcmask))
22892261   {
22902262      executed = 1;
2291      LEGACY_execute_b900(space, offset, data);
2263      execute_b900(space, offset, data);
22922264      return;
22932265   }
22942266
trunk/src/mame/machine/raiden2cop.h
r32458r32459
129129
130130
131131   struct colinfo {
132
133      colinfo()
134      {
135         pos[0] = pos[1] = pos[2] = 0;
136         dx[0] = dx[1] = dx[2] = 0;
137         size[0] = size[1] = size[2] = 0;
138         allow_swap = false;
139         flags_swap = 0;
140         spradr = 0;
141         min[0] = min[1] = min[2] = 0;
142         max[0] = max[1] = max[2] = 0;
143     
144      }
145
146
132147      INT16 pos[3];
133148      INT8 dx[3];
134149      UINT8 size[3];
135150      bool allow_swap;
136151      UINT16 flags_swap;
137152      UINT32 spradr;
153      INT16 min[3], max[3];
154
155
138156   };
139157
140158   colinfo cop_collision_info[2];
r32458r32459
144162   UINT16 cop_hit_val_stat;
145163
146164   void cop_collision_read_pos(address_space &space, int slot, UINT32 spradr, bool allow_swap);
147   void cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr);
148165
149166   void execute_8100(address_space &space, int offset, UINT16 data);
150167   void execute_8900(address_space &space, int offset, UINT16 data);
r32458r32459
173190   void LEGACY_execute_130e(address_space &space, int offset, UINT16 data);
174191   void LEGACY_execute_130e_cupsoc(address_space &space, int offset, UINT16 data);
175192   void LEGACY_execute_3b30(address_space &space, int offset, UINT16 data);
176   void LEGACY_execute_b100(address_space &space, int offset, UINT16 data);
177   void LEGACY_execute_b900(address_space &space, int offset, UINT16 data);
178193   void LEGACY_execute_42c2(address_space &space, int offset, UINT16 data);
179194   void LEGACY_execute_e30e(address_space &space, int offset, UINT16 data);
180195   void LEGACY_execute_6200(address_space &space, int offset, UINT16 data);
r32458r32459
228243   int m_LEGACY_r0, m_LEGACY_r1;
229244   DECLARE_WRITE16_MEMBER(LEGACY_cop_cmd_w);
230245
231   struct LEGACY_collision_info
232   {
233      LEGACY_collision_info()
234      {
235         min[0] = min[1] = min[2] = 0;
236         max[0] = max[1] = max[2] = 0;
237     
238      }
239246
240      INT16 min[3], max[3];
241   };
247   void  cop_collision_update_hitbox(address_space &space, UINT16 data, int slot, UINT32 hitadr);
242248
243   struct LEGACY_collision_info m_LEGACY_cop_collision_info[2];
244   void  LEGACY_cop_collision_update_hitbox(address_space &space, UINT16 data, int slot, UINT32 hitadr);
245
246249   // endian stuff?
247250   int m_cpu_is_68k;
248251   static void set_cpu_is_68k(device_t &device, int value) { downcast<raiden2cop_device &>(device).m_cpu_is_68k = value; }

Previous 199869 Revisions Next


© 1997-2024 The MAME Team