Adoranda/src/monster.c

79 lines
1.9 KiB
C
Raw Normal View History

2022-02-13 21:46:52 +01:00
#include <string.h>
#include <stdlib.h>
2022-02-17 01:04:45 +01:00
#include <gint/rtc.h>
2022-02-13 21:46:52 +01:00
2022-01-30 01:09:58 +01:00
#include "monster.h"
#include "stats.h"
#include "capacite.h"
2022-02-11 19:00:44 +01:00
#include "player.h"
2022-02-17 00:02:00 +01:00
#include "map.h"
2022-02-17 01:04:45 +01:00
#include "util.h"
2022-01-30 01:09:58 +01:00
2022-02-11 19:00:44 +01:00
struct Monster *generate_monster(struct Game *game) {
2022-01-30 01:09:58 +01:00
2022-02-10 15:20:42 +01:00
extern struct Monster monster_test;
2022-02-11 19:00:44 +01:00
2022-02-12 02:05:10 +01:00
struct Monster *monster = copyMonster(&monster_test);
2022-02-17 00:02:00 +01:00
2022-02-17 01:04:45 +01:00
srand(rtc_ticks());
2022-02-17 00:02:00 +01:00
int level_zone = get_level_zone(game->player, game->map);
//En cas d'erreur / aucune zone trouvée
if(level_zone == -1) {
level_zone = game->player->stats.level;
}
2022-02-17 01:04:45 +01:00
int signe = rand_range(0,2);
signe = signe ? -1 : 1;
int variation = signe*rand_range(0,6);
int level = level_zone + variation;
if(level > 100) level = 100;
if(level < 1) level = 1;
monster->stats->level = level;
2022-02-13 21:46:52 +01:00
set_stats_level(monster->stats);
2022-02-17 01:04:45 +01:00
2022-02-13 21:46:52 +01:00
monster->stats->pv = monster->stats->max_pv;
2022-02-12 02:05:10 +01:00
return monster;
2022-02-11 19:00:44 +01:00
}
2022-02-15 21:46:53 +01:00
struct Move *monster_select(struct Player *player, struct Monster *monster) {
2022-02-16 19:40:41 +01:00
struct Move *stoMove = get_move_id_pointer(monster->moves[0]);
2022-02-13 21:46:52 +01:00
int stoDamage = 0;
2022-02-11 19:00:44 +01:00
for(int i = 0; i < monster->nbMoves; i++) {
2022-02-16 19:40:41 +01:00
struct Move *move = get_move_id_pointer(monster->moves[i]);
2022-02-13 21:46:52 +01:00
int damage = calc_damage(monster->stats, &player->stats, move);
2022-02-18 15:44:41 +01:00
// if(damage >= player->stats.pv) {
// stoMove = move;
// if(move->precision > 80) return move;
// }
2022-02-13 21:46:52 +01:00
if(damage > stoDamage) {
2022-02-11 19:00:44 +01:00
stoMove = move;
2022-02-13 21:46:52 +01:00
stoDamage = damage;
2022-02-11 19:00:44 +01:00
}
}
return stoMove;
}
struct Monster *copyMonster(struct Monster *source) {
struct Monster *dest = malloc(sizeof(struct Monster));
2022-02-11 19:41:41 +01:00
dest->name = source->name;
2022-02-11 19:00:44 +01:00
dest->nbMoves = source->nbMoves;
dest->sprite = source->sprite;
dest->moves = malloc(dest->nbMoves * sizeof *source->moves);
memcpy(dest->moves, source->moves, dest->nbMoves * sizeof *source->moves);
dest->stats = malloc(sizeof *source->stats);
memcpy(dest->stats, source->stats, sizeof *source->stats);
return dest;
2022-02-11 19:41:41 +01:00
}
void free_monster(struct Monster *monster) {
free(monster->moves);
free(monster->stats);
free(monster);
2022-01-30 01:09:58 +01:00
}