aboutsummaryrefslogtreecommitdiff
path: root/src/enemies/wizard.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/enemies/wizard.c')
-rw-r--r--src/enemies/wizard.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/enemies/wizard.c b/src/enemies/wizard.c
new file mode 100644
index 0000000..b496a45
--- /dev/null
+++ b/src/enemies/wizard.c
@@ -0,0 +1,133 @@
+#include "wizard.h"
+#include "../enemy.h"
+#include "../game.h"
+#include "../hero.h"
+#include <stdlib.h>
+
+void createWizard(int x, int y)
+{
+ int i;
+ for (i = 0; i < MAX_ENEMIES; i++) {
+ if (enemies[i] == NULL) {
+ Enemy* e = malloc(sizeof *e);
+ Wizard* w = malloc(sizeof *w);
+ w->id = i;
+
+ w->x = x;
+ w->y = y;
+
+ w->imageIndex = 0;
+
+ w->state = 0;
+ w->timer = 50;
+ w->visible = 1;
+
+ w->mask.circle = w->mask.unused = 0;
+ w->mask.w = 24;
+ w->mask.h = 38;
+ w->mask.x = w->x + 8;
+ w->mask.y = w->y + 2;
+
+ e->data = w;
+ e->enemyStep = wizardStep;
+ e->enemyDraw = wizardDraw;
+ e->type = 21;
+
+ enemies[i] = e;
+ i = MAX_ENEMIES;
+ }
+ }
+}
+
+void wizardStep(Wizard* w)
+{
+ w->imageIndex += 0.3;
+ if (w->imageIndex >= 3) {
+ w->imageIndex -= 3;
+ }
+
+ //Stand still
+ if (w->state == 0) {
+ w->timer -= 1;
+
+ if (w->timer <= 0) {
+ PHL_PlaySound(sounds[sndPi10], CHN_ENEMIES);
+ w->state = 1;
+ w->timer = 15;
+ }
+ }
+ //Flash
+ else if (w->state == 1 || w->state == 3) {
+ if (w->visible == 0) {
+ w->visible = 1;
+ }else{
+ w->visible = 0;
+ }
+
+ w->timer -= 1;
+ if (w->timer <= 0) {
+ if (w->state == 1) {
+ w->state = 2;
+ w->timer = 60;
+ }
+ else if (w->state == 3) {
+ w->visible = 1;
+ w->state = 0;
+ w->timer = 50;
+ }
+ }
+ }
+ //Invisible
+ else if (w->state == 2) {
+ w->visible = 0;
+
+ w->timer -= 1;
+ if (w->timer <= 0) {
+ PHL_PlaySound(sounds[sndPi03], CHN_ENEMIES);
+ w->state = 3;
+ w->timer = 15;
+
+ //Horizontal Jump
+ int gridX = w->x / 40,
+ gridY = w->y / 40,
+ lastGridX = gridX;
+
+ do {
+ gridX = (rand() % 16) + 1;
+ } while (collisionTiles[gridX][gridY] != 0 ||
+ collisionTiles[gridX][gridY+1] != 1 ||
+ gridX == lastGridX);
+
+ w->x = gridX * 40;
+ w->mask.x = w->x + 8;
+ }
+ }
+
+ if (w->state == 0 || w->state == 3) {
+ //Hit Player
+ if (checkCollision(w->mask, getHeroMask())) {
+ heroHit(15, w->x + 20);
+ }
+
+ //Weapon Collision
+ int i;
+ for (i = 0; i < MAX_WEAPONS; i++) {
+ if (weapons[i] != NULL) {
+ if (checkCollision(w->mask, weapons[i]->weaponMask)) {
+ weaponHit(weapons[i]);
+ createEffect(2, w->x - 12, w->y - 6);
+ spawnCollectable(w->x + 20, w->y);
+ enemyDestroy(w->id);
+ i = MAX_WEAPONS;
+ }
+ }
+ }
+ }
+}
+
+void wizardDraw(Wizard* w)
+{
+ if (w->visible == 1) {
+ PHL_DrawSurfacePart(w->x, w->y, 520 + (((int)w->imageIndex) * 40), 480, 40, 40, images[imgEnemies]);
+ }
+} \ No newline at end of file