aboutsummaryrefslogtreecommitdiff
path: root/src/enemies/boomknight.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/enemies/boomknight.c')
-rw-r--r--src/enemies/boomknight.c285
1 files changed, 285 insertions, 0 deletions
diff --git a/src/enemies/boomknight.c b/src/enemies/boomknight.c
new file mode 100644
index 0000000..3fc3e83
--- /dev/null
+++ b/src/enemies/boomknight.c
@@ -0,0 +1,285 @@
+#include "boomknight.h"
+#include "../game.h"
+#include "../hero.h"
+#include <stdlib.h>
+
+void boomknightStep(Boomknight* b);
+void boomknightDraw(Boomknight* b);
+
+void boomStep(Boom* b);
+void boomDraw(Boom* b);
+
+void createBoomknight(int x, int y)
+{
+ int i;
+ for (i = 0; i < MAX_ENEMIES; i++) {
+ if (enemies[i] == NULL) {
+ Enemy* e = malloc(sizeof *e);
+ Boomknight* b = malloc(sizeof *b);
+ b->id = i;
+
+ b->hp = 2;
+ b->blink = 0;
+
+ b->x = x;
+ b->y = y;
+
+ b->dir = 1;
+ if (herox < b->x + 20) {
+ b->dir = -1;
+ }
+
+ b->imageIndex = 0;
+
+ b->state = 0;
+ b->timer = 0;
+
+ e->data = b;
+ e->enemyStep = boomknightStep;
+ e->enemyDraw = boomknightDraw;
+ e->type = 31;
+
+ enemies[i] = e;
+ i = MAX_ENEMIES;
+ }
+ }
+}
+
+void boomknightStep(Boomknight* b)
+{
+ //Animate
+ {
+ b->imageIndex += 0.1;
+ if (b->imageIndex >= 2) {
+ b->imageIndex -= 2;
+ }
+
+ if (b->blink > 0) {
+ b->blink -= 1;
+ }
+ }
+
+ //Setup Mask
+ Mask mask;
+ {
+ mask.circle = mask.unused = 0;
+ mask.w = 30;
+ mask.h = 32;
+ mask.x = b->x + ((40 - mask.w) / 2);
+ mask.y = b->y + (40 - mask.h);
+ }
+
+ //Walk
+ if (b->state == 0) {
+ //Movement
+ {
+ double hsp = 0.5;
+ b->x += hsp * b->dir;
+ mask.x = b->x + ((40 - mask.w) / 2);
+ }
+
+ //Hit wall
+ {
+ if (checkTileCollision(1, mask) == 1) {
+ b->dir *= -1;
+ }
+ }
+
+ //On edge
+ {
+ mask.x += mask.w * b->dir;
+ mask.y += 20;
+
+ PHL_Rect collide = getTileCollision(1, mask);
+ if (collide.x == -1) {
+ collide = getTileCollision(3, mask);
+ }
+
+ if (collide.x == -1) {
+ b->dir *= -1;
+ }
+ }
+
+ //Player is close
+ {
+ if (b->timer <= 0) {
+ Mask area;
+ {
+ area.circle = area.unused = 0;
+ area.w = 120;
+ area.h = 40;
+ area.x = b->x + 20;
+ if (b->dir == -1) {
+ area.x -= area.w;
+ }
+ area.y = b->y;
+ }
+ if (checkCollision(area, getHeroMask()) == 1) {
+ b->state = 1;
+ b->timer = 0;
+ }
+
+ }else{
+ b->timer -= 1;
+ }
+ }
+
+ }
+
+ //Throw
+ else if (b->state == 1) {
+ //Animate
+ {
+ b->imageIndex = 0;
+ if (b->timer >= 15) {
+ b->imageIndex = 2;
+ }
+ }
+
+ b->timer += 1;
+ if (b->timer == 15) {
+ createBoom(b->x, b->y, b->dir);
+ PHL_PlaySound(sounds[sndPi05], CHN_ENEMIES);
+ }
+
+ if (b->timer >= 110) {
+ b->state = 0;
+ b->imageIndex = 0;
+ b->timer = 120;
+ }
+ }
+
+ //Update Mask
+ mask.x = b->x + ((40 - mask.w) / 2);
+ mask.y = b->y + (40 - mask.h);
+
+ //Hero Collision
+ {
+ if (checkCollision(mask, getHeroMask()) == 1) {
+ heroHit(15, 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 - 6);
+ spawnCollectable(b->x + 20, b->y);
+ enemyDestroy(b->id);
+ }
+
+ i = MAX_WEAPONS;
+ }
+ }
+ }
+ }
+ }
+
+}
+
+void boomknightDraw(Boomknight* b)
+{
+ if (b->blink % 2 == 0) {
+ int cropX = 400 + ((int)b->imageIndex * 40);
+
+ if (b->dir == -1) {
+ cropX += 120;
+ }
+
+ PHL_DrawSurfacePart(b->x, b->y, cropX, 400, 40, 40, images[imgEnemies]);
+ }
+}
+
+
+//Enemy boomerang
+void createBoom(int x, int y, int dir)
+{
+ int i;
+ for (i = 0; i < MAX_ENEMIES; i++) {
+ if (enemies[i] == NULL) {
+ Enemy* e = malloc(sizeof *e);
+ Boom* b = malloc(sizeof *b);
+ b->id = i;
+
+ b->dir = dir;
+ b->x = x;
+ b->y = y;
+
+ b->hsp = 6 * b->dir;
+ b->imageIndex = 0;
+
+ b->timer = 90;
+
+ e->data = b;
+ e->enemyStep = boomStep;
+ e->enemyDraw = boomDraw;
+ e->type = -1;
+
+ enemies[i] = e;
+ i = MAX_ENEMIES;
+ }
+ }
+}
+
+void boomStep(Boom* b)
+{
+ //Animate
+ {
+ b->imageIndex += 0.33;
+ if (b->imageIndex >= 8) {
+ b->imageIndex -= 8;
+ }
+ }
+
+ //Movement
+ {
+ b->x += b->hsp;
+
+ double fric = 0.125;
+ b->hsp -= fric * b->dir;
+ }
+
+ //Hero collision
+ {
+ Mask mask;
+ {
+ mask.circle = mask.unused = 0;
+ mask.w = 24;
+ mask.h = 24;
+ mask.x = b->x + ((40 - mask.w) / 2);
+ mask.y = b->y + ((40 - mask.h) / 2);
+ }
+
+ if (checkCollision(mask, getHeroMask()) == 1) {
+ heroHit(10, mask.x + (mask.w / 2));
+ }
+ }
+
+ b->timer -= 1;
+ if (b->timer <= 0) {
+ createEffectExtra(5, b->x + 20, b->y + 20, 0, 0, 0);
+ enemyDestroy(b->id);
+ }
+}
+
+void boomDraw(Boom* b)
+{
+ int cropX = (int)b->imageIndex * 40;
+
+ if (b->dir == -1) {
+ cropX += 320;
+ }
+
+ PHL_DrawSurfacePart(b->x, b->y, cropX, 360, 40, 40, images[imgMisc20]);
+} \ No newline at end of file