| 470 | } |
| 471 | |
| 472 | void DoForceForRecoil(object *playerobj, object *weap) { |
| 473 | weapon *w_ptr = &Weapons[weap->id]; |
| 474 | |
| 475 | vector local_norm; |
| 476 | float scale; |
| 477 | #define MIN_RECOIL 1000.0f |
| 478 | #define MAX_RECOIL 5000.0f |
| 479 | #define RECOIL_THRESHOLD 1100.0f |
| 480 | |
| 481 | if (w_ptr->recoil_force < RECOIL_THRESHOLD) |
| 482 | return; |
| 483 | |
| 484 | vector offset = weap->pos - playerobj->pos; |
| 485 | vm_MatrixMulVector(&local_norm, &offset, &playerobj->orient); |
| 486 | |
| 487 | if (weap->movement_type != MT_PHYSICS) |
| 488 | return; |
| 489 | |
| 490 | ASSERT(w_ptr->recoil_force >= MIN_RECOIL && w_ptr->recoil_force <= MAX_RECOIL); |
| 491 | scale = (w_ptr->recoil_force - MIN_RECOIL) / (MAX_RECOIL - MIN_RECOIL); |
| 492 | |
| 493 | ForceEffectsPlay(FORCE_WEAPON_RECOIL, &scale, &local_norm); |
| 494 | } |
| 495 | |
| 496 | float Force_time_since_last_shake; |
| 497 | #define SHAKE_TIME 0.2f |
no test coverage detected