This repository has been archived on 2026-05-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
prog-103-p-04-2030/HolidayTrip/Fundamentals/reap_and_tear/villager.c
T
2026-02-15 19:53:55 +01:00

145 lines
3.8 KiB
C

#include "villager.h"
#include "demon.h"
#include "weapons.h"
#include <printf.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct villager *init_villager(char name[50], int HP_max, struct gun *gun, int gun_mastery){
struct villager *villager = malloc(sizeof(struct villager));
if (villager == NULL) return NULL;
//init des var du villager
strcpy(villager->name, name);
villager->medicines = 10;
villager->distance = NEAR;
villager->cur_HP = HP_max;
villager->gun = gun;
villager->gun_mastery = gun_mastery;
villager->HP_max = HP_max;
return villager;
}
void update_villager_hp(struct villager *villager, int amount){
if(villager == NULL) return;
villager->cur_HP -= amount;
if(villager->cur_HP > villager->HP_max) villager->cur_HP = villager->HP_max;
if (villager->cur_HP <= 0) printf("You died.\n");
}
void destroy_villager(struct villager *villager){
if (villager == NULL) return;
free(villager->gun);
free(villager);
}
void shoot(struct villager *villager, struct demon *demon){
if (villager == NULL || demon == NULL) return;
if (villager->gun == NULL){
printf("Equip a gun before trying to use one.\n");
return;
}
if(villager->gun->current_magazine <= 0) {
printf("Empty gun : You gotta reload.\n");
return;
}
//villager shoot le demon
//Si les degats sont <= 0
if((villager->gun->damage + villager->gun_mastery) <= 0 ){
update_demon_hp(demon, 0);
printf("BAM! %s lost 0 HP.\n", demon->name);
return ;
}
//Si les degats sont > 0
villager->gun->current_magazine --;
if((villager->distance >= demon->range) && (villager->gun->range >= demon->range)){
update_demon_hp(demon, villager->gun->damage + villager->gun_mastery);
printf("BAM! %s lost %i HP.\n",demon->name, villager->gun_mastery + villager->gun->damage);
}
else printf("No demon in range.\n");
}
void heal(struct villager *villager){
if(villager == NULL) return;
if(villager->medicines <= 0) {
printf("No medicine left, maybe prepare some ?\n");
return;
}
villager->medicines --;
int gain = villager->HP_max * 0.25;
villager->cur_HP += gain;
if (villager->cur_HP > villager->HP_max) villager->cur_HP = villager->HP_max;
printf("Nice, you healed %i HP.\n", gain);
return;
}
enum distance walk(struct villager *villager, int direction){
// peut aller x<0 ou x>3
// A voir si la mouli accepte
if(villager == NULL) return NEAR;
/*
if (direction >= 0){
if(villager->distance == CLOSE)printf("Too close.\n");
else{
printf("You decided to move.\n");
villager->distance += direction;
}
}
else {
if (villager->distance == FAR) printf("I can't run away.\n");
else
{
printf("You decided to move.\n");
villager->distance ;
}
}
*/
// trop loin
if((villager->distance == FAR) && (direction < 0)){
printf( "I can't run away.\n");
return villager->distance;
}
// trop proche
else if((villager->distance == CLOSE) && (direction >= 0)) {
printf("Too close.\n");
return villager->distance;
}
//printf("Distance act: %d\n", villager->distance);
villager->distance -= direction;
//printf("Distance apres chg: %d\n",villager->distance);
printf("You decided to move.\n");
return villager->distance;
}
int prepare_medicine(struct villager *villager){
if (villager == NULL) return 0;
//on peut pas ajouter plus, il est deja au max
if(villager->medicines >= 10) return villager->medicines;
villager->medicines ++;
printf("Preparation ready !\n");
return villager->medicines;
}