aboutsummaryrefslogtreecommitdiff
path: root/src/enemies/ghoul.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/enemies/ghoul.c')
-rw-r--r--src/enemies/ghoul.c218
1 files changed, 218 insertions, 0 deletions
diff --git a/src/enemies/ghoul.c b/src/enemies/ghoul.c
new file mode 100644
index 0000000..fca1fbd
--- /dev/null
+++ b/src/enemies/ghoul.c
@@ -0,0 +1,218 @@
+#include "ghoul.h"
+#include "../game.h"
+#include "../enemy.h"
+#include "../PHL.h"
+#include "../hero.h"
+#include <stdlib.h>
+
+void ghoulStep(Ghoul* g);
+void ghoulDraw(Ghoul* g);
+
+void createGhoul(int x, int y, int type)
+{
+ int i;
+ for (i = 0; i < MAX_ENEMIES; i++) {
+ if (enemies[i] == NULL) {
+ Enemy* e = malloc(sizeof *e);
+ Ghoul* g = malloc(sizeof *g);
+ g->id = i;
+ g->hp = 2;
+
+ g->x = x;
+ g->y = y;
+
+ g->vsp = 0;
+ g->grav = 0.1;
+
+ g->dir = 0;
+ g->type = type;
+ g->onground = 0;
+
+ g->timer = 0;
+ g->state = 0;
+ g->invincible = 0;
+
+ g->imageIndex = 0;
+
+ g->mask.circle = 0;
+ g->mask.unused = 1;
+ g->mask.w = 24;
+ g->mask.h = 32;
+ g->mask.x = g->x + ((40 - g->mask.w) / 2);
+ g->mask.y = g->y + (40 - g->mask.h);
+
+ e->data = g;
+ e->enemyStep = ghoulStep;
+ e->enemyDraw = ghoulDraw;
+ e->type = 18;
+
+ enemies[i] = e;
+ i = MAX_ENEMIES;
+ }
+ }
+
+}
+
+void ghoulStep(Ghoul* g)
+{
+ if (g->invincible > 0) {
+ g->invincible -= 1;
+ }
+
+ if (g->state == 0) { //Wait
+ Mask area;
+ area.unused = area.circle = 0;
+ area.w = 280;
+ area.h = 80;
+ area.x = g->x - 120;
+ area.y = g->y - 20;
+
+ if (checkCollisionXY(area, herox, heroy + 20) == 1) {
+ g->state = 1;
+ g->mask.unused = 0;
+ g->imageIndex = 0;
+
+ g->dir = 1;
+ if (herox < g->x + 20) {
+ g->dir = -1;
+ }
+ }
+ }
+ else if (g->state == 1) { //Pop-up
+ g->imageIndex += 0.16;
+
+ if (g->imageIndex >= 4) {
+ g->state = 2;
+ g->vsp = -1;
+ g->imageIndex = 0;
+ PHL_PlaySound(sounds[sndPi05],CHN_ENEMIES);
+ }
+ }
+ else if (g->state == 2) { //Walking
+ g->mask.unused = 0;
+ if (g->onground == 0) {
+ //Vertical movement
+ g->y += g->vsp;
+ g->vsp += g->grav;
+
+ g->mask.y = g->y + (40 - g->mask.h);
+
+ PHL_Rect collide = getTileCollision(1, g->mask);
+ if (collide.x == -1) {
+ collide = getTileCollision(3, g->mask);
+ }
+ if (collide.x != -1) {
+ g->onground = 1;
+ g->vsp = 0;
+ g->y = collide.y - 40;
+ g->mask.y = g->y + (40 - g->mask.h);
+ }
+ }
+
+ g->imageIndex += 0.1;
+ if (g->imageIndex >= 2) {
+ g->imageIndex -= 2;
+ }
+
+ double hsp = 1;
+
+ if ((int)g->imageIndex == 0) {
+ hsp = 0.5;
+ }
+
+ //Purple
+ if (g->type == 1) {
+ hsp *= 2;
+ }
+
+ g->x += hsp * g->dir;
+ g->mask.x = g->x + ((40 - g->mask.w) / 2);
+
+ if (g->onground == 1) {
+ if ((g->x < -20 || g->x > 660) || checkTileCollision(1, g->mask) == 1) {
+ g->dir *= -1;
+
+ PHL_Rect collide = getTileCollision(1, g->mask);
+ if (collide.x != -1) {
+ g->x = collide.x + (40 * g->dir);
+ }
+ }
+ else {
+ //check on ledge
+ g->mask.w = 5;
+ if (g->dir == 1) {
+ g->mask.x = g->x + 30;
+ }
+ if (g->dir == -1) {
+ g->mask.x = g->x + 5;
+ }
+ g->mask.y += 20;
+
+ if (checkTileCollision(1, g->mask) == 0 && checkTileCollision(3, g->mask) == 0) {
+ g->dir *= -1;
+ }
+ g->mask.w = 24;
+ g->mask.x = g->x + ((40 - g->mask.w) / 2);
+ g->mask.y = g->y + (40 - g->mask.h);
+ }
+ }
+ }
+
+ g->mask.x = g->x + ((40 - g->mask.w) / 2);
+ g->mask.y = g->y + (40 - g->mask.h);
+
+ //Hit Player
+ {
+ if (checkCollision(g->mask, getHeroMask())) {
+ if (heroHit(10, g->x + 20) == 1 && g->type == 1) {
+ heroPoison();
+ }
+ }
+ }
+
+ //Weapon Collision
+ {
+ int i;
+ for (i = 0; i < MAX_WEAPONS; i++) {
+ if (weapons[i] != NULL) {
+ if (weapons[i]->cooldown == 0) {
+ if (checkCollision(g->mask, weapons[i]->weaponMask)) {
+ weaponHit(weapons[i]);
+
+ g->hp -= 1;
+ g->invincible = 15;
+ //Death
+ if (g->hp <= 0) {
+ createEffect(2, g->x - 12, g->y - 6);
+ spawnCollectable(g->x + 20, g->y);
+ enemyDestroy(g->id);
+ }
+ i = MAX_WEAPONS;
+ }
+ }
+ }
+ }
+ }
+
+}
+
+void ghoulDraw(Ghoul* g)
+{
+ if (g->state != 0 && g->invincible % 2 == 0) {
+ int cx = (int)g->imageIndex * 40,
+ cy = 160;
+
+ if (g->state == 1) {
+ cx += 160;
+ }else{
+ if (g->dir == -1) {
+ cx += 80;
+ }
+ }
+
+ //Purple palette
+ cy += 160 * g->type;
+
+ PHL_DrawSurfacePart(g->x, g->y, cx, cy, 40, 40, images[imgEnemies]);
+ }
+} \ No newline at end of file