#include "bee.h" #include "../enemy.h" #include "../game.h" #include "../hero.h" #include #include void beeStep(Bee* b); void beeDraw(Bee* b); void createBee(int x, int y, int dir) { int i; for (i = 0; i < MAX_ENEMIES; i++) { if (enemies[i] == NULL) { Enemy* e = /*(Enemy*)*/malloc(sizeof *e); Bee* b = /*(Bee*)*/malloc(sizeof *b); b->id = i; b->x = x; b->y = y; b->xstart = b->x; b->ystart = b->y; b->hsp = 0; b->vsp = 0; b->timer = 0; b->imageIndex = 0; b->dir = 1; b->state = 0; b->hoverdir = 180; if (dir == 1) { b->hoverdir = 0; b->dir = -1; } e->data = b; e->enemyStep = beeStep; e->enemyDraw = beeDraw; e->type = 24; enemies[i] = e; i = MAX_ENEMIES; } } } void beeStep(Bee* b) { //Animate { b->imageIndex += 0.33; if (b->imageIndex >= 3) { b->imageIndex -= 3; } } //Mindless hovering if (b->state == 0) { b->hoverdir += 2.6; if (b->hoverdir >= 360) { b->hoverdir -= 360; } b->dir = 1; if (b->hoverdir <= 180) { b->dir = -1; } b->x = b->xstart + (20 * cos(b->hoverdir * 3.14159 /180)); //If player is within range Mask area; area.unused = area.circle = 0; area.x = b->x - 80; area.y = b->y; area.w = 200; area.h = 100; if (checkCollision(area, getHeroMask())) { b->state = 1; b->dir = 1; if (b->x + 20 > herox) { b->dir = -1; } b->hsp = -5.5 * b->dir; PHL_PlaySound(sounds[sndBee01], CHN_ENEMIES); } } //Fly backwards else if (b->state == 1) { b->hsp += 0.25 * b->dir; if ((b->dir == 1 && b->hsp >= 0) || (b->dir == -1 && b->hsp <= 0)) { b->hsp = 0; b->state = 2; b->vsp = 3.75; } } //Fly downwards else if (b->state == 2) { b->vsp -= 0.1; if (b->vsp <= 0) { b->state = 3; b->vsp = 0; b->dir = 1; if (b->x + 20 > herox) { b->dir = -1; } b->hsp = 3 * b->dir; } } //Fly diaganal else if (b->state == 3) { b->vsp -= 0.1; if (b->vsp < -3) { b->vsp = -3; } if (b->y <= b->ystart) { b->state = 4; b->vsp = 0; b->y = b->ystart; if (b->x < b->xstart) { b->dir = 1; }else{ b->dir = -1; } b->hsp = b->dir; } } //Fly back to start else if (b->state == 4) { if ((b->dir == 1 && b->x >= b->xstart) || (b->dir == -1 && b->x <= b->xstart)) { b->state = 0; b->hsp = 0; b->hoverdir = 0; } } //Movement { b->x += b->hsp; b->y += b->vsp; } //Setup Mask Mask mask; { mask.circle = mask.unused = 0; mask.w = 24; mask.h = 32; mask.y = b->y + 6; mask.x = b->x + 14; if (b->dir == -1) { mask.x = b->x + 2; } } //Hit Player { 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 (checkCollision(mask, weapons[i]->weaponMask)) { weaponHit(weapons[i]); createEffect(2, b->x - 12, b->y - 6); spawnCollectable(b->x + 20, b->y); enemyDestroy(b->id); i = MAX_WEAPONS; } } } } } void beeDraw(Bee* b) { int cropx = 280; if (b->dir == -1) { cropx += 120; } cropx += (int)b->imageIndex * 40; PHL_DrawSurfacePart(b->x, b->y, cropx, 480, 40, 40, images[imgEnemies]); }