static void teleportAway() { float x; x = self->x; self->targetX = self->x < player.x ? player.x + 128 : player.x - 128 - self->w; self->targetY = self->y; self->x = self->targetX; if (isValidOnMap(self) == TRUE) { self->x = x; self->face = self->x < player.x ? RIGHT : LEFT; self->dirX = self->face == LEFT ? -self->speed : self->speed; self->animationCallback = NULL; setEntityAnimation(self, "STAND"); calculatePath(self->x, self->y, self->targetX, self->targetY, &self->dirX, &self->dirY); self->flags |= (NO_DRAW|HELPLESS|TELEPORTING); playSoundToMap("sound/common/teleport", BOSS_CHANNEL, self->x, self->y, 0); self->action = &lookForPlayer; /* Don't reset thinkTime if teleporting after summon */ if (self->mental == 0) { self->thinkTime = 0; } } else { self->x = x; if (self->mental == 0) { self->action = &lookForPlayer; } } self->mental = 0; }
void drawCursor() { Entity *e; if (cursor.type == TILES) { drawImage(tileImage(cursor.tileID), cursor.x, cursor.y, FALSE, 255); drawImage(tileImage(BLANK_TILE), cursor.x, cursor.y, FALSE, 255); } else { e = isSpaceEmpty(&cursor.entity); if (isValidOnMap(&cursor.entity) == 0 || e != NULL) { drawBox(game.screen, cursor.x, cursor.y, cursor.entity.w, cursor.entity.h, 255, 0, 0); } if (e != NULL) { setStatusPanelMessage("%s : %d %d", (strlen(e->objectiveName) == 0 ? e->name : e->objectiveName), (int)e->x, (int)e->y); } else { setStatusPanelMessage(""); } cursor.entity.x = getMapStartX() + cursor.x; cursor.entity.y = getMapStartY() + cursor.y; self = &cursor.entity; self->draw(); } }
void doCursor() { char name[MAX_VALUE_LENGTH]; int x, y; cursor.x = input.mouseX; cursor.y = input.mouseY; if (cursor.type == TILES || cursor.snapToGrid == 1) { cursor.x /= TILE_SIZE; cursor.y /= TILE_SIZE; cursor.x *= TILE_SIZE; cursor.y *= TILE_SIZE; } if (cursor.y >= SCREEN_HEIGHT - TILE_SIZE) { cursor.y = SCREEN_HEIGHT - TILE_SIZE * 2; } if (input.left == 1) { mapStartXNext(-TILE_SIZE); } else if (input.right == 1) { mapStartXNext(TILE_SIZE); } if (input.up == 1) { mapStartYNext(-TILE_SIZE); } else if (input.down == 1) { mapStartYNext(TILE_SIZE); } if (input.snap == 1) { cursor.snapToGrid = 1 - cursor.snapToGrid; input.snap = 0; } if (input.activate == 1) { cursor.entity.face = (cursor.entity.face == RIGHT ? LEFT : RIGHT); input.activate = 0; } if (input.block == 1) { if (cursor.type == TILES) { x = (getMapStartX() + cursor.x) / TILE_SIZE; y = (getMapStartY() + cursor.y) / TILE_SIZE; while (mapTileAt(x, y) == BLANK_TILE && x >= 0) { setTileAt(x, y, cursor.tileID); x--; } x = (getMapStartX() + cursor.x) / TILE_SIZE; x++; while (mapTileAt(x, y) == BLANK_TILE && x < MAX_MAP_X) { setTileAt(x, y, cursor.tileID); x++; } } } if (input.add == 1) { if (cursor.type == TILES) { setTileAt((getMapStartX() + cursor.x) / TILE_SIZE, (getMapStartY() + cursor.y) / TILE_SIZE, cursor.tileID); } else { /* Entities can only be placed in blank spaces */ if (isValidOnMap(&cursor.entity) == 1 && isSpaceEmpty(&cursor.entity) == NULL) { if (cursor.entityType == 0) { setPlayerLocation(getMapStartX() + cursor.x, getMapStartY() + cursor.y); } else { if (strcmpignorecase(cursor.entity.name, "lift/lift_target") == 0) { snprintf(name, sizeof(name), "NEW_TARGET_%03d", targetID); addTarget(getMapStartX() + cursor.x, getMapStartY() + cursor.y, name); targetID++; } else { cursor.entity.startX = getMapStartX() + cursor.x; cursor.entity.startY = getMapStartY() + cursor.y; cursor.entity.endX = getMapStartX() + cursor.x; cursor.entity.endY = getMapStartY() + cursor.y; addEntity(cursor.entity, getMapStartX() + cursor.x, getMapStartY() + cursor.y); } } } input.add = 0; } } else if (input.remove == 1) { if (cursor.type == TILES) { setTileAt((getMapStartX() + cursor.x) / TILE_SIZE, (getMapStartY() + cursor.y) / TILE_SIZE, BLANK_TILE); } else { self = isSpaceEmpty(&cursor.entity); if (self != NULL) { self->inUse = FALSE; } } } if (input.cut == 1) { if (cursor.type != TILES) { self = isSpaceEmpty(&cursor.entity); if (self != NULL) { cursor.entity = *self; self->inUse = FALSE; } } input.cut = 0; } if (input.previous == 1) { if (cursor.type == TILES) { cursor.tileID = prevTile(cursor.tileID); } else { cursor.entityType--; if (cursor.entityType < 0) { cursor.entityType = entityNamesLength - 1; } memset(&cursor.entity, 0, sizeof(Entity)); cursor.entity.draw = &drawLoopingAnimationToMap; cursor.entity.weight = 0; cursor.entity.originalWeight = 0; cursor.entity.inUse = TRUE; loadProperties(entityNames[cursor.entityType], &cursor.entity); cursor.entity.active = TRUE; cursor.entity.alpha = 255; if (cursor.entity.weight == 0) { cursor.entity.weight = 1; cursor.entity.originalWeight = 1; } } input.previous = 0; } else if (input.next == 1) { if (cursor.type == TILES) { cursor.tileID = nextTile(cursor.tileID); } else { cursor.entityType++; if (cursor.entityType >= entityNamesLength) { cursor.entityType = 0; } memset(&cursor.entity, 0, sizeof(Entity)); cursor.entity.draw = &drawLoopingAnimationToMap; cursor.entity.weight = 0; cursor.entity.originalWeight = 1; cursor.entity.inUse = TRUE; loadProperties(entityNames[cursor.entityType], &cursor.entity); cursor.entity.active = TRUE; cursor.entity.alpha = 255; if (cursor.entity.weight == 0) { cursor.entity.weight = 1; cursor.entity.originalWeight = 1; } } input.next = 0; } if (input.save == 1) { if (saveMap() == TRUE) { setStatusPanelMessage("Saved"); } else { setStatusPanelMessage("Saving Failed"); } input.save = 0; } /* if (input.load == 1) { loadMap(map.filename); printf("Loaded\n"); input.load = 0; } */ if (input.left == 1 || input.right == 1 || input.up == 1 || input.down == 1) { SDL_Delay(30); } if (input.toggle == 1) { if (cursor.type == TILES) { cursor.type = ENTITIES; } else { cursor.type = TILES; } input.toggle = 0; } centerMapOnEntity(NULL); }
static void createIceBlock() { int x, y; Entity *e; self->thinkTime--; if (self->thinkTime <= 0) { e = getFreeEntity(); if (e == NULL) { showErrorAndExit("No free slots to add Ice Block"); } loadProperties("edgar/edgar_frozen", e); setEntityAnimation(e, "STAND"); x = player.x + player.w / 2; y = self->y - 100 - (prand() % 60); e->x = x; e->y = y; if (isValidOnMap(e) == TRUE) { 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 = x; e->targetY = y; e->damage = 1; e->health = 50; 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 = &iceBlockDrop; e->draw = &drawLoopingAnimationToMap; e->touch = &entityTouch; e->pain = &enemyPain; e->die = &iceBlockDie; e->head = self; e->face = self->face; e->type = ENEMY; e->thinkTime = 30; e->flags |= FLY|DO_NOT_PERSIST; self->endX--; if (self->endX <= 0) { self->thinkTime = 0; self->action = &castIceFinish; } else { self->thinkTime = 60; } } else { e->inUse = FALSE; } } checkToMap(self); hover(); }
static void summon2() { int i; Entity *e; self->thinkTime--; if (self->thinkTime <= 0) { i = prand() % 4; switch (i) { case 0: e = addBook(self->x, self->y, "enemy/green_book"); break; case 1: e = addBook(self->x, self->y, "enemy/yellow_book"); break; case 2: e = addBook(self->x, self->y, "enemy/red_book"); break; default: e = addBook(self->x, self->y, "enemy/blue_book"); break; } e->pain = &enemyPain; e->targetX = player.x + player.w / 2 - e->w / 2 + (self->face == RIGHT ? 64 : -64); e->targetY = player.y - 32 - prand() % 64; e->startY = e->targetY; e->x = e->targetX; e->y = e->targetY; if (isValidOnMap(e) == TRUE) { 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->health = 30; 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->face = RIGHT; self->endX--; } else { e->inUse = FALSE; } if (self->endX <= 0) { self->thinkTime = 120; self->action = &physicalAttackFinish; } else { self->thinkTime = 45; } } facePlayer(); checkToMap(self); hover(); }
static void summon() { Entity *e; self->thinkTime--; if (self->thinkTime <= 0) { e = addBook(self->x, self->y, "enemy/green_book"); e->pain = &enemyPain; e->targetX = player.x + player.w / 2 - e->w / 2 + 32; e->targetY = player.y - 32 - prand() % 64; e->startY = e->targetY; e->x = e->targetX; e->y = e->targetY; if (isValidOnMap(e) == TRUE) { 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->health = 30; 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->face = RIGHT; self->endX--; } else { e->inUse = FALSE; } if (self->endX <= 0) { self->thinkTime = 300; self->action = &physicalAttackFinish; } else { self->thinkTime = 45; } } checkToMap(self); hover(); }
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(); }