comparison mm7_5.cpp @ 1615:89dec2be255f

AI visibility issue temporarily fixed
author zipi
date Sat, 14 Sep 2013 22:02:56 +0100
parents 85a099ea7975
children de6e646822a6
comparison
equal deleted inserted replaced
1614:85a099ea7975 1615:89dec2be255f
4300 4300
4301 //----- (004070EF) -------------------------------------------------------- 4301 //----- (004070EF) --------------------------------------------------------
4302 bool __fastcall sub_4070EF_prolly_detect_player(unsigned int uObjID, unsigned int uObj2ID) 4302 bool __fastcall sub_4070EF_prolly_detect_player(unsigned int uObjID, unsigned int uObj2ID)
4303 { 4303 {
4304 signed int v2; // eax@1 4304 signed int v2; // eax@1
4305 //unsigned int v3; // ecx@1
4306 //signed int v4; // esi@1
4307 int v5; // ecx@2 4305 int v5; // ecx@2
4308 signed int v6; // eax@4 4306 int obj1_sector; // eax@4
4309 int object1_sector; // eax@4
4310 float v8; // ST24_4@5 4307 float v8; // ST24_4@5
4311 double v9; // ST18_8@5 4308 double v9; // ST18_8@5
4312 signed int v10; // eax@6
4313 int v11; // ecx@6 4309 int v11; // ecx@6
4314 signed int v12; // eax@7 4310 signed int v12; // eax@7
4315 int v13; // esi@7 4311 int v13; // esi@7
4316 int v14; // esi@8 4312 int v14; // esi@8
4317 int v15; // esi@9 4313 int v15; // esi@9
4318 signed int v16; // eax@11
4319 int obj2_z; // edi@11 4314 int obj2_z; // edi@11
4320 int obj2_x; // esi@11 4315 int obj2_x; // esi@11
4321 int obj2_sector; // eax@13 4316 int obj2_sector; // eax@13
4322 float v20; // ST24_4@14 4317 float v20; // ST24_4@14
4323 double v21; // ST18_8@14 4318 double v21; // ST18_8@14
4324 signed int v22; // eax@15 4319 int dist_x; // ebx@16
4325 int dist2_x; // ebx@16 4320 signed int dist_3d; // ecx@16
4326 signed int v24; // ecx@16
4327 int v25; // eax@18 4321 int v25; // eax@18
4328 //int v26; // eax@28
4329 //BLVSector *v27; // edx@31
4330 //int v28; // ecx@31
4331 BLVFace *v29; // ebx@32 4322 BLVFace *v29; // ebx@32
4332 Vec3_short_ *v30; // esi@32 4323 Vec3_short_ *v30; // esi@32
4333 int v31; // eax@32 4324 int v31; // eax@32
4334 int v32; // ST50_4@44 4325 int v32; // ST50_4@44
4335 int v33; // ST54_4@44 4326 int v33; // ST54_4@44
4336 int v34; // eax@44 4327 int v34; // eax@44
4337 char v35; // zf@44
4338 int v36; // edi@44
4339 int v37; // eax@45
4340 signed int v38; // esi@45 4328 signed int v38; // esi@45
4341 int v39; // ST4C_4@49
4342 signed __int64 v40; // qtt@50 4329 signed __int64 v40; // qtt@50
4343 __int16 v42; // bx@58 4330 __int16 next_sector; // bx@58
4344 int v43; // [sp-8h] [bp-70h]@11 4331 int v43; // [sp-8h] [bp-70h]@11
4345 int v44; // [sp-4h] [bp-6Ch]@11 4332 int v44; // [sp-4h] [bp-6Ch]@11
4346 //int v45; // [sp+Ch] [bp-5Ch]@32
4347 //__int16 v46; // [sp+10h] [bp-58h]@32
4348 int v47; // [sp+18h] [bp-50h]@20 4333 int v47; // [sp+18h] [bp-50h]@20
4349 int v48; // [sp+1Ch] [bp-4Ch]@20 4334 int v48; // [sp+1Ch] [bp-4Ch]@20
4350 int v49; // [sp+20h] [bp-48h]@20 4335 int v49; // [sp+20h] [bp-48h]@20
4351 int dist2_z; // [sp+24h] [bp-44h]@16 4336 int dist_z; // [sp+24h] [bp-44h]@16
4352 signed int v51; // [sp+24h] [bp-44h]@27 4337 signed int higher_z; // [sp+24h] [bp-44h]@27
4353 signed int v52; // [sp+28h] [bp-40h]@26 4338 signed int lower_z; // [sp+28h] [bp-40h]@26
4354 signed int v53; // [sp+2Ch] [bp-3Ch]@23 4339 signed int higher_y; // [sp+2Ch] [bp-3Ch]@23
4355 signed int v54; // [sp+30h] [bp-38h]@22 4340 signed int lower_y; // [sp+30h] [bp-38h]@22
4356 signed int v55; // [sp+34h] [bp-34h]@21 4341 signed int higher_x; // [sp+34h] [bp-34h]@21
4357 signed int v56; // [sp+38h] [bp-30h]@20 4342 signed int lower_x; // [sp+38h] [bp-30h]@20
4358 signed int v57; // [sp+3Ch] [bp-2Ch]@28 4343 signed int sectors_visited; // [sp+3Ch] [bp-2Ch]@28
4359 int v58; // [sp+44h] [bp-24h]@50 4344 int v58; // [sp+44h] [bp-24h]@50
4360 int v59; // [sp+48h] [bp-20h]@44 4345 int v59; // [sp+48h] [bp-20h]@44
4361 int obj2_y; // [sp+50h] [bp-18h]@11 4346 int obj2_y; // [sp+50h] [bp-18h]@11
4362 signed int v61; // [sp+50h] [bp-18h]@31 4347 int obj1_x; // [sp+58h] [bp-10h]@4
4363 //int v62; // [sp+54h] [bp-14h]@16 4348 int obj1_y; // [sp+5Ch] [bp-Ch]@4
4364 int obj_x; // [sp+58h] [bp-10h]@4 4349 int obj1_z; // [sp+60h] [bp-8h]@4
4365 int obj_y; // [sp+5Ch] [bp-Ch]@4 4350 int current_sector; // [sp+64h] [bp-4h]@7
4366 int obj_z; // [sp+60h] [bp-8h]@4 4351 int dist_y;
4367 int v66; // [sp+64h] [bp-4h]@7 4352 int v70;
4368 4353
4369 v2 = PID_ID(uObjID); 4354 v2 = PID_ID(uObjID);
4370 if ( PID_TYPE(uObjID) == 5 ) 4355 switch( PID_TYPE(uObjID) )
4371 { 4356 {
4372 v6 = v2; 4357 case OBJECT_Decoration:
4373 obj_x = pLevelDecorations[v6].vPosition.x; 4358 obj1_x = pLevelDecorations[v2].vPosition.x;
4374 obj_y = pLevelDecorations[v6].vPosition.y; 4359 obj1_y = pLevelDecorations[v2].vPosition.y;
4375 obj_z = pLevelDecorations[v6].vPosition.z; 4360 obj1_z = pLevelDecorations[v2].vPosition.z;
4376 object1_sector = pIndoor->GetSector(obj_x, obj_y, obj_z); 4361 obj1_sector = pIndoor->GetSector(obj1_x, obj1_y, obj1_z);
4377 } 4362 break;
4378 else if ( PID_TYPE(uObjID) == 3 ) 4363 case OBJECT_Actor:
4379 { 4364 obj1_x = pActors[v2].vPosition.x;
4380 obj_x = pActors[v2].vPosition.x; 4365 obj1_y = pActors[v2].vPosition.y;
4381 obj_y = pActors[v2].vPosition.y;
4382 v8 = (double)pActors[v2].uActorHeight * 0.69999999; 4366 v8 = (double)pActors[v2].uActorHeight * 0.69999999;
4383 //v9 = v8 + 6.7553994e15; 4367 //v9 = v8 + 6.7553994e15;
4384 //obj_z = LODWORD(v9) + pActors[v2].vPosition.z; 4368 //obj1_z = LODWORD(v9) + pActors[v2].vPosition.z;
4385 obj_z = (int)v8 + pActors[v2].vPosition.z; 4369 obj1_z = (int)v8 + pActors[v2].vPosition.z;
4386 object1_sector = pActors[v2].uSectorID; 4370 obj1_sector = pActors[v2].uSectorID;
4371 break;
4372 case OBJECT_Item:
4373 obj1_x = pSpriteObjects[v2].vPosition.x;
4374 obj1_y = pSpriteObjects[v2].vPosition.y;
4375 obj1_z = pSpriteObjects[v2].vPosition.z;
4376 obj1_sector = pSpriteObjects[v2].uSectorID;
4377 break;
4378 default:
4379 return 0;
4387 } 4380 }
4388 else if ( PID_TYPE(uObjID) == 2 ) 4381 v12 = PID_ID(uObj2ID);
4382 switch( PID_TYPE(uObj2ID) )
4389 { 4383 {
4390 v10 = v2; 4384 case OBJECT_Decoration:
4391 obj_x = pSpriteObjects[v10].vPosition.x; 4385 obj2_z = pLevelDecorations[v12].vPosition.z;
4392 obj_y = pSpriteObjects[v10].vPosition.y; 4386 obj2_x = pLevelDecorations[v12].vPosition.x;
4393 obj_z = pSpriteObjects[v10].vPosition.z; 4387 obj2_y = pLevelDecorations[v12].vPosition.y;
4394 object1_sector = pSpriteObjects[v10].uSectorID; 4388 obj2_sector = pIndoor->GetSector(obj2_x, obj2_y, obj2_z);
4389 break;
4390 case OBJECT_Player:
4391 obj2_x = pParty->vPosition.x;
4392 obj2_z = pParty->sEyelevel + pParty->vPosition.z;
4393 obj2_y = pParty->vPosition.y;
4394 obj2_sector = pIndoor->GetSector(obj2_x, obj2_y, obj2_z);
4395 break;
4396 case OBJECT_Actor:
4397 obj2_y = pActors[v12].vPosition.y;
4398 obj2_x = pActors[v12].vPosition.x;
4399 v20 = (double)pActors[v12].uActorHeight * 0.69999999;
4400 //v21 = v20 + 6.7553994e15;
4401 //obj2_z = LODWORD(v21) + pActors[v12].vPosition.z;
4402 obj2_z = (int)v20 + pActors[v12].vPosition.z;
4403 obj2_sector = pActors[v12].uSectorID;
4404 break;
4405 case OBJECT_Item:
4406 obj2_x = pSpriteObjects[v12].vPosition.x;
4407 obj2_z = pSpriteObjects[v12].vPosition.z;
4408 obj2_y = pSpriteObjects[v12].vPosition.y;
4409 obj2_sector = pSpriteObjects[v12].uSectorID;
4410 break;
4411 default:
4412 return 0;
4395 } 4413 }
4396 else 4414 dist_x = obj2_x - obj1_x;
4397 return 0; 4415 dist_z = obj2_z - obj1_z;
4398 v66 = object1_sector; 4416 dist_y = obj2_y - obj1_y;
4399 v12 = PID_ID(uObj2ID); 4417 dist_3d = integer_sqrt(dist_x * dist_x + dist_y * dist_y + dist_z * dist_z);
4400 if ( PID_TYPE(uObj2ID) == 5) 4418 //range check
4401 { 4419 if ( dist_3d > 5120 )
4402 v16 = v12;
4403 obj2_z = pLevelDecorations[v16].vPosition.z;
4404 obj2_x = pLevelDecorations[v16].vPosition.x;
4405 obj2_y = pLevelDecorations[v16].vPosition.y;
4406 obj2_sector = pIndoor->GetSector(obj2_x, obj2_y, obj2_z);
4407 }
4408 else if ( PID_TYPE(uObj2ID) == 4)
4409 {
4410 obj2_x = pParty->vPosition.x;
4411 obj2_z = pParty->sEyelevel + pParty->vPosition.z;
4412 obj2_y = pParty->vPosition.y;
4413 obj2_sector = pIndoor->GetSector(obj2_x, obj2_y, obj2_z);
4414 }
4415
4416 else if( PID_TYPE(uObj2ID) == 3)
4417 {
4418 obj2_y = pActors[v12].vPosition.y;
4419 obj2_x = pActors[v12].vPosition.x;
4420 v20 = (double)pActors[v12].uActorHeight * 0.69999999;
4421 //v21 = v20 + 6.7553994e15;
4422 //obj2_z = LODWORD(v21) + pActors[v12].vPosition.z;
4423 obj2_z = (int)v20 + pActors[v12].vPosition.z;
4424 obj2_sector = pActors[v12].uSectorID;
4425 }
4426
4427 else if ( PID_TYPE(uObj2ID) == 2)
4428 {
4429 v22 = v12;
4430 obj2_x = pSpriteObjects[v22].vPosition.x;
4431 obj2_z = pSpriteObjects[v22].vPosition.z;
4432 obj2_y = pSpriteObjects[v22].vPosition.y;
4433 obj2_sector = pSpriteObjects[v22].uSectorID;
4434 }
4435 else
4436 return 0;
4437 dist2_x = obj2_x - obj_x;
4438 dist2_z = obj2_z - obj_z;
4439 v24 = integer_sqrt(dist2_x * dist2_x + (obj2_y - obj_y) * (obj2_y - obj_y) + dist2_z * dist2_z);
4440 if ( v24 > 5120 )
4441 return 0; 4420 return 0;
4442 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) 4421 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
4443 return 1; 4422 return 1;
4444 v25 = 65536; 4423 v25 = 65536;
4445 if ( v24 ) 4424 if ( dist_3d )
4446 v25 = 65536 / v24; 4425 v25 = 65536 / dist_3d;
4447 v49 = dist2_x * v25; 4426 v49 = dist_x * v25;
4448 v47 = dist2_z * v25; 4427 v47 = dist_z * v25;
4449 v48 = (obj2_y - obj_y) * v25; 4428 v48 = dist_y * v25;
4450 if ( obj_x < obj2_x ) 4429 if ( obj1_x < obj2_x )
4451 { 4430 {
4452 v56 = obj_x; 4431 lower_x = obj1_x;
4453 v55 = obj2_x; 4432 higher_x = obj2_x;
4454 } 4433 }
4455 else 4434 else
4456 { 4435 {
4457 v56 = obj2_x; 4436 lower_x = obj2_x;
4458 v55 = obj_x; 4437 higher_x = obj1_x;
4459 } 4438 }
4460 if ( obj_y < obj2_y ) 4439 if ( obj1_y < obj2_y )
4461 { 4440 {
4462 v54 = obj_y; 4441 lower_y = obj1_y;
4463 v53 = obj2_y; 4442 higher_y = obj2_y;
4464 } 4443 }
4465 else 4444 else
4466 { 4445 {
4467 v54 = obj2_y; 4446 lower_y = obj2_y;
4468 v53 = obj_y; 4447 higher_y = obj1_y;
4469 } 4448 }
4470 if ( obj_z < obj2_z ) 4449 if ( obj1_z < obj2_z )
4471 { 4450 {
4472 v52 = obj_z; 4451 lower_z = obj1_z;
4473 v51 = obj2_z; 4452 higher_z = obj2_z;
4474 } 4453 }
4475 else 4454 else
4476 { 4455 {
4477 v52 = obj2_z; 4456 lower_z = obj2_z;
4478 v51 = obj_z; 4457 higher_z = obj1_z;
4479 } 4458 }
4480 v57 = 0; 4459 sectors_visited = 0;
4481 if ( v66 == obj2_sector ) 4460 //monster in same sector with player
4461 if ( obj1_sector == obj2_sector )
4482 return 1; 4462 return 1;
4483 //for ( v57 = 0; v57 < 30; v57++ ) 4463 //search starts from monster
4484 if ( v57 < 30 && !(v61 = 0, pIndoor->pSectors[v66].uNumPortals <= 0) ) 4464 current_sector = obj1_sector;
4485 for( int v61 = 0; v61 < pIndoor->pSectors[v66].uNumPortals; v61++ ) 4465 for( int current_portal = 0; current_portal < pIndoor->pSectors[current_sector].uNumPortals; current_portal++ )
4466 {
4467 v29 = &pIndoor->pFaces[pIndoor->pSectors[current_sector].pPortals[current_portal]];
4468 v30 = &pIndoor->pVertices[*v29->pVertexIDs];
4469 v31 = v29->pFacePlane_old.vNormal.z * (v30->z - obj1_z)
4470 + v29->pFacePlane_old.vNormal.y * (v30->y - obj1_y)
4471 + v29->pFacePlane_old.vNormal.x * (v30->x - obj1_x);
4472
4473 if ( current_sector != v29->uSectorID )
4474 v31 = -v31;
4475
4476 if ( v31 >= 0 && v30->x != obj1_x && v30->y != obj1_y && v30->z != obj1_z)
4477 continue;
4478
4479 if( lower_x > v29->pBounding.x2
4480 || higher_x < v29->pBounding.x1
4481 || lower_y > v29->pBounding.y2
4482 || higher_y < v29->pBounding.y1
4483 || lower_z > v29->pBounding.z2
4484 || higher_z < v29->pBounding.z1 )
4486 { 4485 {
4487 v29 = &pIndoor->pFaces[pIndoor->pSectors[v66].pPortals[v61]]; 4486 continue;
4488 v30 = &pIndoor->pVertices[*v29->pVertexIDs]; 4487 }
4489 //v45 = *(int *)&v30->x; 4488
4490 //v46 = v30->z; 4489 v32 = fixpoint_mul(v29->pFacePlane_old.vNormal.x,v49);
4491 //v31 = v29->pFacePlane_old.vNormal.z * (v46 - obj_z) 4490 v33 = fixpoint_mul(v29->pFacePlane_old.vNormal.z,v47);
4492 v31 = v29->pFacePlane_old.vNormal.z * (v30->z - obj_z) 4491 v34 = fixpoint_mul(v29->pFacePlane_old.vNormal.y,v48);
4493 //+ v29->pFacePlane_old.vNormal.y * (SHIWORD(v45) - obj_y) 4492 v59 = v32 + v33 + v34;
4494 + v29->pFacePlane_old.vNormal.y * (v30->y - obj_y) 4493 if ( v59 )
4495 //+ v29->pFacePlane_old.vNormal.x * ((signed __int16)v45 - obj_x); 4494 {
4496 + v29->pFacePlane_old.vNormal.x * (v30->x - obj_x); 4495 v70 = v29->pFacePlane_old.dist
4497 if ( v66 != v29->uSectorID ) 4496 + obj1_z * v29->pFacePlane_old.vNormal.z
4498 v31 = -v31; 4497 + obj1_x * v29->pFacePlane_old.vNormal.x
4499 //if (!( v31 >= 0 && (signed __int16)v45 != obj_x && SHIWORD(v45) != obj_y && v46 != obj_z 4498 + obj1_y * v29->pFacePlane_old.vNormal.y;
4500 if (!( v31 >= 0 && v30->x != obj_x && v30->y != obj_y && v30->z != obj_z 4499 v38 = -v70;
4501 || v56 > v29->pBounding.x2 4500
4502 || v55 < v29->pBounding.x1 4501 // if ( v59 <= 0 ^ v70 <= 0 )
4503 || v54 > v29->pBounding.y2 4502
4504 || v53 < v29->pBounding.y1 4503 /* TEMPORARY
4505 || v52 > v29->pBounding.z2 4504 if ( v59 <= 0 && v70 <= 0 )
4506 || v51 < v29->pBounding.z1 ) ) 4505 {
4507 { 4506 continue;
4508 v32 = (unsigned __int64)(v49 * (signed __int64)v29->pFacePlane_old.vNormal.x) >> 16; 4507 }
4509 v33 = (unsigned __int64)(v47 * (signed __int64)v29->pFacePlane_old.vNormal.z) >> 16; 4508 if ( !(v59 <= 0 && v70 <= 0) )
4510 v34 = (unsigned __int64)(v48 * (signed __int64)v29->pFacePlane_old.vNormal.y) >> 16; 4509 {
4511 v35 = v32 + v33 + v34 == 0; 4510 continue;
4512 v36 = v32 + v33 + v34; 4511 }
4513 v59 = v32 + v33 + v34; 4512 */
4514 if ( !v35 ) 4513
4515 { 4514 if( abs(v38) >> 14 > abs(v59) )
4516 v37 = obj_z * v29->pFacePlane_old.vNormal.z; 4515 continue;
4517 v38 = -(v29->pFacePlane_old.dist + v37 + obj_x * v29->pFacePlane_old.vNormal.x + obj_y * v29->pFacePlane_old.vNormal.y); 4516
4518 if ( v36 <= 0 ^ v29->pFacePlane_old.dist + v37 + obj_x * v29->pFacePlane_old.vNormal.x + obj_y * v29->pFacePlane_old.vNormal.y <= 0) 4517 v58 = fixpoint_sub2(v38,v59);
4519 { 4518
4520 v39 = abs(-(v29->pFacePlane_old.dist 4519 if( v58 < 0 )
4521 + v37 4520 {
4522 + obj_x * v29->pFacePlane_old.vNormal.x 4521 //TEMPORARY
4523 + obj_y * v29->pFacePlane_old.vNormal.y)) >> 14; 4522 //continue;
4524 if ( v39 > abs(v36) 4523 }
4525 || (LODWORD(v40) = v38 << 16, HIDWORD(v40) = v38 >> 16, v58 = v40 / v59, (signed int)(v40 / v59) < 0) 4524
4526 || !sub_4075DB( 4525 if(!sub_4075DB(
4527 obj_x + ((signed int)(((unsigned __int64)(v58 * (signed __int64)v49) >> 16) + 32768) >> 16), 4526 obj1_x + ((fixpoint_mul(v49,v58) + 32768) >> 16),
4528 obj_y + ((signed int)(((unsigned __int64)(v58 * (signed __int64)v48) >> 16) + 32768) >> 16), 4527 obj1_y + ((fixpoint_mul(v48,v58) + 32768) >> 16),
4529 obj_z + ((signed int)(((unsigned __int64)(v58 * (signed __int64)v47) >> 16) + 32768) >> 16), 4528 obj1_z + ((fixpoint_mul(v47,v58) + 32768) >> 16),
4530 v29) ) 4529 v29) )
4531 { 4530 {
4532 continue; 4531 //TEMPORARY
4533 } 4532 //continue;
4534 if ( v29->uSectorID == v66 ) 4533 }
4535 v42 = v29->uBackSectorID; 4534
4536 else 4535 //if there is no next sector turn back
4537 v42 = v29->uSectorID; 4536 if ( v29->uSectorID == current_sector )
4538 if ( v42 != v66 ) 4537 next_sector = v29->uBackSectorID;
4539 { 4538 else
4540 ++v57; 4539 next_sector = v29->uSectorID;
4541 v66 = v42; 4540
4542 if ( v42 == obj2_sector ) 4541 //no more portals, quit
4543 return 1; 4542 if ( next_sector == current_sector )
4544 if ( v57 < 30 && pIndoor->pSectors[v66].uNumPortals > 0) 4543 {
4545 { 4544 break;
4546 v61=-1; 4545 }
4547 continue; 4546
4548 } 4547 ++sectors_visited;
4549 4548 current_sector = next_sector;
4550 } 4549
4551 break; 4550 //found player, quit
4552 } 4551 if ( next_sector == obj2_sector )
4553 } 4552 return 1;
4554 } 4553
4555 } 4554 current_sector = next_sector;
4556 if ( v66 != obj2_sector ) 4555
4556 //did we hit limit for portals?
4557 //does the next room have portals?
4558 if ( sectors_visited < 30 && pIndoor->pSectors[current_sector].uNumPortals > 0)
4559 {
4560 current_portal=-1;
4561 continue;
4562 }
4563 else
4564 break;
4565 }
4566 }
4567 //did we stop in the sector where player is?
4568 if ( current_sector != obj2_sector )
4557 return 0; 4569 return 0;
4558 return 1; 4570 return 1;
4559 } 4571 }
4560 4572
4561 //----- (004075DB) -------------------------------------------------------- 4573 //----- (004075DB) --------------------------------------------------------
4593 a4a = a1; 4605 a4a = a1;
4594 v8 = a2; 4606 v8 = a2;
4595 for(int i = 0; i < a4->uNumVertices; i++) 4607 for(int i = 0; i < a4->uNumVertices; i++)
4596 { 4608 {
4597 dword_4F5D98_xs[i] = v9[a4->pVertexIDs[i]].x; 4609 dword_4F5D98_xs[i] = v9[a4->pVertexIDs[i]].x;
4598 dword_4F5CC4_ys[i+1] = v9[a4->pVertexIDs[i]].y; 4610 dword_4F5CC8_ys[i] = v9[a4->pVertexIDs[i]].y;
4599 } 4611 }
4600 } 4612 }
4601 else 4613 else
4602 { 4614 {
4603 v8 = a3; 4615 v8 = a3;
4605 { 4617 {
4606 a4a = a1; 4618 a4a = a1;
4607 for(int i = 0; i < a4->uNumVertices; i++) 4619 for(int i = 0; i < a4->uNumVertices; i++)
4608 { 4620 {
4609 dword_4F5D98_xs[i] = v9[a4->pVertexIDs[i]].x; 4621 dword_4F5D98_xs[i] = v9[a4->pVertexIDs[i]].x;
4610 dword_4F5CC4_ys[i+1] = v9[a4->pVertexIDs[i]].z; 4622 dword_4F5CC8_ys[i] = v9[a4->pVertexIDs[i]].z;
4611 } 4623 }
4612 } 4624 }
4613 else 4625 else
4614 { 4626 {
4615 a4a = a2; 4627 a4a = a2;
4616 for(int i = 0; i < a4->uNumVertices; i++) 4628 for(int i = 0; i < a4->uNumVertices; i++)
4617 { 4629 {
4618 dword_4F5D98_xs[i] = v9[a4->pVertexIDs[i]].y; 4630 dword_4F5D98_xs[i] = v9[a4->pVertexIDs[i]].y;
4619 dword_4F5CC4_ys[i+1] = v9[a4->pVertexIDs[i]].z; 4631 dword_4F5CC8_ys[i] = v9[a4->pVertexIDs[i]].z;
4620 } 4632 }
4621 } 4633 }
4622 } 4634 }
4623 a3a = 0; 4635 a3a = 0;
4624 dword_4F5D98_xs[a4->uNumVertices] = dword_4F5D98_xs[0]; 4636 dword_4F5D98_xs[a4->uNumVertices] = dword_4F5D98_xs[0];
4625 dword_4F5CC4_ys[a4->uNumVertices + 1] = dword_4F5CC4_ys[1]; 4637 dword_4F5CC8_ys[a4->uNumVertices] = dword_4F5CC8_ys[0];
4626 for(int i = 0; i < a4->uNumVertices; i++) 4638 for(int i = 0; i < a4->uNumVertices && a3a < 2; i++)
4627 { 4639 {
4628 if ( a3a >= 2 ) 4640 if ( dword_4F5CC8_ys[i] >= v8 ^ (dword_4F5CC8_ys[i + 1] >= v8) )
4629 break;
4630 if ( dword_4F5CC4_ys[i + 1] >= v8 ^ (dword_4F5CC4_ys[i + 2] >= v8) )
4631 { 4641 {
4632 if( dword_4F5D98_xs[i + 1] >= a4a || dword_4F5D98_xs[i] >= a4a) 4642 //if( dword_4F5D98_xs[i + 1] >= a4a || dword_4F5D98_xs[i] >= a4a)
4643 if( !(dword_4F5D98_xs[i + 1] >= a4a && dword_4F5D98_xs[i] < a4a))
4633 { 4644 {
4634 if ( (dword_4F5D98_xs[i + 1] >= a4a && dword_4F5D98_xs[i] >= a4a) 4645 if ( (dword_4F5D98_xs[i + 1] < a4a && dword_4F5D98_xs[i] >= a4a) )
4635 || (v25 = dword_4F5D98_xs[i + 1] - dword_4F5D98_xs[i], 4646 ++a3a;
4636 LODWORD(v26) = v25 << 16, 4647 //|| (v25 = dword_4F5D98_xs[i + 1] - dword_4F5D98_xs[i],LODWORD(v26) = v25 << 16, HIDWORD(v26) = v25 >> 16,
4637 HIDWORD(v26) = v25 >> 16, 4648 //dword_4F5D98_xs[i] + ((signed int)(((unsigned __int64)(v26 / (dword_4F5CC4_ys[i + 2] - dword_4F5CC4_ys[i + 1])* ((v8 - dword_4F5CC4_ys[i + 1]) << 16)) >> 16)
4638 dword_4F5D98_xs[i] 4649 // + 32768) >> 16) >= a4a) )
4639 + ((signed int)(((unsigned __int64)(v26 4650 else
4640 / (dword_4F5CC4_ys[i + 2] - dword_4F5CC4_ys[i + 1]) 4651 {
4641 * ((v8 - dword_4F5CC4_ys[i + 1]) << 16)) >> 16) 4652 v25 = fixpoint_sub2(dword_4F5D98_xs[i + 1] - dword_4F5D98_xs[i], dword_4F5CC8_ys[i + 1] - dword_4F5CC8_ys[i]);
4642 + 32768) >> 16) >= a4a) ) 4653 if( dword_4F5D98_xs[i] + (fixpoint_mul(v25, (v8 - dword_4F5CC8_ys[i]) << 16) + 32768 >> 16) >= a4a)
4643 ++a3a; 4654 ++a3a;
4655 }
4644 } 4656 }
4645 } 4657 }
4646 } 4658 }
4647 result = 1; 4659 result = 1;
4648 if ( a3a != 1 ) 4660 if ( a3a != 1 )