/*
 * DisplayWorld.cpp
 *
 *  Created on: 21 févr. 2017
 *      Author: sylvain
 */

#include "GameController.h"

GameController::GameController(){

    monsters = new QList<Monster*>();
    link = new Link();
    score = 0;
    timer = 300;
    monsterTimer = 5;
    inGame = false;
}

GameController::~GameController() {
	// TODO Auto-generated destructor stub
}



QGraphicsView *GameController::getWidget(void){
    return gameView.getView();
}

//Boucle principale du jeu:
//Gestion collisions et destruction monstres
//Spawn monstres basé sur le temps
//Rendering sur la map
//Comptage du temps/points et màj de la statView
void GameController::gameLoop(){
    //fix link at startup
    if(!inGame){
        stopDown();
        stopLeft();
        stopRight();
        stopUp();
        inGame=true;
     }

    //qDebug() << "main game loop";
    timer= timer - 0.01;
    monsterTimer= monsterTimer - 0.01;

    //Spawn de monstres tous les 5s pour le moment
    if (monsterTimer <= 0)
    {
        qDebug() << "monster spawned";
        monsters->append(new Monster());
        monsterTimer = 5;
    }

    //Déplacement de link selon les bools de la structure linkMove
    if (linkMoves.D)
       link->moveDown();

    if (linkMoves.U)
       link->moveUp();

    if (linkMoves.R)
       link->moveRight();

    if (linkMoves.L)
       link->moveLeft();

    if (linkMoves.A)
        link->attackGeneric();

    if (linkMoves.B)
        link->attackGeneric();

    if (!(linkMoves.D || linkMoves.U || linkMoves.R || linkMoves.L))
        link->stop();

//    for(int i=0;i<monsters->size();i++){
//        int life = link->getLife();
//        if(link->getXPos()>=monsters->at(i)->getXPos()&&link->getYPos()>=monsters->at(i)->getYPos()){
//           life--;
//            link->setLife(life);
//        }
//    }
    for(int i=0;i<monsters->size();i++){
        int life = link->getLife();
        int monsterLife = monsters->at(i)->getLife();
        int xMax = link->getXPos()+50;
        int xMin = link->getXPos()-50;
        int yMax = link->getYPos()+50;
        int yMin = link->getYPos()-50;
        if((link->getAct() != ATTACK) &&
                ((monsters->at(i)->getXPos()<xMax) &&(monsters->at(i)->getXPos()>xMin)) && ((monsters->at(i)->getYPos()<yMax) && (monsters->at(i)->getYPos()>yMin))){
            life--;
            link->setLife(life);
        }
        if((link->getAct() == ATTACK) &&
                ((monsters->at(i)->getXPos()<xMax) &&(monsters->at(i)->getXPos()>xMin)) && ((monsters->at(i)->getYPos()<yMax) && (monsters->at(i)->getYPos()>yMin))){
           monsterLife=monsterLife-1;
           monsters->at(i)->setLife(monsterLife);
        }
        if(monsters->at(i)->getLife()==0){
          score = score +1;
        }
    }


    statView.updateStats(link->getLife(),score, timer);
    gameView.updateMap(link, monsters);
}

void GameController::goLeft(){

    linkMoves.L = true;
}

void GameController::goRight(){

    linkMoves.R = true;
}

void GameController::goUp(){

    linkMoves.U = true;
}

void GameController::goDown(){

    linkMoves.D = true;
}

void GameController::stopLeft(){

    linkMoves.L = false;
}

void GameController::stopRight(){

    linkMoves.R = false;
}

void GameController::stopUp(){

    linkMoves.U = false;
}

void GameController::stopDown(){

    linkMoves.D = false;
}
void GameController::goAttackA(){

    linkMoves.A = true;
}
void GameController::stopAttackA(){

    linkMoves.A = false;
}
void GameController::goAttackB(){

    linkMoves.B = true;
}
void GameController::stopAttackB(){

    linkMoves.B = false;
}
