Skip to content
Snippets Groups Projects
Select Git revision
  • a43f915ed4f159d728e75bcf8fa1c5f39f67e9f0
  • main default
  • qlearn-4
  • qlearning5
  • qlearn5
  • render
  • qlearn
  • ball
  • fire
  • player
10 results

player.c

Blame
  • player.c 6.46 KiB
    #include "player.h"
    
    player_t player;
    
    
    void initPlayer(){
        player.x = (MAPSIZE/2)*CELLSIZE;
        player.y = (MAPSIZE/2)*CELLSIZE;
        player.w = CELLSIZE*0.8;
        player.h = CELLSIZE*0.8;
        player.waterMax = 3;
        player.currentWater = player.waterMax;
        player.speed = 1;
        player.isMoving = 0;
        player.HPMax = 3;
        player.currentHP = player.HPMax;
        player.invisible = 0;
        player.invisibleTime = 5;
    }
    
    int giveCaseBelowPosition(int x, int y){
        int x2 = x/CELLSIZE;
        int y2 = y/CELLSIZE;
        return map[y2][x2];
    }
    
    int getPositionXInMap(int x){
        int x2 = x/CELLSIZE;
        return x2;
    }
    
    int getPositionYInMap(int y){
        int y2 = y/CELLSIZE;
        return y2;
    }
    
    int checkCollisionsTypeGround(int dot1, int dot2, int typeGround){
        int coll = 0;
        if(dot1==typeGround || dot2==typeGround){
            coll = 1;
        }
        return coll;
    }
    
    void checkCollisionsFire(int dot1, int dot2){
        if(player.invisible==0 && (dot1==1 || dot2==1) && player.currentHP>0){
            player.currentHP = player.currentHP - 1;
            player.invisible = 1;
            player.timeLastHitFire = (int)timer/1000;
        }
    }
    
    int collisionsLeftPlayer(){
        int collisionWindow = 0;
        int collisionTree = 0;
        int collisionWater = 0;
        int dotTopLeft = giveCaseBelowPosition(player.x, player.y);
        int dotDownLeft = giveCaseBelowPosition(player.x, player.y+player.h);
        int fireTopLeft = searchFire(fireList, getPositionXInMap(player.x), getPositionYInMap(player.y));
        int fireDownLeft = searchFire(fireList, getPositionXInMap(player.x), getPositionYInMap(player.y+player.h));
        //collision window
        if(player.x <= 0){
            collisionWindow = 1;
        }
        //collisions
        collisionTree = checkCollisionsTypeGround(dotTopLeft, dotDownLeft, TREE);
        collisionWater = checkCollisionsTypeGround(dotTopLeft, dotDownLeft, WATER);
        checkCollisionsFire(fireTopLeft, fireDownLeft);
    
        return collisionWindow || collisionTree || collisionWater;
    }
    
    int collisionsRightPlayer(){
        int collisionWindow = 0;
        int collisionTree = 0;
        int collisionWater = 0;
        int dotTopRight = giveCaseBelowPosition(player.x+player.w, player.y);
        int dotDownRight = giveCaseBelowPosition(player.x+player.w, player.y+player.h);
        int fireTopRight = searchFire(fireList, getPositionXInMap(player.x+player.w), getPositionYInMap(player.y));
        int fireDownRight = searchFire(fireList, getPositionXInMap(player.x+player.w), getPositionYInMap(player.y+player.h));
        //collision window
        if(player.x + player.w >= MAPSIZE * CELLSIZE){
            collisionWindow = 1;
        }
        //collisions
        collisionTree = checkCollisionsTypeGround(dotTopRight, dotDownRight, TREE);
        collisionWater = checkCollisionsTypeGround(dotTopRight, dotDownRight, WATER);
        checkCollisionsFire(fireTopRight, fireDownRight);
        return collisionWindow || collisionTree || collisionWater;
    }
    
    int collisionsUpPlayer(int dot1, int dot2){
        int collisionWindow = 0;
        int collisionTree = 0;
        int collisionWater = 0;
        //collision window
        if(player.y <= 0){
            collisionWindow = 1;
        }
        //collisions
        collisionTree = checkCollisionsTypeGround(dot1, dot2, TREE);
        collisionWater = checkCollisionsTypeGround(dot1, dot2, WATER);
        return collisionWindow || collisionTree || collisionWater;
    }
    
    int collisionsDownPlayer(){
        int collisionWindow = 0;
        int collisionTree = 0;
        int collisionWater = 0;
        int dotDownRight = giveCaseBelowPosition(player.x+player.w, player.y+player.h);
        int dotDownLeft = giveCaseBelowPosition(player.x, player.y+player.h);
        int fireDownRight = searchFire(fireList, getPositionXInMap(player.x+player.w), getPositionYInMap(player.y+player.h));
        int fireDownLeft = searchFire(fireList, getPositionXInMap(player.x), getPositionYInMap(player.y+player.h));
        //collision window
        if(player.y + player.h >= MAPSIZE * CELLSIZE){
            collisionWindow = 1;
        }
        //collisions
        collisionTree = checkCollisionsTypeGround(dotDownRight, dotDownLeft, TREE);
        collisionWater = checkCollisionsTypeGround(dotDownRight, dotDownLeft, WATER);
        checkCollisionsFire(fireDownRight, fireDownLeft);
        return collisionWindow || collisionTree || collisionWater;
    }
    
    void moveRightPlayer(){
        if(!collisionsRightPlayer()){
            player.x = player.x + player.speed;
        }
    }
    
    void moveLeftPlayer(){
        if(!collisionsLeftPlayer()){
            player.x = player.x - player.speed;
        }
    }
    
    void moveUpPlayer(){
        player.y = player.y - player.speed;
    }
    
    void moveDownPlayer(){
        if(!collisionsDownPlayer()){
            player.y = player.y + player.speed;
        }
    }
    
    void manageMovement(){
        int dotTopRight = giveCaseBelowPosition(player.x+player.w, player.y);
        int dotTopLeft = giveCaseBelowPosition(player.x, player.y);
        int fireTopRight = searchFire(fireList, getPositionXInMap(player.x+player.w), getPositionYInMap(player.y));
        int fireTopLeft = searchFire(fireList, getPositionXInMap(player.x), getPositionYInMap(player.y));
    
        if(keys[PLAYER_UP]){
            if(!collisionsUpPlayer(dotTopRight, dotTopLeft)){
                moveUpPlayer();
                checkCollisionsFire(fireTopRight, fireTopLeft);
                player.isMoving = 1;
                player.direction = PLAYER_UP;
            }
        }
        else if(keys[PLAYER_DOWN]){
            moveDownPlayer();
            player.isMoving = 1;
            player.direction = PLAYER_DOWN;
        }
        else if(keys[PLAYER_LEFT]){
            moveLeftPlayer();
            player.isMoving = 1;
            player.direction = PLAYER_LEFT;
        }
        else if(keys[PLAYER_RIGHT]){
            moveRightPlayer();
            player.isMoving = 1;
            player.direction = PLAYER_RIGHT;
        }
        else player.isMoving = 0;
        //
        if(player.invisible==1){
            if((int)timer/1000 - player.timeLastHitFire > player.invisibleTime){
                player.invisible = 0;
            }
        }
    }
    
    int selectStateHover(){
        int stateHover = 0;
        int distance = sqrt(pow(abs(mousePosition.x - ((player.x+player.w/2))/CELLSIZE), 2)+pow(abs(mousePosition.y - ((player.y+player.h/2))/CELLSIZE), 2));
        if(distance <= 1){
            stateHover = 1;
        }
        return stateHover;
    }
    
    void pourWater(int x, int y){
        int onFire = searchFire(fireList, x, y);     
        if(player.currentWater>0){
            //downgrade the cliqued fire
            if(onFire == 1 && selectStateHover() == 1){ 
                fireList = deleteFire (fireList, x, y); 
            }
            player.currentWater = player.currentWater - 1;
        }
    }
    
    void fillWater(int x, int y){    
        if(player.currentWater<player.waterMax && selectStateHover() == 1){
            player.currentWater = player.currentWater + 1;
        }
    }