| 1405 | } |
| 1406 | |
| 1407 | void UpdateShockwaves() |
| 1408 | { |
| 1409 | for (auto& shockwave : ShockWaves) |
| 1410 | { |
| 1411 | if (shockwave.life <= 0) |
| 1412 | continue; |
| 1413 | |
| 1414 | shockwave.StoreInterpolationData(); |
| 1415 | |
| 1416 | shockwave.life--; |
| 1417 | |
| 1418 | // Spawn light. |
| 1419 | if (shockwave.HasLight) |
| 1420 | { |
| 1421 | auto lightColor = Color(shockwave.r / (float)UCHAR_MAX, shockwave.g / (float)UCHAR_MAX, shockwave.b / (float)UCHAR_MAX); |
| 1422 | auto pos = Vector3(shockwave.x, shockwave.y, shockwave.z); |
| 1423 | SpawnDynamicPointLight(pos, lightColor, shockwave.life / 4.0f); |
| 1424 | } |
| 1425 | |
| 1426 | if (shockwave.style != (int)ShockwaveStyle::Knockback) |
| 1427 | { |
| 1428 | shockwave.outerRad += shockwave.speed; |
| 1429 | if (shockwave.style == (int)ShockwaveStyle::Sophia) |
| 1430 | shockwave.innerRad += shockwave.speed; |
| 1431 | } |
| 1432 | else |
| 1433 | { |
| 1434 | if (shockwave.life > (shockwave.sLife / 2)) |
| 1435 | { |
| 1436 | shockwave.outerRad += shockwave.speed; |
| 1437 | shockwave.innerRad += shockwave.speed; |
| 1438 | } |
| 1439 | else |
| 1440 | { |
| 1441 | shockwave.outerRad -= shockwave.speed; |
| 1442 | shockwave.innerRad -= shockwave.speed; |
| 1443 | } |
| 1444 | } |
| 1445 | |
| 1446 | shockwave.speed -= (shockwave.speed >> 4); |
| 1447 | |
| 1448 | if (LaraItem->HitPoints > 0 && shockwave.damage) |
| 1449 | { |
| 1450 | const auto& bounds = GetClosestKeyframe(*LaraItem).BoundingBox; |
| 1451 | int dx = LaraItem->Pose.Position.x - shockwave.x; |
| 1452 | int dz = LaraItem->Pose.Position.z - shockwave.z; |
| 1453 | float dist = sqrt(SQUARE(dx) + SQUARE(dz)); |
| 1454 | int angle = phd_atan(dz, dx); |
| 1455 | |
| 1456 | // Damage player if inside shockwave. |
| 1457 | if (shockwave.y > (LaraItem->Pose.Position.y + bounds.Y1) && |
| 1458 | shockwave.y < (LaraItem->Pose.Position.y + (bounds.Y2 + CLICK(1))) && |
| 1459 | dist > shockwave.innerRad && |
| 1460 | dist < shockwave.outerRad) |
| 1461 | { |
| 1462 | TriggerShockwaveHitEffect( |
| 1463 | LaraItem->Pose.Position.x, shockwave.y, LaraItem->Pose.Position.z, |
| 1464 | shockwave.r, shockwave.g, shockwave.b, |
no test coverage detected