aboutsummaryrefslogtreecommitdiff
path: root/src/enemies/firewheel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/enemies/firewheel.c')
-rw-r--r--src/enemies/firewheel.c272
1 files changed, 272 insertions, 0 deletions
diff --git a/src/enemies/firewheel.c b/src/enemies/firewheel.c
new file mode 100644
index 0000000..7368761
--- /dev/null
+++ b/src/enemies/firewheel.c
@@ -0,0 +1,272 @@
+#include "firewheel.h"
+#include "../game.h"
+#include "../PHL.h"
+#include "../hero.h"
+#include <stdlib.h>
+
+void firewheelRotate(Firewheel* f, int clockwise);
+
+void firewheelStep(Firewheel* f);
+void firewheelDraw(Firewheel* f);
+
+void createFirewheel(int x, int y, int dir)
+{
+ int i;
+ for (i = 0; i < MAX_ENEMIES; i++) {
+ if (enemies[i] == NULL) {
+ Enemy* e = malloc(sizeof *e);
+ Firewheel* f = malloc(sizeof *f);
+
+ f->id = i;
+
+ f->x = x;
+ f->y = y;
+
+ f->imageIndex = 0;
+
+ f->hp = 2;
+ f->blink = 0;
+
+ f->hsp = 1;
+ f->vsp = 0;
+
+ f->wallx = 0;
+ f->wally = 1;
+
+ f->timer = 0;
+ if (x % 40 != 0) {
+ f->timer = 20;
+ }
+
+ //Start on ceiling
+ {
+ Mask mask;
+ mask.circle = mask.unused = 0;
+ mask.w = 40;
+ mask.h = 40;
+ mask.x = f->x;
+ mask.y = f->y + 10;
+
+ PHL_Rect collide = getTileCollision(1, mask);
+ if (collide.x == -1) {
+ collide = getTileCollision(3, mask);
+ }
+
+ if (collide.x == -1) {
+ f->wally = -1;
+ f->hsp *= -1;
+ }
+ }
+
+ f->dir = 1;
+ if (dir == 1) {
+ f->hsp *= -1;
+ f->dir = -1;
+ }
+
+ e->data = f;
+ e->enemyStep = firewheelStep;
+ e->enemyDraw = firewheelDraw;
+ e->type = 27;
+
+ enemies[i] = e;
+ i = MAX_ENEMIES;
+ }
+ }
+}
+
+void firewheelStep(Firewheel* f)
+{
+ //Animate
+ {
+ f->imageIndex += 0.33;
+ if (f->imageIndex >= 4) {
+ f->imageIndex -= 4;
+ }
+
+ if (f->blink > 0) {
+ f->blink -= 1;
+ }
+ }
+
+ //Movement
+ int spd = 2;
+ f->x += spd * f->hsp;
+ f->y += spd * f->vsp;
+
+ //Setup mask
+ Mask mask;
+ mask.circle = mask.unused = 0;
+ mask.w = 40;
+ mask.h = 40;
+ mask.x = f->x;
+ mask.y = f->y;
+
+ //Check if ready to change angle
+ if ( (f->hsp != 0 && (int)f->x % 20 == 0) || (f->vsp != 0 && (int)f->y % 20 == 0) )
+ {
+ int doCheck = 1;
+ while (doCheck == 1) {
+ doCheck = 0;
+
+ //Check on edge
+ mask.x += (f->wallx * 10);
+ mask.y += (f->wally * 10);
+
+ PHL_Rect collide = getTileCollision(1, mask);
+ if (collide.x == -1) {
+ collide = getTileCollision(3, mask);
+ }
+
+ //Outside of room
+ if (f->y <= -40) {
+ collide.x = 1;
+ }
+
+ //On edge
+ if (collide.x == -1) {
+ int tempHsp = f->hsp;
+ int tempVsp = f->vsp;
+ f->hsp = f->wallx;
+ f->vsp = f->wally;
+
+ f->wallx = -tempHsp;
+ f->wally = -tempVsp;
+ doCheck = 1;
+ }
+ //Hit wall
+ else {
+ mask.x = f->x;
+ mask.y = f->y;
+ mask.x += f->hsp * 10;
+ mask.y += f->vsp * 10;
+
+ collide = getTileCollision(1, mask);
+ if (collide.x == -1) {
+ collide = getTileCollision(3, mask);
+ }
+
+ //Outside of room
+ if (collide.x == -1) {
+ if (f->y <= -40 && f->vsp != 1) {
+ collide.x = 1;
+ }
+ }
+
+ //Did collide with wall
+ if (collide.x != -1) {
+ int tempWallx = f->wallx;
+ int tempWally = f->wally;
+ f->wallx = f->hsp;
+ f->wally = f->vsp;
+
+ f->hsp = -tempWallx;
+ f->vsp = -tempWally;
+
+ doCheck = 1;
+ }
+
+ }
+ }
+
+ /*
+ mask.x += f->hsp * 10;
+ mask.y += f->vsp * 10;
+
+ //Collide with wall
+ PHL_Rect collide = getTileCollision(1, mask);
+ if (collide.x == -1) {
+ collide = getTileCollision(3, mask);
+ }
+
+ //Outside of room
+ if (collide.x == -1) {
+ if (mask.y <= 0 && f->vsp < 0) {
+ collide.x = f->x;
+ collide.y = -40;
+ collide.w = 40;
+ collide.h = 40;
+ }
+ }
+
+ //Did collide with wall
+ if (collide.x != -1) {
+ int tempWallx = f->wallx;
+ int tempWally = f->wally;
+ f->wallx = f->hsp;
+ f->wally = f->vsp;
+
+ f->hsp = -tempWallx;
+ f->vsp = -tempWally;
+ }
+ //Edge rotate
+ else{
+ mask.x = f->x;
+ mask.y = f->y;
+ mask.x += (f->wallx * 10);
+ mask.y += (f->wally * 10);
+
+ collide = getTileCollision(1, mask);
+ if (collide.x == -1) {
+ collide = getTileCollision(3, mask);
+ }
+
+ if (collide.x == -1) {
+ int tempHsp = f->hsp;
+ int tempVsp = f->vsp;
+ f->hsp = f->wallx;
+ f->vsp = f->wally;
+
+ f->wallx = -tempHsp;
+ f->wally = -tempVsp;
+ }
+ }
+*/
+ }
+
+ //Update Mask
+ mask.w = 30;
+ mask.h = 30;
+ mask.x = f->x + 5;
+ mask.y = f->y + 5;
+
+ //Collide with hero
+ if (checkCollision(mask, getHeroMask())) {
+ heroHit(20, mask.x + (mask.w / 2));
+ }
+
+ //Weapon collision
+ for (int i = 0; i < MAX_WEAPONS; i++) {
+ if (weapons[i] != NULL) {
+ if (weapons[i]->cooldown == 0) {
+ if (checkCollision(mask, weapons[i]->weaponMask)) {
+ weaponHit(weapons[i]);
+ f->hp -= 1;
+ f->blink = 15;
+
+ //Death
+ if (f->hp <= 0) {
+ createEffect(2, f->x - 12, f->y - 12);
+ spawnCollectable(f->x + 20, f->y);
+ enemyDestroy(f->id);
+ }
+
+ i = MAX_WEAPONS;
+ }
+ }
+ }
+ }
+
+}
+
+void firewheelDraw(Firewheel* f)
+{
+ if (f->blink % 2 == 0) {
+ int cy = 80;
+ if (f->dir == -1) {
+ cy += 40;
+ }
+
+ PHL_DrawSurfacePart(f->x, f->y, 480 + ((int)f->imageIndex * 40), cy, 40, 40, images[imgEnemies]);
+ }
+} \ No newline at end of file