static void largeRockFall() { Entity *e; if (self->flags & ON_GROUND) { playSoundToMap("sound/common/rock_bounce", -1, self->x, self->y, 0); e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = -3; e->dirY = -8; e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = 3; e->dirY = -8; self->inUse = FALSE; } checkToMap(self); }
static void punch() { Entity *e; if (self->y > self->targetY) { self->thinkTime--; if (self->thinkTime <= 0) { if (self->thinkTime == 0) { playSoundToMap("sound/common/crumble", BOSS_CHANNEL, self->x, self->y, 0); shakeScreen(MEDIUM, 15); } e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = -3; e->dirY = -8; e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = 3; e->dirY = -8; self->y -= 12; if (self->y <= self->targetY) { self->y = self->targetY; self->maxThinkTime--; self->thinkTime = self->maxThinkTime > 0 ? 30 : 90; } } } else { self->thinkTime--; if (self->thinkTime < 0) { self->targetY = self->y + self->h; self->action = &punchSink; } } facePlayer(); }
static void entityWait() { int i; float dirX; Entity *e; dirX = self->dirX; if (dirX != 0) { for (e=self->target;e!=NULL;e=e->target) { if (e->x > self->startX) { e->flags &= ~NO_DRAW; } else { e->flags |= NO_DRAW; } } } checkToMap(self); if (self->dirX == 0 && dirX != 0) { playSoundToMap("sound/common/crumble", -1, self->x, self->y, 0); self->mental = 1; self->touch = &pushEntity; self->x += TILE_SIZE / 2; for (e=self->target;e!=NULL;e=e->target) { e->x += TILE_SIZE / 2; e->dirX = 0; e->touch = &pushEntity; } for (i=0;i<6;i++) { e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = -(prand() % 4 + 1); e->dirY = -(prand() % 3 + 3); } shakeScreen(MEDIUM, 15); } }
static void spikeRise() { Entity *e; self->thinkTime--; if (self->thinkTime <= 0) { if (self->y > self->startY) { self->y -= self->speed * 2; } else { playSoundToMap("sound/common/crumble", BOSS_CHANNEL, self->x, self->y, 0); shakeScreen(MEDIUM, 15); e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = -3; e->dirY = -8; e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = 3; e->dirY = -8; self->y = self->startY; self->health = 15; self->thinkTime = 120; self->action = &spikeWait; } } }
static void statueRise() { Entity *e; if (self->y > self->targetY) { self->y -= 12; if (self->y <= self->targetY) { self->y = self->targetY; playSoundToMap("sound/common/crumble", BOSS_CHANNEL, self->x, self->y, 0); shakeScreen(MEDIUM, 15); } e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = -3; e->dirY = -8; e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = 3; e->dirY = -8; } else { self->thinkTime--; self->action = self->resumeNormalFunction; } }
static void stalagmiteRise() { Entity *e; self->thinkTime--; if (self->thinkTime <= 0) { if (self->y > self->startY) { self->y -= 12; } else { playSoundToMap("sound/common/crumble", -1, self->x, self->y, 0); shakeScreen(MEDIUM, 15); e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = -3; e->dirY = -8; e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = 1; e->dirY = -8; self->y = self->startY; self->action = &stalagmiteWait; } } }
static void cageLightningWait() { Entity *e; self->x = self->head->x + self->head->w / 2 - self->w / 2; if (self->head->inUse == FALSE) { self->inUse = FALSE; } if (self->mental == 1) { self->thinkTime--; if (self->thinkTime <= 0) { e = addSmallRock(self->x, self->endY, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y = self->y; e->dirX = -3; e->dirY = -8; e = addSmallRock(self->x, self->endY, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y = self->y; e->dirX = 3; e->dirY = -8; self->thinkTime = 15; } } }
static void stalagmiteDie() { Entity *e; playSoundToMap("sound/common/crumble", -1, self->x, self->y, 0); e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = -3; e->dirY = -8; e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = 1; e->dirY = -8; self->inUse = FALSE; }
static void iceWallMove() { int i; Entity *e; if (self->y > self->targetY) { self->y -= 12; if (self->y <= self->targetY) { self->y = self->targetY; playSoundToMap("sound/common/crumble", BOSS_CHANNEL, self->x, self->y, 0); shakeScreen(MEDIUM, 15); e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = -3; e->dirY = -8; e = addSmallRock(self->x, self->y, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y += (self->h - e->h) / 2; e->dirX = 3; e->dirY = -8; self->touch = &iceWallTouch; } } else { self->thinkTime--; if (self->thinkTime == 0) { self->dirX = self->face == LEFT ? -self->speed : self->speed; } else if (self->thinkTime < 0 && self->dirX == 0) { playSoundToMap("sound/common/shatter", -1, self->x, self->y, 0); for (i=0;i<8;i++) { e = addTemporaryItem("misc/ice_wall_piece", self->x, self->y, RIGHT, 0, 0); e->x = self->x + self->w / 2; e->x -= e->w / 2; e->y = self->y + self->h / 2; e->y -= e->h / 2; e->dirX = (prand() % 4) * (prand() % 2 == 0 ? -1 : 1); e->dirY = ITEM_JUMP_HEIGHT * 2 + (prand() % ITEM_JUMP_HEIGHT); setEntityAnimationByID(e, i); e->thinkTime = 60 + (prand() % 60); e->touch = NULL; } self->inUse = FALSE; } checkToMap(self); } }
static void lightningBolt() { int i, middle; Entity *e; self->flags |= NO_DRAW; self->thinkTime--; middle = -1; if (self->thinkTime <= 0) { playSoundToMap("sound/enemy/thunder_cloud/lightning", -1, self->targetX, self->startY, 0); for (i=self->startY;i<self->endY;i+=32) { e = getFreeEntity(); if (e == NULL) { showErrorAndExit("No free slots to add lightning"); } loadProperties("enemy/lightning", e); setEntityAnimation(e, "STAND"); if (i == self->startY) { middle = self->targetX + self->w / 2 - e->w / 2; } e->x = middle; e->y = i; e->action = &lightningWait; e->draw = &drawLoopingAnimationToMap; e->touch = &entityTouch; e->head = self; e->currentFrame = prand() % 6; e->face = RIGHT; e->thinkTime = 15; } e = addSmallRock(self->x, self->endY, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y -= e->h; e->dirX = -3; e->dirY = -8; e = addSmallRock(self->x, self->endY, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y -= e->h; e->dirX = 3; e->dirY = -8; self->inUse = FALSE; } }
static void createLightningWave() { int i, top, bottom, valid; Entity *e; self->thinkTime--; if (self->thinkTime <= 0) { bottom = getMapFloor(self->x, self->y); top = getMapCeiling(self->x, self->y); valid = TRUE; playSoundToMap("sound/enemy/thunder_cloud/lightning", -1, self->x, self->y, 0); for (i=top;i<bottom;i+=32) { e = getFreeEntity(); if (e == NULL) { showErrorAndExit("No free slots to add lightning"); } loadProperties("enemy/lightning", e); setEntityAnimation(e, "STAND"); e->x = self->targetX + self->w / 2 - e->w / 2; e->y = i; e->action = &lightningWait; e->draw = &drawLoopingAnimationToMap; e->touch = &entityTouch; e->head = self; e->currentFrame = prand() % 6; e->face = RIGHT; e->thinkTime = 15; if (isValidOnMap(e) == FALSE) { valid = FALSE; e->inUse = FALSE; break; } } if (valid == TRUE) { e = addSmallRock(self->targetX, bottom, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y -= e->h; e->dirX = -3; e->dirY = -8; e = addSmallRock(self->targetX, bottom, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y -= e->h; e->dirX = 3; e->dirY = -8; self->targetX += self->face == RIGHT ? 64 : -64; self->thinkTime = 30; } else { self->action = &teleportToOtherSide; } } checkToMap(self); hover(); }
static void castLightning() { int i; Entity *e; self->thinkTime--; if (self->thinkTime <= 0 && player.health > 0) { playSoundToMap("sound/enemy/thunder_cloud/lightning", -1, self->x, self->y, 0); for (i=self->endY-32;i>=self->startY;i-=32) { e = getFreeEntity(); if (e == NULL) { showErrorAndExit("No free slots to add lightning"); } loadProperties("enemy/lightning", e); setEntityAnimation(e, "STAND"); e->x = self->x + self->w / 2 - e->w / 2; e->y = i; e->action = &lightningWait; e->draw = &drawLoopingAnimationToMap; e->touch = &entityTouch; e->head = self; e->currentFrame = prand() % 6; e->face = RIGHT; e->thinkTime = 15; } e = addSmallRock(self->x, self->endY, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y -= e->h; e->dirX = -3; e->dirY = -8; e = addSmallRock(self->x, self->endY, "common/small_rock"); e->x += (self->w - e->w) / 2; e->y -= e->h; e->dirX = 3; e->dirY = -8; self->action = &castLightningFinish; self->thinkTime = 30; } }