Mercurial > mm7
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 ) |