diff options
Diffstat (limited to 'src/enemies/podoboo.c')
-rw-r--r-- | src/enemies/podoboo.c | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/src/enemies/podoboo.c b/src/enemies/podoboo.c new file mode 100644 index 0000000..1dfc30b --- /dev/null +++ b/src/enemies/podoboo.c @@ -0,0 +1,176 @@ +#include "podoboo.h" +#include "../PHL.h" +#include "../hero.h" +#include "../game.h" +#include "../effect.h" +#include <stdlib.h> +#include <math.h> + +void podobooStep(Podoboo* p); +void podobooDraw(Podoboo* p); + +void createPodoboo(int x, int y, int offset, int height) +{ + int i; + for (i = 0; i < MAX_ENEMIES; i++) { + if (enemies[i] == NULL) { + Enemy* e = malloc(sizeof *e); + Podoboo* p = malloc(sizeof *p); + + p->id = i; + + p->x = x; + p->y = p->ystart = y; + + p->hp = 2; + p->blink = 0; + + p->yoffset = p->rot = 0; + + p->vsp = 0; + p->grav = 0.13; + + p->jumpheight = -5; + /* + if (height == 1) { + p->jumpheight = -5.4; + } + */ + if (height == 1) { + p->jumpheight = -7; + } + + p->imageIndex = 0; + + p->timer = 30 * offset; + p->state = 0; + + e->data = p; + e->enemyStep = podobooStep; + e->enemyDraw = podobooDraw; + e->type = 15; + + enemies[i] = e; + i = MAX_ENEMIES; + } + } +} + +void podobooStep(Podoboo* p) +{ + //Blinking + { + if (p->blink > 0) { + p->blink -= 1; + } + } + + p->timer -= 1; + + //Patterns + { + //Float in lava + if (p->state == 0) + { + //Animate + p->imageIndex += 0.1; + if (p->imageIndex >= 2) { + p->imageIndex -= 2; + } + + //Bob movement + p->rot += 5; + if (p->rot >= 360) { + p->rot -= 360; + } + p->y = p->ystart + (5 * sin(p->rot * 3.14159 / 180)); + + //Jump + if (p->timer <= 0) { + p->state = 1; + createLavaSplash(p->x + 20, p->y); + + p->y = p->ystart; + p->vsp = p->jumpheight; + } + } + //In air + else if (p->state == 1) + { + //Animate + p->imageIndex += 0.25; + if (p->imageIndex >= 3) { + p->imageIndex -= 3; + } + + //Movement + p->y += p->vsp; + p->vsp += p->grav; + + //Land in lava again + if (p->vsp > 0 && p->y >= p->ystart) { + createLavaSplash(p->x + 20, p->y); + p->y = p->ystart; + p->state = 0; + p->vsp = 0; + p->timer = 60; + } + } + + } + + //Create Mask + Mask mask; + { + mask.unused = mask.circle = 0; + mask.w = mask.h = 30; + mask.x = p->x + 5; + mask.y = p->y + 5; + } + + //Collide with hero + { + if (checkCollision(mask, getHeroMask())) { + 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]); + p->hp -= 1; + p->blink = 15; + + //Death + if (p->hp <= 0) { + createEffect(2, p->x - 12, p->y - 12); + spawnCollectable(p->x + 20, p->y); + enemyDestroy(p->id); + } + + i = MAX_WEAPONS; + } + } + } + } + } + +} + +void podobooDraw(Podoboo* p) +{ + if (p->blink % 2 == 0) { + int thisImage = p->imageIndex; + + if (p->state == 1) { + thisImage += 2; + } + + PHL_DrawSurfacePart(p->x, p->y, 280 + (40 * thisImage), 520, 40, 40, images[imgEnemies]); + } +}
\ No newline at end of file |