| 750 | } |
| 751 | |
| 752 | void Monster::RotateToTarget( float time_delta_s ) |
| 753 | { |
| 754 | if( !target_.have_position ) |
| 755 | return; |
| 756 | |
| 757 | const m_Vec2 vec_to_target= target_.position.xy() - pos_.xy(); |
| 758 | if( vec_to_target.SquareLength() == 0.0f ) |
| 759 | return; |
| 760 | |
| 761 | const float target_angle= NormalizeAngle( std::atan2( vec_to_target.y, vec_to_target.x ) ); |
| 762 | float target_angle_delta= target_angle - angle_; |
| 763 | if( target_angle_delta > +Constants::pi ) |
| 764 | target_angle_delta-= Constants::two_pi; |
| 765 | if( target_angle_delta < -Constants::pi ) |
| 766 | target_angle_delta+= Constants::two_pi; |
| 767 | |
| 768 | if( target_angle_delta != 0.0f ) |
| 769 | { |
| 770 | const GameResources::MonsterDescription& monster_description= game_resources_->monsters_description[ monster_id_ ]; |
| 771 | |
| 772 | const float abs_target_angle_delta= std::abs(target_angle_delta); |
| 773 | const float angle_delta= time_delta_s * float(monster_description.rotation_speed); |
| 774 | |
| 775 | if( angle_delta >= abs_target_angle_delta ) |
| 776 | angle_= target_angle; |
| 777 | else |
| 778 | { |
| 779 | const float turn_direction= target_angle_delta > 0.0f ? 1.0f : -1.0f; |
| 780 | angle_= NormalizeAngle( angle_ + turn_direction * angle_delta ); |
| 781 | } |
| 782 | } |
| 783 | } |
| 784 | |
| 785 | bool Monster::SelectTarget( const Map& map ) |
| 786 | { |
nothing calls this directly
no test coverage detected