-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBomberEnemy.c
101 lines (80 loc) · 2.78 KB
/
BomberEnemy.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "Point.h"
#include "BomberEnemy.h"
#include "Player.h"
#include "Particle.h"
#include "RayCast.h"
BomberEnemy* CreateBomberEnemy(Point p)
{
BomberEnemy* bomberEnemy = (BomberEnemy*)malloc(sizeof(BomberEnemy));
if (bomberEnemy == NULL) exit(-1);
Enemy* enemy = (Enemy*)bomberEnemy;
enemy->base.entity.pos = p;
enemy->base.entity.type = BomberEnemyType;
enemy->state = Tracking;
enemy->hp = 20;
enemy->detectionRadius = 10;
enemy->memory = CreateRayCastResult(enemy->detectionRadius << 1);
enemy->memory_current_index = 0;
enemy->player_is_visible = false;
enemy->move_per_second = 2;
enemy->cant_move_until = 0;
enemy->attackDamage = 3;
enemy->attack_delay_small_beats = 4;
enemy->attack_cooldown_small_beats = 2;
enemy->small_beats_after_attack_start = 0;
enemy->small_beats_after_attack_end = 0;
enemy->is_frozen_until = 0;
bomberEnemy->attack_radius = 1;
return bomberEnemy;
}
#include "Game.h"
void BomberEnemyAttack(BomberEnemy* bEnemy);
void BomberEnemyUpdate(BomberEnemy* bEnemy) {
Enemy* enemy = (Enemy*)bEnemy;
// Moving
if (enemy->state == Tracking) {
if (SmallBeatCall()) { // after attack cooldown counting!
enemy->small_beats_after_attack_end++;
}
if (enemy->attack_cooldown_small_beats <= enemy->small_beats_after_attack_end) { // cooled down! ready to move!
EnemyMoveAsMemory(bEnemy);
Rect attack_detection_rect = {
.x = bEnemy->base.entity.pos.x - bEnemy->attack_radius,
.y = bEnemy->base.entity.pos.y - bEnemy->attack_radius,
.width = bEnemy->attack_radius * 2 + 1,
.height = bEnemy->attack_radius * 2 + 1
};
if (RectContainsPoint(&attack_detection_rect, &player->base.entity.pos)) { // player in range!
enemy->facing = EnemyDirectionToFacePlayer(bEnemy); // attack direction is decided!
enemy->small_beats_after_attack_start = 0; // attack delay counting is started!
enemy->state = ReadyToAttack;
}
}
}
// Attacking
else if (enemy->state == ReadyToAttack) {
if (SmallBeatCall()) { // delay counting!
enemy->small_beats_after_attack_start++;
}
if (enemy->attack_delay_small_beats <= enemy->small_beats_after_attack_start) { // ATTACK!
BomberEnemyAttack(bEnemy);
enemy->small_beats_after_attack_end = 0;
enemy->state = Tracking;
}
}
}
void BomberEnemyAttack(BomberEnemy* bEnemy) {
Enemy* enemy = (Enemy*)bEnemy;
Rect attack_rect = {
.x = enemy->base.entity.pos.x - bEnemy->attack_radius,
.y = enemy->base.entity.pos.y - bEnemy->attack_radius,
.width = bEnemy->attack_radius * 2 + 1,
.height = bEnemy->attack_radius * 2 + 1
};
Point playerPos = GetPlayerPos();
if (RectContainsPoint(&attack_rect, &playerPos)) {
PlayerOnHit(enemy->attackDamage);
}
CreateParticle(Direction.north, enemy->base.entity.pos, ExplosionParticleType1, enemy->attackDamage);
bEnemy->base.enemy.hp = 0;
}