//Copyright (c) 2014, Jesús Martín Berlanga. All rights reserved. 
//Distributed under the BSD licence. Read "com/jme3/ai/license.txt".
package steeringDemos.demos;

import com.jme3.ai.agents.Agent;
import com.jme3.ai.agents.behaviors.npc.SimpleMainBehavior;
import com.jme3.ai.agents.behaviors.npc.steering.CompoundSteeringBehavior;
import com.jme3.ai.agents.behaviors.npc.steering.MoveBehavior;
import com.jme3.ai.agents.behaviors.npc.steering.SlowBehavior;
import com.jme3.math.Vector3f;
import java.awt.event.ActionEvent;
import javax.swing.Timer;
import steeringDemos.BasicDemo;
import steeringDemos.control.CustomSteerControl;

/**
 * Slow demo
 *
 * @author Jesús Martín Berlanga
 * @version 2.0.1
 */
public class SlowDemo extends BasicDemo {

    private SlowBehavior slow;
    private SlowBehavior slow2;
    private java.awt.event.ActionListener resetSlows = new java.awt.event.ActionListener() {
        public void actionPerformed(ActionEvent event) {
            slow.reset();
            slow2.reset();
        }
    };
    private Timer iterationTimer;

    public static void main(String[] args) {
        SlowDemo app = new SlowDemo();
        app.start();
    }

    @Override
    public void simpleInitApp() {
        this.steerControl = new CustomSteerControl(15f, 5);
        this.steerControl.setCameraSettings(getCamera());
        this.steerControl.setFlyCameraSettings(getFlyByCamera());

        brainsAppState.setApp(this);
        brainsAppState.setGameControl(this.steerControl);

        Agent agent = this.createBoid("boid ", this.neighboursColor, 0.1f);
        brainsAppState.addAgent(agent); //Add the neighbours to the brainsAppState
        this.neighboursMoveSpeed *= 3;
        this.setStats(
                agent,
                this.neighboursMoveSpeed,
                this.neighboursRotationSpeed,
                this.neighboursMass,
                this.neighboursMaxForce);

        brainsAppState.getGameControl().spawn(agent, new Vector3f());

        this.iterationTimer = new Timer(6000, this.resetSlows);
        this.iterationTimer.start();

        SimpleMainBehavior main = new SimpleMainBehavior(agent);
        MoveBehavior move = new MoveBehavior(agent);
        slow = new SlowBehavior(agent, 250, 0.0625f);
        slow2 = new SlowBehavior(agent, 250, 0.0625f);

        move.setMoveDirection(new Vector3f(1, 0, 0));
        CompoundSteeringBehavior steer = new CompoundSteeringBehavior(agent);

        steer.addSteerBehavior(move);
        steer.addSteerBehavior(slow);
        steer.addSteerBehavior(slow2);

        //nested container test
        CompoundSteeringBehavior steer2 = new CompoundSteeringBehavior(agent);
        steer2.addSteerBehavior(steer);

        main.addBehavior(steer2);
        agent.setMainBehavior(main);

        slow.setAcive(true);
        slow2.setAcive(true);

        brainsAppState.start();
    }

    @Override
    public void simpleUpdate(float tpf) {
        brainsAppState.update(tpf);
    }
}