mirror of https://github.com/bgiraudr/Adoranda.git
add precision
This commit is contained in:
parent
35cbdca9c5
commit
e139f5df6d
|
@ -1,4 +1,4 @@
|
|||
Test capacité;5;5;3
|
||||
Deuxième;100;100;11
|
||||
Charge;25;25;15
|
||||
Cheat;25;25;45
|
||||
Test capacité;5;5;3;20
|
||||
Deuxième;100;100;11;50
|
||||
Charge;25;25;15;100
|
||||
Cheat;25;25;45;100
|
||||
|
|
|
@ -13,5 +13,6 @@ int battle(struct Player *player, struct Monster *monster);
|
|||
int select_move(struct Player *player, struct Monster *monster, int prec_selected);
|
||||
void draw_battle(struct Player *player, struct Monster *monster);
|
||||
void draw_executed_move(struct Move *move, struct Monster *monster, int is_monster);
|
||||
void draw_crit();
|
||||
void finish_battle(int status, struct Game *game, struct Monster *monster);
|
||||
void draw_status(char *message);
|
||||
void finish_battle(int status, struct Game *game, struct Monster *monster);
|
||||
void check_move_status(int status, struct Player *player, struct Monster *monster);
|
|
@ -6,6 +6,7 @@ struct Move {
|
|||
int init_pp;
|
||||
int pp;
|
||||
int atk;
|
||||
int precision;
|
||||
};
|
||||
|
||||
struct Capacities {
|
||||
|
@ -13,15 +14,22 @@ struct Capacities {
|
|||
struct Move *moves[];
|
||||
};
|
||||
|
||||
enum status {
|
||||
MISS = 0,
|
||||
SUCCESS = 1,
|
||||
CRIT = 2
|
||||
};
|
||||
|
||||
struct Move default_move();
|
||||
struct Move get_move_id(int id);
|
||||
void draw_move(int x, int y, int x2, int y2, struct Move *move);
|
||||
void draw_classic_move(int x, int y, struct Move *move);
|
||||
void execute_move(struct Stats *player_stats, struct Stats *monster_stats, struct Move *move, int ismonster);
|
||||
int execute_move(struct Stats *player_stats, struct Stats *monster_stats, struct Move *move, int ismonster);
|
||||
int calc_damage(struct Stats *attacker, struct Stats *target, struct Move *move);
|
||||
struct Move *copy_move(struct Move move);
|
||||
|
||||
struct Move *get_move_id_pointer(int id);
|
||||
|
||||
float crit(struct Stats *attacker);
|
||||
int is_crit();
|
||||
int is_crit();
|
||||
int is_miss(struct Move *move);
|
46
src/battle.c
46
src/battle.c
|
@ -30,6 +30,7 @@ void create_battle(struct Game *game) {
|
|||
int battle(struct Player *player, struct Monster *monster) {
|
||||
int tour = 0;
|
||||
int selection = 0;
|
||||
int status;
|
||||
while(1) {
|
||||
draw_battle(player, monster);
|
||||
dupdate();
|
||||
|
@ -37,14 +38,8 @@ int battle(struct Player *player, struct Monster *monster) {
|
|||
draw_executed_move(player->moves[selection], monster, 0);
|
||||
dupdate();
|
||||
wait_for_input(KEY_SHIFT);
|
||||
execute_move(&player->stats, monster->stats, player->moves[selection], 0);
|
||||
|
||||
if(is_crit()) {
|
||||
draw_battle(player, monster);
|
||||
draw_crit();
|
||||
dupdate();
|
||||
wait_for_input(KEY_SHIFT);
|
||||
}
|
||||
status = execute_move(&player->stats, monster->stats, player->moves[selection], 0);
|
||||
check_move_status(status, player, monster);
|
||||
|
||||
draw_battle(player, monster);
|
||||
|
||||
|
@ -59,14 +54,8 @@ int battle(struct Player *player, struct Monster *monster) {
|
|||
draw_executed_move(monster_move, monster, 1);
|
||||
dupdate();
|
||||
wait_for_input(KEY_SHIFT);
|
||||
execute_move(&player->stats, monster->stats, monster_move, 1);
|
||||
|
||||
if(is_crit()) {
|
||||
draw_battle(player, monster);
|
||||
draw_crit();
|
||||
dupdate();
|
||||
wait_for_input(KEY_SHIFT);
|
||||
}
|
||||
status = execute_move(&player->stats, monster->stats, monster_move, 1);
|
||||
check_move_status(status, player, monster);
|
||||
|
||||
if(player->stats.pv <= 0) {
|
||||
return LOSE;
|
||||
|
@ -79,6 +68,22 @@ int battle(struct Player *player, struct Monster *monster) {
|
|||
return LOSE;
|
||||
}
|
||||
|
||||
void check_move_status(int status, struct Player *player, struct Monster *monster) {
|
||||
if(status == CRIT) {
|
||||
draw_battle(player, monster);
|
||||
draw_status("Coup critique !");
|
||||
dupdate();
|
||||
wait_for_input(KEY_SHIFT);
|
||||
}
|
||||
|
||||
if(status == MISS) {
|
||||
draw_battle(player, monster);
|
||||
draw_status("Mais il rate !");
|
||||
dupdate();
|
||||
wait_for_input(KEY_SHIFT);
|
||||
}
|
||||
}
|
||||
|
||||
/*When a battle is finish, compute xp gain and gain level*/
|
||||
void finish_battle(int status, struct Game *game, struct Monster *monster) {
|
||||
if(status == WIN) {
|
||||
|
@ -86,7 +91,6 @@ void finish_battle(int status, struct Game *game, struct Monster *monster) {
|
|||
int xp = ceil((monster->stats->xp*monster->stats->level*1.5)/7);
|
||||
|
||||
dimage(42,DHEIGHT-75,&img_dialogue);
|
||||
|
||||
dprint(50,DHEIGHT-47, C_BLACK, "Vous remportez %d points d'experience", xp);
|
||||
dupdate();
|
||||
wait_for_input(KEY_SHIFT);
|
||||
|
@ -139,9 +143,9 @@ int select_move(struct Player *player, struct Monster *monster, int prec_selecte
|
|||
dtext(58 + (selection * 130), DHEIGHT-15 , C_RED, "[X]");
|
||||
dupdate();
|
||||
|
||||
if(keydown(KEY_SHIFT) && player->moves[selection]->pp > 0) {
|
||||
if(keydown(KEY_SHIFT)) {
|
||||
if(buffer) buffer = 0;
|
||||
else break;
|
||||
else if(player->moves[selection]->pp > 0) break;
|
||||
}
|
||||
if(keydown(KEY_EXIT)) {
|
||||
break;
|
||||
|
@ -200,7 +204,7 @@ void draw_executed_move(struct Move *move, struct Monster *monster, int is_monst
|
|||
}
|
||||
}
|
||||
|
||||
void draw_crit() {
|
||||
void draw_status(char *message) {
|
||||
dimage(42,DHEIGHT-75,&img_dialogue);
|
||||
dprint(50,DHEIGHT-47, C_BLACK, "Coup critique !");
|
||||
dprint(50,DHEIGHT-47, C_BLACK, "%s", message);
|
||||
}
|
|
@ -29,6 +29,7 @@ struct Move *copy_move(struct Move move) {
|
|||
|
||||
copyMove->pp = move.pp;
|
||||
copyMove->atk = move.atk;
|
||||
copyMove->precision = move.precision;
|
||||
|
||||
return copyMove;
|
||||
}
|
||||
|
@ -39,7 +40,8 @@ void draw_move(int x, int y, int x2, int y2, struct Move *move) {
|
|||
dimage(x, y, &img_capacite);
|
||||
int color = move->pp > 0 ? C_BLACK : C_RED;
|
||||
dprint(x+15, y+5, color, "PP : %d", move->pp);
|
||||
dprint(x+15, y2-20, C_BLACK, "ATK : %d", move->atk);
|
||||
dprint(x+15, y2-17, C_BLACK, "ATK : %d", move->atk);
|
||||
dprint(x+70, y2-17, C_BLACK, "PRE : %d", move->precision);
|
||||
dprint((int)((x+x2)/2)-(int)(strlen(move->name)/2*font_size),
|
||||
(int)((y+y2)/2)-font_size/2,
|
||||
C_BLACK, "%s", move->name);
|
||||
|
@ -49,13 +51,22 @@ void draw_classic_move(int x, int y, struct Move *move) {
|
|||
draw_move(x, y, x+125, y+60, move);
|
||||
}
|
||||
|
||||
void execute_move(struct Stats *player_stats, struct Stats *monster_stats, struct Move *move, int ismonster) {
|
||||
int execute_move(struct Stats *player_stats, struct Stats *monster_stats, struct Move *move, int ismonster) {
|
||||
srand(rtc_ticks());
|
||||
if(is_miss(move)) {
|
||||
move->pp--;
|
||||
return MISS;
|
||||
}
|
||||
|
||||
if(ismonster) {
|
||||
player_stats->pv-=calc_damage(monster_stats, player_stats, move);
|
||||
} else {
|
||||
move->pp--;
|
||||
monster_stats->pv-=calc_damage(player_stats, monster_stats, move);
|
||||
}
|
||||
|
||||
if(is_crit()) return CRIT;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
int calc_damage(struct Stats *attacker, struct Stats *target, struct Move *move) {
|
||||
|
@ -65,15 +76,18 @@ int calc_damage(struct Stats *attacker, struct Stats *target, struct Move *move)
|
|||
int is_crit() {
|
||||
//une chance sur 16 d'avoir un coup critique
|
||||
const int proba_crit = 16;
|
||||
return rand_range(0,proba_crit)==0 ? 1 : 0;
|
||||
return rand_range(0,proba_crit)==0;
|
||||
}
|
||||
|
||||
float crit(struct Stats *attacker) {
|
||||
srand(rtc_ticks());
|
||||
float taux = 1.0f;
|
||||
//une chance sur 16 d'avoir un coup critique
|
||||
if(is_crit()) {
|
||||
taux = (float)(2 * attacker->level + 5)/(attacker->level+5);
|
||||
}
|
||||
return taux;
|
||||
}
|
||||
|
||||
/*1 if miss, else 0*/
|
||||
int is_miss(struct Move *move) {
|
||||
return rand_range(0, 101) > move->precision;
|
||||
}
|
|
@ -45,7 +45,8 @@ struct Move *monster_select(struct Player *player, struct Monster *monster) {
|
|||
struct Move *move = get_move_id_pointer(monster->moves[i]);
|
||||
int damage = calc_damage(monster->stats, &player->stats, move);
|
||||
if(damage >= player->stats.pv) {
|
||||
return move;
|
||||
stoMove = move;
|
||||
if(move->precision > 80) return move;
|
||||
}
|
||||
if(damage > stoDamage) {
|
||||
stoMove = move;
|
||||
|
|
Loading…
Reference in New Issue