forked from NotAShelf/rogged
Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: I9d8998707c02e64cf177a6eeb51e399e6a6a6964
77 lines
1.5 KiB
C
77 lines
1.5 KiB
C
#include "combat.h"
|
|
#include "common.h"
|
|
#include <stddef.h>
|
|
|
|
// Track combat events for feedback
|
|
typedef struct {
|
|
const char *message;
|
|
int damage;
|
|
int is_player_damage;
|
|
} CombatEvent;
|
|
|
|
static CombatEvent last_event = {NULL, 0, 0};
|
|
|
|
const char *combat_get_last_message(void) {
|
|
return last_event.message;
|
|
}
|
|
|
|
int combat_get_last_damage(void) {
|
|
return last_event.damage;
|
|
}
|
|
|
|
int combat_was_player_damage(void) {
|
|
return last_event.is_player_damage;
|
|
}
|
|
|
|
void combat_player_attack(Player *p, Enemy *e) {
|
|
if (e == NULL || !e->alive)
|
|
return;
|
|
|
|
// Deal damage
|
|
int damage = p->attack;
|
|
e->hp -= damage;
|
|
|
|
// Set combat event
|
|
last_event.damage = damage;
|
|
last_event.is_player_damage = 0;
|
|
|
|
// Check if enemy died
|
|
if (e->hp <= 0) {
|
|
e->hp = 0;
|
|
e->alive = 0;
|
|
last_event.message = "Enemy killed!";
|
|
} else {
|
|
last_event.message = "You hit the enemy";
|
|
}
|
|
}
|
|
|
|
void combat_enemy_attack(Enemy *e, Player *p) {
|
|
if (e == NULL || !e->alive)
|
|
return;
|
|
if (p == NULL)
|
|
return;
|
|
|
|
// Deal damage reduced by defense (minimum 1 damage)
|
|
int damage = e->attack - p->defense;
|
|
if (damage < 1)
|
|
damage = 1;
|
|
p->hp -= damage;
|
|
|
|
// Set combat event
|
|
last_event.damage = damage;
|
|
last_event.is_player_damage = 1;
|
|
|
|
// Check if player died
|
|
if (p->hp <= 0) {
|
|
p->hp = 0;
|
|
last_event.message = "You died!";
|
|
} else {
|
|
last_event.message = "Enemy attacks!";
|
|
}
|
|
}
|
|
|
|
void combat_reset_event(void) {
|
|
last_event.message = NULL;
|
|
last_event.damage = 0;
|
|
last_event.is_player_damage = 0;
|
|
}
|