aboutsummaryrefslogtreecommitdiff
path: root/src/effect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/effect.c')
-rw-r--r--src/effect.c384
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