diff options
Diffstat (limited to 'src/enemies/skull.c')
-rw-r--r-- | src/enemies/skull.c | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/src/enemies/skull.c b/src/enemies/skull.c new file mode 100644 index 0000000..7ee5836 --- /dev/null +++ b/src/enemies/skull.c @@ -0,0 +1,174 @@ +#include "skull.h" +#include "../enemy.h" +#include "../PHL.h" +#include "../game.h" +#include "../hero.h" +#include <stdlib.h> +#include <math.h> + +void skullStep(Skull* s); +void skullDraw(Skull* s); + +void createSkull(int x, int y) +{ + int i; + for (i = 0; i < MAX_ENEMIES; i++) { + if (enemies[i] == NULL) { + Enemy* e = malloc(sizeof *e); + Skull* s = malloc(sizeof *s); + s->id = i; + + //X/Y in center of sprite + s->x = x + 20; + s->y = y + 20; + s->yoffset = 0; + + s->rot = 0; + s->state = 0; + s->timer = 0; + s->imageIndex = 0; + s->dir = 0; + + e->data = s; + e->enemyStep = skullStep; + e->enemyDraw = skullDraw; + e->type = 12; + + enemies[i] = e; + i = MAX_ENEMIES; + } + } +} + +void skullStep(Skull* s) +{ + double imageSpeed = 0; + + //Wait + if (s->state == 0) + { + imageSpeed = 0.2; + + if (s->timer > 0) { + s->timer -= 1; + }else{ + Mask tempmask; + + tempmask.unused = tempmask.circle = 0; + tempmask.x = s->x - 100; + tempmask.y = s->y - 100; + tempmask.w = tempmask.h = 200; + + if (checkCollisionXY(tempmask, herox, heroy + 20)) { + + //Calculate distance + //int dis = sqrt(pow(s->x - herox, 2) + pow(s->y - (heroy + 20), 2)); + //if (dis <= 100) { + s->state = 1; + //s->dir = (rand() % 8) * 45; + s->dir = (rand() % 360) + 1; + PHL_PlaySound(sounds[sndPi08], CHN_ENEMIES); + s->timer = 130; + } + } + } + + //Chase + else if (s->state == 1) + { + imageSpeed = 0.3; + + int spd = 2; + s->x += (spd * cos(s->dir * 3.14159 / 180)); + s->y += (spd * sin(s->dir * 3.14159 / 180)); + + double herodir = ((atan2((heroy + 20) - s->y, herox - s->x) * 180) / 3.14159); + if (herodir >= 360) { + herodir -= 360; + } + if (herodir < 0) { + herodir += 360; + } + + double tempdir = s->dir - herodir; + if (tempdir < 0) { + tempdir += 360; + } + + if (tempdir < 180) { + s->dir -= 2; + }else{ + s->dir += 2; + } + if (s->dir >= 360) { + s->dir -= 360; + } + if (s->dir < 0) { + s->dir += 360; + } + + s->timer -= 1; + if (s->timer <= 0) { + s->state = 0; + s->timer = 10; + } + } + + //Animate + { + s->imageIndex += imageSpeed; + if (s->imageIndex >= 4) { + s->imageIndex -= 4; + } + } + + //Hover offset + { + s->rot += 5; + if (s->rot >= 360) { + s->rot -= 360; + } + s->yoffset = (5 * sin(s->rot * 3.14159 / 180)); + } + + //Setup Mask + Mask mask; + { + mask.unused = 0; + mask.circle = 1; + mask.x = s->x; + mask.y = s->y; + mask.w = mask.h = 10; + } + + //Hero collision + { + if (checkCollision(mask, getHeroMask())) { + heroHit(15, mask.x); + } + } + + //Weapon collision + { + int i; + for (i = 0; i < MAX_WEAPONS; i++) { + if (weapons[i] != NULL) { + if (checkCollision(mask, weapons[i]->weaponMask)) { + weaponHit(weapons[i]); + + createEffect(2, s->x - 32, s->y - 32); + spawnCollectable(s->x, s->y - 20); + enemyDestroy(s->id); + + i = MAX_WEAPONS; + } + } + } + } + +} + +void skullDraw(Skull* s) +{ + PHL_DrawSurfacePart(s->x - 20, s->y + s->yoffset - 20, 480 + ((int)s->imageIndex * 40), 40, 40, 40, images[imgEnemies]); +}
\ No newline at end of file |