diff --git a/src/camera.h b/src/camera.h index 0b48da8..4112cea 100644 --- a/src/camera.h +++ b/src/camera.h @@ -415,11 +415,13 @@ struct Camera : ICamera { if (!owner->viewTarget) { if (viewTarget && !viewTarget->flags.invisible) { vec3 targetVec = (viewTarget->pos - owner->pos).normal(); - if (targetVec.dot(owner->getDir()) > 0.5f) + if (targetVec.dot(owner->getDir()) > 0.1f) { lookAt = viewTarget; + } } - } else + } else { lookAt = owner->viewTarget; + } owner->lookAt(lookAt); } else { @@ -427,15 +429,17 @@ struct Camera : ICamera { owner->lookAt(NULL); } - if (!firstPerson && (mode == MODE_FOLLOW || mode == MODE_COMBAT)) + if (!firstPerson && (mode == MODE_FOLLOW || mode == MODE_COMBAT)) { targetAngle += angle; + } if (!firstPerson || viewIndex != -1) { if (timer > 0.0f) { timer -= Core::deltaTime; - if (timer <= 0.0f) + if (timer <= 0.0f) { resetTarget(); + } } TR::Location to; diff --git a/src/format.h b/src/format.h index 7756716..c6969dd 100644 --- a/src/format.h +++ b/src/format.h @@ -984,6 +984,8 @@ namespace TR { SND_TNT = 170, SND_MUTANT_DEATH = 171, SND_SECRET = 173, + + SND_HELICOPTER = 297, }; enum { diff --git a/src/level.h b/src/level.h index 334d73d..8f0c7df 100644 --- a/src/level.h +++ b/src/level.h @@ -1147,6 +1147,8 @@ struct Level : IGame { case TR::Entity::WINDOW_1 : case TR::Entity::WINDOW_2 : return new BreakableWindow(this, index); + case TR::Entity::HELICOPTER_FLYING : return new HelicopterFlying(this, index); + default : return new Controller(this, index); } } diff --git a/src/trigger.h b/src/trigger.h index c825f5c..db15c2a 100644 --- a/src/trigger.h +++ b/src/trigger.h @@ -1617,6 +1617,36 @@ struct BreakableWindow : Controller { }; +#define HELICOPTER_SPEED 3000 +#define HELICOPTER_RANGE (1024 * 30) + +struct HelicopterFlying : Controller { + + HelicopterFlying(IGame *game, int entity) : Controller(game, entity) {} + + virtual void update() { + pos.z += HELICOPTER_SPEED * Core::deltaTime; + updateAnimation(false); + updateRoom(); + + Controller *lara = game->getLara(pos); + + float dist = pos.z - lara->pos.z; + + Sound::Sample *sample = game->playSound(TR::SND_HELICOPTER, vec3(0.0), 0); + if (sample) { + sample->volume = (1.0f - dist / HELICOPTER_RANGE) * 0.8f; + } + + if (fabsf(dist) > HELICOPTER_RANGE) { + Sound::stop(TR::SND_HELICOPTER); + flags.invisible = true; + deactivate(true); + } + } +}; + + #define STONE_ITEM_LIGHT_RADIUS 2048.0f struct StoneItem : Controller {