| 2676 | } |
| 2677 | |
| 2678 | void Map::MoveMapObjects( const Time current_time ) |
| 2679 | { |
| 2680 | // Zero objects transformations. Set mortal flag to false. |
| 2681 | for( DynamicWall& wall : dynamic_walls_ ) |
| 2682 | { |
| 2683 | wall.transformation.Clear(); |
| 2684 | wall.vert_move_speed[0]= wall.vert_move_speed[1]= m_Vec2( 0.0f, 0.0f ); |
| 2685 | wall.mortal= false; |
| 2686 | } |
| 2687 | |
| 2688 | for( StaticModel& model : static_models_ ) |
| 2689 | { |
| 2690 | model.transformation.Clear(); |
| 2691 | model.transformation_angle_delta= 0.0f; |
| 2692 | model.move_speed= m_Vec2( 0.0f, 0.0f ); |
| 2693 | model.mortal= false; |
| 2694 | } |
| 2695 | |
| 2696 | /* Accumulate transformations from procedures on objects. |
| 2697 | * Several transformations can be applied for one object. |
| 2698 | * But, if transformation effect depends on their order, result may be incorrect. |
| 2699 | * Examples of "bad" transformations combination: |
| 2700 | * Rotate + Move, Rotate + Rotate with different center, etc. |
| 2701 | */ |
| 2702 | for( unsigned int p= 0u; p < procedures_.size(); p++ ) |
| 2703 | { |
| 2704 | const MapData::Procedure& procedure= map_data_->procedures[p]; |
| 2705 | const ProcedureState& procedure_state= procedures_[p]; |
| 2706 | |
| 2707 | float absolute_action_stage; |
| 2708 | float move_dir_sign= 0.0f; |
| 2709 | if( procedure_state.movement_state == ProcedureState::MovementState::Movement ) |
| 2710 | { |
| 2711 | absolute_action_stage= procedure_state.movement_stage; |
| 2712 | move_dir_sign= +1.0f; |
| 2713 | } |
| 2714 | else if( procedure_state.movement_state == ProcedureState::MovementState::BackWait ) |
| 2715 | absolute_action_stage= 1.0f; |
| 2716 | else if( procedure_state.movement_state == ProcedureState::MovementState::ReverseMovement ) |
| 2717 | { |
| 2718 | absolute_action_stage= 1.0f - procedure_state.movement_stage; |
| 2719 | move_dir_sign= -1.0f; |
| 2720 | } |
| 2721 | else |
| 2722 | absolute_action_stage= 0.0f; |
| 2723 | |
| 2724 | |
| 2725 | const bool mortal= |
| 2726 | procedure.mortal && |
| 2727 | ( procedure_state.movement_state == ProcedureState::MovementState::Movement || procedure_state.movement_state == ProcedureState::MovementState::ReverseMovement ); |
| 2728 | |
| 2729 | for( const MapData::Procedure::ActionCommand& command : procedure.action_commands ) |
| 2730 | { |
| 2731 | using Action= MapData::Procedure::ActionCommandId; |
| 2732 | switch( command.id ) |
| 2733 | { |
| 2734 | case Action::Move: |
| 2735 | case Action::XMove: |