diff options
author | ptitSeb | 2017-11-30 22:49:38 +0100 |
---|---|---|
committer | ptitSeb | 2017-11-30 22:49:38 +0100 |
commit | de29b11a88dbdd3af0824e59b51528b91ee73c54 (patch) | |
tree | e1aabf8752043998663279fae4359a18c4b4af07 /src/enemies/slime.c | |
parent | d87f450f51372ddf013e6bac09f1ef588e6f8bea (diff) | |
download | hydracastlelabyrinth-de29b11a88dbdd3af0824e59b51528b91ee73c54.tar.gz hydracastlelabyrinth-de29b11a88dbdd3af0824e59b51528b91ee73c54.tar.bz2 hydracastlelabyrinth-de29b11a88dbdd3af0824e59b51528b91ee73c54.zip |
First commit. Version works on Linux (keyboard only, not configurable)
Diffstat (limited to 'src/enemies/slime.c')
-rw-r--r-- | src/enemies/slime.c | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/src/enemies/slime.c b/src/enemies/slime.c new file mode 100644 index 0000000..297b190 --- /dev/null +++ b/src/enemies/slime.c @@ -0,0 +1,228 @@ +#include "slime.h" +#include <stdlib.h> +#include "../PHL.h" +#include "../game.h" +#include "../collision.h" +#include "../hero.h" +#include "../enemy.h" +#include "../weapon.h" + +void slimeStep(Slime* s); +void slimeDraw(Slime* s); + +void createSlime(int x, int y, int type, int offset) +{ + int i; + for (i = 0; i < MAX_ENEMIES; i++) { + if (enemies[i] == NULL) { + Enemy* result = malloc(sizeof *result); + Slime* s = malloc(sizeof *s); + + s->id = i; + + s->x = x + 20; + s->y = y; + s->type = type; + s->offset = offset; + + s->hp = 1; + s->state = 0; + s->counter = 0; + s->timer = 0; + s->grav = 0.125; + s->vsp = 0; + s->hsp = 0; + s->imageIndex = 0; + + result->data = s; + result->enemyStep = slimeStep; + result->enemyDraw = slimeDraw; + result->type = 0; + + enemies[i] = result; + i = MAX_ENEMIES; + } + } +} + +void slimeStep(Slime* s) +{ + char dead = 0; + + //Stay within room + { + if (s->x > 640) { + s->x = 640; + } + + if (s->x < 0) { + s->x = 0; + } + } + + //Setup Rectangle Mask + Mask mask; + { + mask.unused = 0; + mask.circle = 0; + mask.w = 24; + mask.h = 24; + mask.x = s->x - (mask.w / 2); + mask.y = s->y + 28 - (mask.h / 2); + } + + //Idle + if (s->state == 0) + { + s->imageIndex += 0.25; + + if (s->imageIndex >= 6) { + s->imageIndex = 0; + + if (s->offset <= 0) { + s->state = 1; + + //Red/Yellow Slime + if (s->type == 1 || s->type == 2) + { + s->hsp = 1; + if (s->type == 2) { + s->hsp = 1.5; + } + if ((int)(rand() % 2) == 0) { + s->hsp *= -1; + } + } + + if (s->counter < 2) { + s->vsp = -2; + s->counter += 1; + }else{ + s->vsp = -4; + s->counter = 0; + } + }else{ + s->offset -= 1; + } + } + } + + //Jump + else if (s->state == 1) + { + //Red/Yellow Slime + if (s->type == 1 || s->type == 2) + { + s->x += s->hsp; + mask.x = s->x - (mask.w / 2); + + PHL_Rect collide = getTileCollision(1, mask); + if (collide.x != -1) { + if (s->hsp > 0) { + s->x = collide.x - (mask.w / 2); + }else if (s->hsp < 0) { + s->x = collide.x + 40 + (mask.w / 2); + } + } + + mask.x = s->x - (mask.w / 2); + } + + s->y += s->vsp; + s->vsp += s->grav; + + mask.y = s->y + 28 - (mask.h / 2); + + PHL_Rect collide = getTileCollision(1, mask); + if (collide.x == -1) { + collide = getTileCollision(3, mask); + } + if (collide.x != -1) { + if (s->vsp >= 0) { + s->state = 0; + s->hsp = 0; + s->y = collide.y - 40; + }else{ + s->y = collide.y + 40 - (40 - mask.h) + 1; + } + } + } + + //Setup Collision Mask + { + mask.unused = 0; + mask.circle = 1; + mask.w = 12; + mask.x = s->x; + mask.y = s->y + 28; + } + + //Fell in a pit + { + if (s->y > 480) { + dead = 1; + } + } + + //Collide with hero + { + if (checkCollision(mask, heroMask)) { + int dmg[3] = {10, 20, 20}; + + if (heroHit(dmg[s->type], s->x) == 1 && s->type == 2) { + heroStun(); + } + } + } + + //Sword collision + { + int i; + for (i = 0; i < MAX_WEAPONS; i++) { + if (weapons[i] != NULL) { + if (checkCollision(mask, weapons[i]->weaponMask)) { + weaponHit(weapons[i]); + + spawnCollectable(s->x, s->y + 6); + createEffect(2, s->x - 32, s->y - 12); + dead = 1; + + i = MAX_WEAPONS; + } + } + } + } + + //Destroy object + { + if (dead == 1) { + enemyDestroy(s->id); + } + } +} + +void slimeDraw(Slime* s) +{ + int cropX = 0, + cropY = 0; + + //Idle + if (s->state == 0) { + int image[6] = { 0, 1, 2, 3, 4, 6 }; + cropX = image[(int)s->imageIndex] * 40; + } + + //Jump + else if (s->state == 1) { + cropX = 200; + if (s->vsp >= 0) { + cropX += 40; + } + } + + //Color offsets + int addX[3] = {0, 280, 0}; + int addY[3] = {0, 0, 480}; + + PHL_DrawSurfacePart(s->x - 20, s->y + 12, cropX + addX[s->type], cropY + addY[s->type], 40, 40, images[imgEnemies]); +}
\ No newline at end of file |