Previous 199869 Revisions Next

r17800 Tuesday 11th September, 2012 at 17:17:30 UTC by Angelo Salese
Improved the collision detection (still some rounding errors)
[src/mame/machine]seicop.c

trunk/src/mame/machine/seicop.c
r17799r17800
17361736static struct
17371737{
17381738   int x,y;
1739   int min_x,min_y,max_x,max_y;
1739   INT16 min_x,min_y,max_x,max_y;
17401740   UINT16 hitbox;
17411741   UINT16 hitbox_x,hitbox_y;
17421742}cop_collision_info[2];
r17799r17800
17591759
17601760
17611761/*
1762Godzilla 0x12c0 height 50m
1763Megaron  0x12d0 height 55m
1764King Ghidorah 0x12c8 100m
1765Mecha Ghidorah 0x12dc 140m
1766Mecha Godzilla 0x12d4 50m
1767Gigan 0x12cc 55m
1762Godzilla 0x12c0 X = 0x21ed Y = 0x57da
1763Megaron  0x12d0 X = 0x1ef1 Y = 0x55db
1764King Ghidorah 0x12c8 X = 0x26eb Y = 0x55dc
1765Mecha Ghidorah 0x12dc X = 0x24ec Y = 0x55dc
1766Mecha Godzilla 0x12d4 X = 0x1cf1 Y = 0x52dc
1767Gigan 0x12cc X = 0x23e8 Y = 0x55db
17681768*/
1769static void cop_take_hit_box_params(UINT8 offs)
1770{
1771   INT16 start_x,start_y,end_x,end_y;
1772
1773   start_x = INT8(cop_collision_info[offs].hitbox_x);
1774   start_y = INT8(cop_collision_info[offs].hitbox_y);
1775
1776   end_x = INT8(cop_collision_info[offs].hitbox_x >> 8);
1777   end_y = INT8(cop_collision_info[offs].hitbox_y >> 8);
1778
1779   cop_collision_info[offs].min_x = start_x + (cop_collision_info[offs].x >> 16);
1780   cop_collision_info[offs].min_y = start_y + (cop_collision_info[offs].y >> 16);
1781   cop_collision_info[offs].max_x = end_x + (cop_collision_info[offs].x >> 16);
1782   cop_collision_info[offs].max_y = end_y + (cop_collision_info[offs].y >> 16);
1783}
1784
1785
17691786static UINT8 cop_calculate_collsion_detection(running_machine &machine)
17701787{
17711788   static UINT8 res;
r17799r17800
17801797   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)
17811798      res &= ~1;
17821799
1783   cop_hit_val_x = (cop_collision_info[0].min_x - cop_collision_info[1].min_x) >> 16;
1784   cop_hit_val_y = (cop_collision_info[0].min_y - cop_collision_info[1].min_y) >> 16;
1800   cop_hit_val_x = (cop_collision_info[0].x - cop_collision_info[1].x) >> 16;
1801   cop_hit_val_y = (cop_collision_info[0].y - cop_collision_info[1].y) >> 16;
17851802   cop_hit_val_z = 1;
1786   cop_hit_val_unk = res;//((cop_collision_info[0].min_y >> 16) != (cop_collision_info[1].min_y >> 16));
1803   cop_hit_val_unk = res; // TODO: there's also bit 2 and 3 triggered in the tests, no known meaning
17871804
1805
1806   //popmessage("%d %d %04x %04x %04x %04x",cop_hit_val_x,cop_hit_val_y,cop_collision_info[0].hitbox_x,cop_collision_info[0].hitbox_y,cop_collision_info[1].hitbox_x,cop_collision_info[1].hitbox_y);
1807
17881808   //if(res == 0)
17891809   //popmessage("0:%08x %08x %08x 1:%08x %08x %08x\n",cop_collision_info[0].x,cop_collision_info[0].y,cop_collision_info[0].hitbox,cop_collision_info[1].x,cop_collision_info[1].y,cop_collision_info[1].hitbox);
17901810
17911811   return res;
17921812}
17931813
1794
17951814static READ16_HANDLER( generic_cop_r )
17961815{
17971816   UINT16 retvalue;
r17799r17800
22962315         //(heatbrl)  | 9 | ffff | b080 | b40 bc0 bc2
22972316         if(COP_CMD(0xb40,0xbc0,0xbc2,0x000,0x000,0x000,0x000,0x000,u1,u2))
22982317         {
2299            UINT8 start_x,end_x,end_y;
2300            //UINT8 start_y;
23012318            cop_collision_info[0].hitbox = space->read_word(cop_register[2]);
23022319            cop_collision_info[0].hitbox_y = space->read_word((cop_register[2]&0xffff0000)|(cop_collision_info[0].hitbox));
23032320            cop_collision_info[0].hitbox_x = space->read_word(((cop_register[2]&0xffff0000)|(cop_collision_info[0].hitbox))+2);
2304            // TODO: z
23052321
2306            start_x = (cop_collision_info[0].hitbox_x & 0xff);
2307            //start_y = (cop_collision_info[0].hitbox_y & 0xff);
2308            end_x = (cop_collision_info[0].hitbox_x >> 8);
2309            end_y = (cop_collision_info[0].hitbox_y >> 8);
2310
2311            /* TODO: understand this one */
2312            if(start_x == 0)
2313               cop_collision_info[0].min_x = cop_collision_info[0].x - ((0x10) << 16);
2314            else
2315               cop_collision_info[0].min_x = cop_collision_info[0].x + ((0) << 16);
2316
2317            cop_collision_info[0].min_y = cop_collision_info[0].y + ((0) << 16);
2318            cop_collision_info[0].max_x = cop_collision_info[0].x + ((end_x) << 16);
2319            cop_collision_info[0].max_y = cop_collision_info[0].y + ((end_y) << 16);
2320
23212322            /* do the math */
2323            cop_take_hit_box_params(0);
23222324            cop_hit_status = cop_calculate_collsion_detection(space->machine());
23232325
23242326            return;
r17799r17800
23342336         //(heatbrl)  | 6 | ffff | b880 | b60 be0 be2
23352337         if(COP_CMD(0xb60,0xbe0,0xbe2,0x000,0x000,0x000,0x000,0x000,u1,u2))
23362338         {
2337            UINT8 start_x, end_x,end_y;
2338            //UINT8 start_y;
2339
2340            /* Take hitbox param, TODO */
23412339            cop_collision_info[1].hitbox = space->read_word(cop_register[3]);
23422340            cop_collision_info[1].hitbox_y = space->read_word((cop_register[3]&0xffff0000)|(cop_collision_info[1].hitbox));
23432341            cop_collision_info[1].hitbox_x = space->read_word(((cop_register[3]&0xffff0000)|(cop_collision_info[1].hitbox))+2);
2344            // TODO: z
23452342
2346            start_x = (cop_collision_info[0].hitbox_x & 0xff);
2347            //start_y = (cop_collision_info[0].hitbox_y & 0xff);
2348            end_x = (cop_collision_info[0].hitbox_x >> 8);
2349            end_y = (cop_collision_info[0].hitbox_y >> 8);
2350
2351            /* TODO: understand this one */
2352            if(start_x == 0)
2353               cop_collision_info[1].min_x = cop_collision_info[1].x - ((0x10) << 16);
2354            else
2355               cop_collision_info[1].min_x = cop_collision_info[1].x + ((0) << 16);
2356
2357            cop_collision_info[1].min_y = cop_collision_info[1].y + ((0) << 16);
2358            cop_collision_info[1].max_x = cop_collision_info[1].x + ((end_x) << 16);
2359            cop_collision_info[1].max_y = cop_collision_info[1].y + ((end_y) << 16);
2360
2361            //if(cop_collision_info[0].x || cop_collision_info[1].x)
2362
23632343            /* do the math */
2344            cop_take_hit_box_params(1);
23642345            cop_hit_status = cop_calculate_collsion_detection(space->machine());
23652346            return;
23662347         }

Previous 199869 Revisions Next


© 1997-2024 The MAME Team