static void creditsMove() { if (self->mental == 0) { createBeam(); self->mental = 1; } self->thinkTime += 5; self->dirY += cos(DEG_TO_RAD(self->thinkTime)); self->dirY /= 3; self->dirX = self->speed; checkToMap(self); if (self->mental == 1) { self->endX = MAX(getMapCeiling(self->x + self->w - 1, self->y), getMapCeiling(self->x, self->y)); self->endY = MIN(getMapFloor(self->x + self->w - 1, self->y), getMapFloor(self->x, self->y)); } if (self->dirX == 0) { self->inUse = FALSE; } }
static void castLightningBolt() { Entity *e; self->thinkTime--; if (self->thinkTime <= 0) { 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->y = self->y + self->h / 2; e->x -= e->w / 2; e->y -= e->h / 2; e->targetX = player.x + player.w / 2 - e->w / 2; e->targetY = getMapCeiling(e->targetX, self->y); e->startY = e->targetY; e->endY = getMapFloor(e->targetX, e->targetY); calculatePath(e->x, e->y, e->targetX, e->targetY, &e->dirX, &e->dirY); e->flags |= (NO_DRAW|HELPLESS|TELEPORTING|NO_END_TELEPORT_SOUND); e->head = self; e->face = RIGHT; e->action = &lightningBolt; e->draw = &drawLoopingAnimationToMap; e->head = self; e->face = self->face; e->type = ENEMY; e->thinkTime = 0; e->flags |= FLY|DO_NOT_PERSIST; self->action = &castWait; setEntityAnimation(self, "ATTACK_2"); self->animationCallback = &summonEnd; } }
static void castIce() { Entity *e; self->thinkTime--; setEntityAnimation(self, "ATTACK_1"); if (self->thinkTime <= 0) { e = getFreeEntity(); if (e == NULL) { showErrorAndExit("No free slots to add Ice Spike"); } loadProperties("enemy/ice_spike", e); setEntityAnimation(e, "STAND"); e->x = self->x + self->w / 2; e->y = self->y + self->h / 2; e->x -= e->w / 2; e->y -= e->h / 2; e->targetX = player.x + player.w / 2; e->targetY = getMapCeiling(e->targetX, self->y); calculatePath(e->x, e->y, e->targetX, e->targetY, &e->dirX, &e->dirY); e->flags |= (NO_DRAW|HELPLESS|TELEPORTING|NO_END_TELEPORT_SOUND); playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); e->action = &iceDrop; e->draw = &drawLoopingAnimationToMap; e->touch = &entityTouch; e->head = self; e->face = self->face; e->type = ENEMY; e->thinkTime = 30; e->flags |= FLY|DO_NOT_PERSIST; self->thinkTime = 0; setEntityAnimation(self, "STAND"); self->action = &walk; } checkToMap(self); }
static void fly() { if (self->dirX == 0) { self->dirX = (self->face == RIGHT ? -self->speed : self->speed); self->face = (self->face == RIGHT ? LEFT : RIGHT); } self->thinkTime += 5; self->dirY += cos(DEG_TO_RAD(self->thinkTime)); self->dirY /= 3; checkToMap(self); if (self->mental == 1) { self->endX = MAX(getMapCeiling(self->x + self->w - 1, self->y), getMapCeiling(self->x, self->y)); self->endY = MIN(getMapFloor(self->x + self->w - 1, self->y), getMapFloor(self->x, self->y)); } }
static void init() { EntityList *list; EntityList *l; Entity *e; if (strlen(self->objectiveName) == 0) { showErrorAndExit("Scale at %d %d has no name", (int)self->x, (int)self->y); } list = getEntitiesByObjectiveName(self->objectiveName); for (l=list->next;l!=NULL;l=l->next) { e = l->entity; if (e != self) { self->target = e; break; } } freeEntityList(list); if (self->target == NULL) { showErrorAndExit("Scale could not find partner %s", self->objectiveName); } self->targetY = self->startY + (self->endY - self->startY) / 2; addChain(); self->mental = getMapCeiling(self->x, self->y); self->action = &entityWait; }
static void createLightningWaveInit() { Entity *e; if (self->endX == 0) { e = addThunderCloud(self->x, self->y, "enemy/thunder_cloud"); e->x = self->x + self->w / 2; e->y = self->y + self->h / 2; e->x -= e->w / 2; e->y -= e->h / 2; e->targetX = self->targetX; e->targetY = getMapCeiling(self->x, self->y); calculatePath(e->x, e->y, e->targetX, e->targetY, &e->dirX, &e->dirY); e->flags |= (NO_DRAW|HELPLESS|TELEPORTING|NO_END_TELEPORT_SOUND); playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); e->head = self; e->face = RIGHT; setEntityAnimation(e, "STAND"); e->action = &lightningWaveStart; self->endX = 1; } checkToMap(self); hover(); }
static void castLightningBolt() { Entity *e; self->thinkTime--; if (self->thinkTime <= 0) { 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->y = self->y + self->h / 2; e->x -= e->w / 2; e->y -= e->h / 2; e->targetX = player.x + player.w / 2 - e->w / 2; e->targetY = getMapCeiling(self->x, self->y); e->startY = e->targetY; e->endY = getMapFloor(e->targetX, e->targetY); calculatePath(e->x, e->y, e->targetX, e->targetY, &e->dirX, &e->dirY); e->flags |= (NO_DRAW|HELPLESS|TELEPORTING|NO_END_TELEPORT_SOUND); playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); e->head = self; e->face = RIGHT; e->action = &lightningBolt; e->draw = &drawLoopingAnimationToMap; e->head = self; e->face = self->face; e->type = ENEMY; e->thinkTime = 0; e->flags |= FLY|DO_NOT_PERSIST; self->mental--; if (self->mental <= 0) { self->thinkTime = 60; self->action = &attackFinished; } else { self->thinkTime = 30; } } hover(); }
static void entityWait() { int x1, y1, x2, y2, w1, h1, w2, h2; EntityList *el, *entities; Entity *other; if (self->dirX > 0) { self->endX = getMapRight(self->startX, self->startY); self->box.w = self->endX - self->x; } else if (self->dirX < 0) { self->x = getMapLeft(self->startX, self->startY); self->box.w = self->startX - self->x; } if (self->dirY > 0) { self->endY = getMapFloor(self->startX, self->startY); self->box.h = self->endY - self->y; } else if (self->dirY < 0) { self->y = getMapCeiling(self->startX, self->startY); self->box.h = self->startY - self->y; } entities = getEntities(); for (el=entities->next;el!=NULL;el=el->next) { other = el->entity; if (other->inUse == TRUE && (other->type == MANUAL_DOOR || other->type == AUTO_DOOR || other->type == WEAK_WALL)) { x1 = self->x + self->box.x; y1 = self->y + self->box.y; w1 = self->box.w; h1 = self->box.h; x2 = other->x + other->box.x; y2 = other->y + other->box.y; w2 = other->box.w; h2 = other->box.h; if (collision(x1, y1, w1, h1, x2, y2, w2, h2) == TRUE) { if (self->dirX > 0) { self->endX = other->x; self->box.w = self->endX - self->x; } else if (self->dirX < 0) { self->x = other->x + other->w; self->box.w = self->startX - self->x; } if (self->dirY > 0) { self->endY = other->y; self->box.h = self->endY - self->y; } else if (self->dirY < 0) { self->y = other->y + other->h; self->box.h = self->startY - self->y; } } } } }
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(); }