diff options
Diffstat (limited to 'src/effect.c')
-rw-r--r-- | src/effect.c | 384 |
1 files changed, 384 insertions, 0 deletions
diff --git a/src/effect.c b/src/effect.c new file mode 100644 index 0000000..e375a7c --- /dev/null +++ b/src/effect.c @@ -0,0 +1,384 @@ +#include "effect.h" +#include "game.h" +#include "PHL.h" +#include "hero.h" +#include "collision.h" +#include <stdlib.h> +#include <math.h> + +void createEffect(int type, int x, int y) +{ + createEffectExtra(type, x, y, 0, 0, 0); +} + +void createEffectExtra(int t, int x, int y, double hsp, double vsp, int val) +{ + int i; + for (i = 0; i < MAX_EFFECTS; i++) { + if (effects[i] == NULL) { + Effect* e = malloc(sizeof *e); + + e->id = i; + e->type = t; + + e->x = x; + e->y = y; + + e->vsp = vsp; + e->hsp = hsp; + e->grav = 0; + + e->imageIndex = 0; + e->imageSpeed = 0; + + e->cropx = 0; + e->cropy = 0; + + e->width = 40; + e->height = 40; + + e->image = imgMisc20; + e->timer = 60; + + + e->visible = 1; + e->val1 = 0; + + e->loop = 0; + e->frames = 0; + + e->depth = 1; + + //Sword collision + if (e->type == 1) { + e->cropx = 440; + e->cropy = 40; + e->imageSpeed = 0.25; + e->timer = 19; + } + + //Enemy poof + else if (e->type == 2) { + PHL_PlaySound(sounds[sndBom01], CHN_EFFECTS); + e->width = 64; + e->height = 64; + e->imageSpeed = 0.33; + e->timer = 30; + e->image = imgMisc32; + } + + //Dust after landing from a fall - left/right + else if (e->type == 3) { + e->cropx = 320; + e->cropy = 80; + e->hsp = -1; + if (hsp > 0) { + e->hsp = 1; + e->cropx = 0; + } + e->imageSpeed = 0.33; + e->timer = 8 * (1 / e->imageSpeed); + } + + //Block destroy/debris + else if (e->type == 4) { + e->grav = 0.2; + e->loop = 1; + e->frames = 4; + e->timer = 60; + + //Set flash offset + if ((e->hsp > 0 && val == 0) || (e->hsp > 0 && val == 1)) { + e->timer -= 1; + } + + e->imageSpeed = 0.34; + + int size = (rand() % 2) + 1; + + e->cropx = 0; + if (e->hsp < 0) { + e->cropx = 160; + } + if (size == 1) { //Big + e->cropy = 40; + }else{ //Small + e->cropy = 440; + } + + } + + //Chest sparkle + else if (e->type == 5) { + /*e->x -= 20; + e->y -= 20; + e->x += -20 + (rand() % 40) + 1; + e->y += -20 + (rand() % 40) + 1; + */ + e->x -= 20; + e->y -= 20; + e->cropx = 440; + e->cropy = 120; + e->imageSpeed = 0.3; + e->timer = 16; + e->depth = 0; + } + + //Charge orbs + else if (e->type == 6) { + e->x -= 20; + e->y -= 20; + e->cropx = 0; + e->cropy = 200; + + e->val1 = (rand() % 360) + 1; + e->imageSpeed = 0.3; + e->timer = 20; + e->depth = 0; + } + + //Poison bubble + else if (e->type == 7) { + PHL_PlaySound(sounds[sndPi02], CHN_EFFECTS); + e->x -= 30; + e->x += (rand() % 20) + 1; + e->cropx = 280; + e->cropy = 120; + e->timer = 35; + + e->vsp = -2; + e->imageIndex = 0; + e->imageSpeed = 0.16; + e->depth = 0; + } + + //Stone break free + else if (e->type == 8) { + e->image = imgMisc32; + e->cropy = 64; + e->width = 64; + e->height = 64; + + e->imageSpeed = 0.32; + e->timer = 18; + } + + //Tiny stone debris + else if (e->type == 9) { + e->x -= 20; + e->y -= 20; + e->image = imgMisc20; + e->cropy = 40; + e->cropx = 320 + ((rand() % 3) * 40); + e->imageSpeed = 0; + + e->vsp = -2 - (0.25 * (rand() % 8)); + e->hsp = -1 + (0.25 * (rand() % 8)); + e->grav = 0.1; + + e->timer = 60; + e->depth = 0; + } + + //Lava top animation + else if (e->type == 10) { + e->cropy = 40; + e->cropx = 80; + + e->imageSpeed = 0.125; + e->depth = -1; + e->loop = 1; + e->frames = 3; + e->timer = 100; + + e->image = imgTiles; + } + + //Water top animation + else if (e->type == 11) { + e->cropy = 40; + e->cropx = 240; + + e->imageSpeed = 0.125; + e->depth = -1; + e->loop = 1; + e->frames = 4; + e->timer = 100; + + e->image = imgTiles; + } + + //Hero Air Bubble + else if (e->type == 12) { + e->x -= 20; + e->val1 = e->x; //Start x + e->y -= 20; + e->cropx = 440; + e->loop = 1; + e->frames = 2; + e->imageSpeed = 0.2; + e->timer = 120; + e->vsp = -0.5; + e->depth = 0; + } + + //Water splash + else if (e->type == 13) { + e->cropx = 200; + e->imageSpeed = 0.1; + e->timer = 55; + e->grav = 0.1; + } + + //Lava splash + else if (e->type == 14) { + e->cropx = 400; + e->cropy = 200; + e->imageSpeed = 0.1; + e->timer = 55; + e->grav = 0.1; + } + + effects[i] = e; + i = MAX_EFFECTS; + } + } +} + +void effectStep(Effect* e) +{ + e->x += e->hsp; + e->y += e->vsp; + e->vsp += e->grav; + e->imageIndex += e->imageSpeed; + + if (e->loop == 1) { + if (e->imageIndex >= e->frames) { + e->imageIndex -= e->frames; + } + } + + if (e->type == 12) { //Hero Air Bubble + e->x = e->val1 + 5 * sin((e->timer * 5) * 3.14159 / 180); + if (checkTileCollisionXY(4, e->x + 20, e->y + 20) == 0) { + e->timer = 0; + } + } + + if (e->type == 10 || e->type == 11) { //Lava top + e->timer = 100; + } + + if (e->type == 4 || e->type == 9 || e->type == 12) { //Stone Rubble + if (e->timer <= 30 && e->timer % 2 != 0) { + e->visible = 0; + }else{ + e->visible = 1; + } + } + else if (e->type == 6) { //Charge orb + if (e->timer % 2 == 0) { + e->visible = 1; + e->x = herox + ((e->timer * 3) * sin(e->val1 * 3.14159 / 180)) - 20; + e->y = heroy + ((e->timer * 3) * cos(e->val1 * 3.14159 / 180)); + }else{ + e->visible = 0; + } + } + + e->timer -= 1; + if (e->timer <= 0) { + effectDestroy(e->id); + } +} + +void effectDraw(Effect* e) +{ + //if (e->type != 4 || (e->timer > 30 || e->timer % 2 == 0)) { + if (e->visible == 1) { + if (e->type == 7) { //Poison Bubble + int animation[6] = {0, 1, 2, 1, 0, 3}; + PHL_DrawSurfacePart(e->x, e->y, e->cropx + (e->width * (animation[(int)e->imageIndex])), e->cropy, e->width, e->height, images[e->image]); + }else{ + PHL_DrawSurfacePart(e->x, e->y, e->cropx + (e->width * ((int)e->imageIndex)), e->cropy, e->width, e->height, images[e->image]); + } + } +} + +void effectDestroy(int id) +{ + if (effects[id] != NULL) { + free(effects[id]); + } + effects[id] = NULL; +} + +void createRockSmash(int x, int y) +{ + x -= 20; + + int randvsp = (rand() % 3) + 1; + createEffectExtra(4, x, y, -1.5, -2 - randvsp, 0); + + randvsp = (rand() % 3) + 1; + createEffectExtra(4, x, y, -1, -5 - randvsp, 1); + + randvsp = (rand() % 3) + 1; + createEffectExtra(4, x, y, 1.5, -2 - randvsp, 0); + + randvsp = (rand() % 3) + 1; + createEffectExtra(4, x, y, 1, -5 - randvsp, 1); + PHL_PlaySound(sounds[sndBom02], 2); +} + +void createSplash(int x, int y) +{ + double chsp = 0, + cvsp = 0; + + x -= 20; + + chsp = -0.25 - ((rand() % 9) * 0.25); + cvsp = -1.5 - ((rand() % 9) * 0.25); + createEffectExtra(13, x, y, chsp, cvsp, 0); + + chsp = 0.25 + ((rand() % 9) * 0.25); + cvsp = -1.5 - ((rand() % 9) * 0.25); + createEffectExtra(13, x, y, chsp, cvsp, 0); + + chsp = -0.25 - ((rand() % 9) * 0.25); + cvsp = -0.5 - ((rand() % 4) * 0.25); + createEffectExtra(13, x, y, chsp, cvsp, 0); + + chsp = 0.25 + ((rand() % 9) * 0.25); + cvsp = -0.5 - ((rand() % 4) * 0.25); + createEffectExtra(13, x, y, chsp, cvsp, 0); + + PHL_PlaySound(sounds[sndWater01], CHN_EFFECTS); +} + +void createLavaSplash(int x, int y) +{ + double chsp = 0, + cvsp = 0; + + x -= 20; + + chsp = -0.25 - ((rand() % 9) * 0.25); + cvsp = -1.5 - ((rand() % 9) * 0.25); + createEffectExtra(14, x, y, chsp, cvsp, 0); + + chsp = 0.25 + ((rand() % 9) * 0.25); + cvsp = -1.5 - ((rand() % 9) * 0.25); + createEffectExtra(14, x, y, chsp, cvsp, 0); + + chsp = -0.25 - ((rand() % 9) * 0.25); + cvsp = -0.5 - ((rand() % 4) * 0.25); + createEffectExtra(14, x, y, chsp, cvsp, 0); + + chsp = 0.25 + ((rand() % 9) * 0.25); + cvsp = -0.5 - ((rand() % 4) * 0.25); + createEffectExtra(14, x, y, chsp, cvsp, 0); + + PHL_PlaySound(sounds[sndShot07], CHN_EFFECTS); +}
\ No newline at end of file |