aboutsummaryrefslogtreecommitdiff
path: root/src/enemies/boar.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/enemies/boar.c')
-rw-r--r--src/enemies/boar.c221
1 files changed, 221 insertions, 0 deletions
diff --git a/src/enemies/boar.c b/src/enemies/boar.c
new file mode 100644
index 0000000..d9582f5
--- /dev/null
+++ b/src/enemies/boar.c
@@ -0,0 +1,221 @@
+#include "boar.h"
+#include "../game.h"
+#include "../hero.h"
+#include <stdlib.h>
+
+void boarStep(Boar* b);
+void boarDraw(Boar* b);
+
+void createBoar(int x, int y)
+{
+ int i;
+ for (i = 0; i < MAX_ENEMIES; i++) {
+ if (enemies[i] == NULL) {
+ Enemy* e = /*(Enemy*)*/malloc(sizeof *e);
+ Boar* b = /*(Boar*)*/malloc(sizeof *b);
+
+ b->id = i;
+
+ b->hp = 3;
+
+ b->x = x;
+ b->y = y;
+
+ b->hsp = 0;
+
+ b->imageIndex = 0;
+ b->dir = 1;
+
+ b->blink = 0;
+
+ b->state = 0;
+ b->timer = 0;
+
+ e->data = b;
+ e->enemyStep = boarStep;
+ e->enemyDraw = boarDraw;
+ e->type = 26;
+
+ enemies[i] = e;
+ i = MAX_ENEMIES;
+ }
+ }
+}
+
+void boarStep(Boar* b)
+{
+ //Setup mask
+ Mask mask;
+ {
+ mask.unused = mask.circle = 0;
+ mask.w = 32;
+ mask.h = 28;
+ mask.x = b->x + ((40 - mask.w) / 2);
+ mask.y = b->y + 40 - mask.h;
+ }
+
+ //Blink animation
+ {
+ if (b->blink > 0) {
+ b->blink -= 1;
+ }
+ }
+
+ //Patterns
+ {
+ //Dance
+ if (b->state == 0)
+ {
+ //Animate
+ b->imageIndex += 0.15;
+ if (b->imageIndex >= 8) {
+ b->imageIndex -= 8;
+ }
+
+ //if player gets near
+ Mask area;
+ area.unused = area.circle = 0;
+ area.x = b->x - 80;
+ area.y = b->y - 40;
+ area.w = 200;
+ area.h = 80;
+
+ if (checkCollision(area, getHeroMask()) == 1) {
+ b->state = 1;
+ b->timer = -1;
+ b->imageIndex = 0;
+ b->dir = 1;
+ if (herox < b->x + 20) {
+ b->dir = -1;
+ }
+ }
+ }
+ //Rev up
+ else if (b->state == 1)
+ {
+ b->timer += 1;
+
+ //Play sound
+ if (b->timer % 10 == 0) {
+ PHL_PlaySound(sounds[sndShot01], CHN_ENEMIES);
+ }
+
+ //Create effect
+ if (b->timer % 16 == 0) {
+ if (b->dir == 1) {
+ createEffectExtra(3, b->x + 20 - 30, b->y + 8, -1, 0, 0);
+ }
+ if (b->dir == -1) {
+ createEffectExtra(3, b->x + 20 - 10, b->y + 8, 1, 0, 0);
+ }
+ }
+
+ if (b->timer >= 60) {
+ b->state = 2;
+ b->hsp = 3;
+ }
+ }
+ //Running
+ else if (b->state == 2)
+ {
+ b->x += b->hsp * b->dir;
+ mask.x = b->x + ((40 - mask.w) / 2);
+
+ //Collide with wall
+ if (checkTileCollision(1, mask) == 1) {
+ b->x -= b->hsp * b->dir;
+ b->dir *= -1;
+ }
+
+ //On edge
+ {
+ mask.x = b->x + ((40 - mask.w) / 2);
+
+ mask.x += mask.w * b->dir;
+ mask.y += 1;
+
+ PHL_Rect collide = getTileCollision(1, mask);
+ if (collide.x == -1) {
+ collide = getTileCollision(3, mask);
+ }
+ if (collide.x == -1) {
+ b->dir *= -1;
+ }
+
+ mask.y -= 1;
+ mask.x = b->x + ((40 - mask.w) / 2);
+ }
+
+ b->hsp -= 0.05;
+ if (b->hsp <= 0) {
+ b->state = 0;
+ }
+ }
+
+ //Running animation
+ if (b->state == 1 || b->state == 2) {
+ //Animate
+ b->imageIndex += 0.2;
+ if (b->imageIndex >= 2) {
+ b->imageIndex -= 2;
+ }
+ }
+ }
+
+ //Collide with hero
+ {
+ if (checkCollision(mask, getHeroMask())) {
+ heroHit(30, mask.x + (mask.w / 2));
+ }
+ }
+
+ //Weapon collision
+ {
+ int i;
+ for (i = 0; i < MAX_WEAPONS; i++) {
+ if (weapons[i] != NULL) {
+ if (weapons[i]->cooldown == 0) {
+ if (checkCollision(mask, weapons[i]->weaponMask)) {
+ weaponHit(weapons[i]);
+ b->hp -= 1;
+ b->blink = 15;
+
+ //Death
+ if (b->hp <= 0) {
+ createEffect(2, b->x - 12, b->y - 12);
+ spawnCollectable(b->x + 20, b->y);
+ enemyDestroy(b->id);
+ }
+
+ i = MAX_WEAPONS;
+ }
+ }
+ }
+ }
+ }
+}
+
+void boarDraw(Boar* b)
+{
+ if (b->blink % 2 == 0)
+ {
+ int cropx = 0, cropy = 360;
+ int drawx = b->x, drawy = b->y;
+
+ //Dance
+ if (b->state == 0) {
+ int animation[8] = {0, 1, 2, 1, 0, 3, 4, 3};
+ cropx = 160 + (animation[(int)b->imageIndex] * 40);
+ }
+ //Charge
+ else{
+ cropx = (int)b->imageIndex * 40;
+
+ if (b->dir == -1) {
+ cropx += 80;
+ }
+ }
+
+ PHL_DrawSurfacePart(drawx, drawy, cropx, cropy, 40, 40, images[imgEnemies]);
+ }
+} \ No newline at end of file