aboutsummaryrefslogtreecommitdiff
path: root/src/enemies/dog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/enemies/dog.c')
-rw-r--r--src/enemies/dog.c294
1 files changed, 294 insertions, 0 deletions
diff --git a/src/enemies/dog.c b/src/enemies/dog.c
new file mode 100644
index 0000000..6d0783a
--- /dev/null
+++ b/src/enemies/dog.c
@@ -0,0 +1,294 @@
+#include "dog.h"
+#include "../game.h"
+#include "../hero.h"
+#include <stdlib.h>
+
+void dogStep(Dog* d);
+void dogDraw(Dog* d);
+
+int hitWall(Dog* d, Mask mask);
+
+void createDog(int x, int y)
+{
+ int i;
+ for (i = 0; i < MAX_ENEMIES; i++) {
+ if (enemies[i] == NULL) {
+ Enemy* e = malloc(sizeof *e);
+ Dog* d = malloc(sizeof *d);
+ d->id = i;
+ d->hp = 3;
+ d->blink = 0;
+
+ d->x = x;
+ d->y = y;
+
+ d->hsp = 0;
+ d->vsp = 0;
+
+ d->imageIndex = 0;
+
+ d->dir = 1;
+ if (herox < d->x) {
+ d->dir = -1;
+ }
+
+ d->state = 0;
+ d->timer = 0;
+ d->counter = 0;
+
+ e->data = d;
+ e->enemyStep = dogStep;
+ e->enemyDraw = dogDraw;
+ e->type = 30;
+
+ enemies[i] = e;
+ i = MAX_ENEMIES;
+ }
+ }
+}
+
+void dogStep(Dog* d)
+{
+ double grav = 0.175;
+
+ char onground = 0;
+ char wallhit = 0;
+
+ //Setup Mask
+ Mask mask;
+ {
+ mask.circle = mask.unused = 0;
+ mask.w = 32;
+ mask.h = 32;
+ mask.x = d->x + ((40 - mask.w) / 2);
+ mask.y = d->y + (40 - mask.h);
+ }
+
+ //Blink animation
+ {
+ if (d->blink > 0) {
+ d->blink -= 1;
+ }
+ }
+
+ //Horizontal movement
+ {
+ d->x += d->hsp;
+ mask.x = d->x + ((40 - mask.w) / 2);
+
+ //Wall collision
+ if (hitWall(d, mask) == 1) {
+ wallhit = 1;
+ mask.x = d->x + ((40 - mask.w) / 2);
+ }
+ }
+
+ //Vertical Movement
+ {
+ d->vsp += grav;
+ d->y += d->vsp;
+ mask.y = d->y + (40 - mask.h);
+
+ PHL_Rect collide = getTileCollision(1, mask);
+ if (collide.x == -1) {
+ collide = getTileCollision(3, mask);
+ }
+ if (collide.x != -1) {
+ //Floor
+ if (d->vsp >= 0) {
+ onground = 1;
+ d->vsp = 0;
+ d->y = collide.y - 40;
+ }
+ //Ceiling
+ if (d->vsp < 0) {
+ d->y = collide.y + 40 - (40 - mask.h);
+ }
+ mask.y = d->y + (40 - mask.h);
+ }
+ }
+
+ //Wait
+ if (d->state == 0)
+ {
+ double fric = 0.1;
+
+ //Animate
+ {
+ d->imageIndex += 0.1;
+ if (d->imageIndex >= 2) {
+ d->imageIndex -= 2;
+ }
+ }
+
+ //Collide with wall
+ {
+ if (wallhit == 1 && onground == 1) {
+ d->hsp *= -1;
+ }
+ }
+
+ //Slide to hault
+ if (d->hsp > 0) {
+ d->dir = 1;
+
+ d->hsp -= fric;
+ if (d->hsp <= 0) {
+ d->hsp = 0;
+ }
+ }
+ if (d->hsp < 0) {
+ d->dir = -1;
+
+ d->hsp += fric;
+ if (d->hsp >= 0) {
+ d->hsp = 0;
+ }
+ }
+
+ //Player is close
+ {
+ if (d->hsp == 0) {
+ Mask area;
+ area.unused = area.circle = 0;
+ area.w = 220;
+ area.h = 60;
+ area.x = d->x - 90;
+ area.y = d->y - 20;
+
+ if (checkCollision(area, getHeroMask()) == 1) {
+ d->state = 1;
+ d->counter = 0;
+ d->vsp = 1;
+ }
+ }
+ }
+
+ }
+
+ //Hopping
+ else if (d->state == 1)
+ {
+ int spd = 2;
+
+ d->hsp = spd * d->dir;
+
+ //Land on floor
+ {
+ if (onground == 1) {
+
+ //Landed
+ d->counter += 1;
+ d->vsp = -1.5;
+ if (d->counter == 3) {
+ d->vsp = -4;
+ }
+ if (d->counter == 4) {
+ d->state = 0;
+ d->counter = 0;
+ d->vsp = 0;
+ d->hsp = spd * d->dir;
+ }else{
+ PHL_PlaySound(sounds[sndPi05], CHN_ENEMIES);
+ d->dir = 1;
+ if (herox < d->x + 20) {
+ d->dir = -1;
+ }
+ }
+ }
+ }
+
+ //Animate
+ {
+ d->imageIndex = 1;
+ if (d->vsp < 0) {
+ d->imageIndex = 2;
+ }
+ }
+
+ }
+
+ //Update mask to be safe
+ mask.x = d->x + ((40 - mask.w) / 2);
+ mask.y = d->y + (40 - mask.h);
+
+ //Hit Player
+ {
+ if (checkCollision(mask, getHeroMask())) {
+ if (heroHit(10, mask.x + (mask.w / 2)) == 1) {
+ heroStun();
+ }
+ }
+ }
+
+ //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]);
+ //Hit
+ d->blink = 15;
+ d->hp -= 1;
+
+ //Death
+ if (d->hp <= 0) {
+ createEffect(2, d->x - 12, d->y - 6);
+ spawnCollectable(d->x + 20, d->y);
+ enemyDestroy(d->id);
+ }
+
+ i = MAX_WEAPONS;
+ }
+ }
+ }
+ }
+ }
+
+}
+
+void dogDraw(Dog* d)
+{
+ if (d->blink % 2 == 0) {
+ int cropX = 240 + ((int)d->imageIndex * 40);
+
+ if (d->dir == -1) {
+ cropX += 120;
+ }
+
+ PHL_DrawSurfacePart(d->x, d->y, cropX, 40, 40, 40, images[imgEnemies]);
+ }
+}
+
+int hitWall(Dog* d, Mask mask)
+{
+ PHL_Rect collide = getTileCollision(1, mask);
+
+ if (collide.x == -1) {
+ collide = getTileCollision(3, mask);
+ }
+
+ if (collide.x != -1) {
+ int dir = 1;
+ if (d->hsp < 0) {
+ dir = -1;
+ }
+ d->x = collide.x + 20 - ((20 + (mask.w / 2)) * dir) - 20;
+
+ return 1;
+ }else{
+ if (d->x < -20) {
+ d->x = -20;
+ return 1;
+ }
+
+ if (d->x > 620) {
+ d->x = 620;
+ return 1;
+ }
+ }
+
+ return 0;
+} \ No newline at end of file