static void flyToTopTarget() { Target *t; /* Don't fly through the player, that'd be really annoying */ if (player.x < self->x) { t = getTargetByName("FLY_BOSS_TARGET_TOP_RIGHT"); } else { t = getTargetByName("FLY_BOSS_TARGET_TOP_LEFT"); } if (t == NULL) { showErrorAndExit("Fly boss cannot find target"); } self->targetX = t->x; self->targetY = t->y; calculatePath(self->x, self->y, self->targetX, self->targetY, &self->dirX, &self->dirY); self->dirX *= self->speed; self->dirY *= self->speed; self->action = &moveToTarget; }
static void selectRandomBottomTarget() { Target *t; if (prand() % 2 == 0) { t = getTargetByName("FLY_BOSS_TARGET_BOTTOM_RIGHT"); } else { t = getTargetByName("FLY_BOSS_TARGET_BOTTOM_LEFT"); } if (t == NULL) { showErrorAndExit("Fly boss cannot find target"); } self->targetX = t->x; self->targetY = t->y; calculatePath(self->x, self->y, self->targetX, self->targetY, &self->dirX, &self->dirY); self->dirX *= self->speed; self->dirY *= self->speed; facePlayer(); }
static void punchAttackInit() { Target *t; t = getTargetByName("BLOB_TARGET_LEFT"); if (t == NULL) { showErrorAndExit("Blob Boss could not find target"); } self->startX = t->x; t = getTargetByName("BLOB_TARGET_RIGHT"); if (t == NULL) { showErrorAndExit("Blob Boss could not find target"); } self->endX = t->x; self->targetY = self->y + self->h; self->maxThinkTime = 3 + prand() % 3; self->layer = BACKGROUND_LAYER; self->action = &punchSink; }
static void dropInit() { Target *left, *right; setEntityAnimation(self, "ATTACK_1"); self->dirY = 0; left = getTargetByName("FLY_BOSS_TARGET_TOP_LEFT"); right = getTargetByName("FLY_BOSS_TARGET_TOP_RIGHT"); self->thinkTime--; self->targetX = player.x - self->w / 2 + player.w / 2; if (self->thinkTime > 0) { /* Move towards player */ if (abs(self->x - self->targetX) <= self->speed) { self->dirX = 0; } else { self->dirX = self->targetX < self->x ? -self->speed : self->speed; } checkToMap(self); if (self->x < left->x) { self->x = left->x; self->dirX = 0; } else if (self->x > right->x) { self->x = right->x; self->dirX = 0; } } else { self->thinkTime = 0; self->action = &drop; self->dirX = 0; } }
static void disintegrationAttackInit() { int rand; Target *t; rand = prand() % 2; t = getTargetByName(rand == 0 ? "SORCEROR_LEFT_TARGET" : "SORCEROR_RIGHT_TARGET"); if (t == NULL) { showErrorAndExit("Sorceror cannot find target"); } addParticleExplosion(self->x + self->w / 2, self->y + self->h / 2); self->x = t->x; self->face = rand == 0 ? RIGHT : LEFT; playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); self->flags |= NO_DRAW; self->thinkTime = 30; self->mental = 0; self->action = &disintegrationAttack; }
static void spikeAttackInit() { Target *t = getTargetByName("AZRIEL_TOP_TARGET"); if (t == NULL) { showErrorAndExit("Azriel cannot find target"); } self->targetX = t->x; self->targetY = t->y; calculatePath(self->x, self->y, self->targetX, self->targetY, &self->dirX, &self->dirY); self->dirX *= self->speed; self->dirY *= self->speed; self->action = &spikeAttackMoveToTopTarget; self->thinkTime = 30; checkToMap(self); becomeTransparent(); }
static void lightningCageInit() { Target *t; t = getTargetByName("AZRIEL_TOP_TARGET"); if (t == NULL) { showErrorAndExit("Azriel cannot find target"); } addParticleExplosion(self->x + self->w / 2, self->y + self->h / 2); self->x = t->x; self->y = t->y; playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); self->flags |= NO_DRAW; self->thinkTime = 30; self->action = &lightningCageCreate; self->mental = 0; self->target->layer = BACKGROUND_LAYER; becomeTransparent(); }
static void scytheThrowTeleportAway() { Target *t; self->thinkTime--; if (self->thinkTime <= 0) { self->flags |= NO_DRAW; addParticleExplosion(self->x + self->w / 2, self->y + self->h / 2); playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); t = getTargetByName("AZRIEL_TOP_TARGET"); if (t == NULL) { showErrorAndExit("Azriel cannot find target"); } self->x = t->x; self->y = t->y; self->action = &scytheThrowFinish; self->thinkTime = 30; } }
static void lightningCageFinish() { Target *t; self->thinkTime--; if (self->thinkTime <= 0) { self->mental = 2; t = getTargetByName("AZRIEL_TOP_TARGET"); if (t == NULL) { showErrorAndExit("Azriel cannot find target"); } addParticleExplosion(self->x + self->w / 2, self->y + self->h / 2); self->x = t->x; self->y = t->y; playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); self->flags |= NO_DRAW; self->thinkTime = 30; self->action = &lightningCageTeleportAway; } becomeTransparent(); }
static void doIntro() { Entity *e; Target *t; e = getFreeEntity(); if (e == NULL) { showErrorAndExit("No free slots to add Edgar's Soul"); } t = getTargetByName("EDGAR_SOUL_TARGET"); if (t == NULL) { showErrorAndExit("Azirel cannot find target"); } loadProperties("boss/edgar_soul", e); e->x = t->x; e->y = t->y; e->startY = e->y; e->alpha = 0; e->action = &soulWait; e->draw = &drawLoopingAnimationToMap; e->type = ENEMY; e->thinkTime = e->maxThinkTime; self->head = e; e->target = self; e->mental = 0; setEntityAnimation(e, "STAND"); self->flags |= LIMIT_TO_SCREEN; initBossHealthBar(); self->takeDamage = &takeDamage; self->action = &attackFinished; checkToMap(self); becomeTransparent(); setEntityAnimation(self, "STAND"); addScythe(); }
static void finalAttackInit() { Target *t; t = getTargetByName("SORCEROR_MID_TARGET"); if (t == NULL) { showErrorAndExit("Sorceror cannot find target"); } addParticleExplosion(self->x + self->w / 2, self->y + self->h / 2); self->x = t->x; self->y = t->y; playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); self->flags |= NO_DRAW; self->thinkTime = 30; self->action = &finalAttack; self->mental = 0; hover(); }
static void flameWaveDropInit() { Target *t; setEntityAnimation(self, "ATTACK_3"); playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); addParticleExplosion(self->x + self->w / 2, self->y + self->h / 2); self->flags |= NO_DRAW; t = getTargetByName("SORCEROR_TOP_TARGET"); if (t == NULL) { showErrorAndExit("Sorceror cannot find target"); } self->y = t->y; self->thinkTime = 60; self->action = &flameWaveDrop; }
static void changeToFireInit() { int startX; Target *t; startX = getMapStartX() + SCREEN_WIDTH / 2; t = getTargetByName(self->x < startX ? "CAVE_BOSS_TARGET_LEFT" : "CAVE_BOSS_TARGET_RIGHT"); if (t == NULL) { showErrorAndExit("Cave Boss cannot find target"); } self->targetX = t->x; self->targetY = t->y; if (self->x != self->targetX && self->y != self->targetY) { t = getTargetByName("CAVE_BOSS_TARGET_TOP"); if (t == NULL) { showErrorAndExit("Cave Boss cannot find target"); } self->targetY = t->y; if (self->y > self->targetY) { setEntityAnimation(self, "NORMAL_WALK_UP"); } self->dirX = 0; self->dirY = -self->speed; self->action = &moveToTarget; self->resumeNormalFunction = &changeToFire; } else { self->action = &changeToFire; } }
static Target *getCenterTarget() { Target *t = getTargetByName("BLOB_TARGET"); if (t == NULL) { showErrorAndExit("Blob Boss could not find target"); } return t; }
static void blueDieInit() { Target *t; self->touch = NULL; self->maxThinkTime++; switch (self->maxThinkTime) { case 2: t = getTargetByName("BLUE_BOOK_TARGET_1"); activateEntitiesWithRequiredName("BLUE_BOOK_STAGE_1", TRUE); self->action = &blueDie; break; default: t = getTargetByName("BLUE_BOOK_TARGET_2"); activateEntitiesWithRequiredName("BLUE_BOOK_STAGE_2", TRUE); self->action = &blueDie; break; } if (t == NULL) { showErrorAndExit("Blue Book cannot find target"); } self->startX = self->x; self->startY = 0; self->targetX = t->x; self->targetY = t->y; self->thinkTime = 60; }
static void phantasmalBoltInit() { Target *t; if (prand() % 2 == 0) { t = getTargetByName("AZRIEL_LEFT_TARGET"); self->face = RIGHT; } else { t = getTargetByName("AZRIEL_RIGHT_TARGET"); self->face = LEFT; } if (t == NULL) { showErrorAndExit("Azriel cannot find target"); } self->targetX = t->x; self->targetY = t->y; calculatePath(self->x, self->y, self->targetX, self->targetY, &self->dirX, &self->dirY); self->dirX *= self->speed; self->dirY *= self->speed; self->action = &phantasmalBoltMoveToTarget; checkToMap(self); becomeTransparent(); }
static void followTargets() { Target *t; char name[MAX_VALUE_LENGTH]; checkToMap(self); if (fabs(self->x - self->startX) <= fabs(self->dirX) && fabs(self->y - self->startY) <= fabs(self->dirY)) { self->x = self->startX; self->y = self->startY; self->thinkTime++; if (self->thinkTime > self->maxThinkTime) { self->thinkTime = 0; } self->dirX = 0; self->dirY = 0; } if (self->dirX == 0 && self->dirY == 0) { snprintf(name, sizeof(name), "%s_TARGET_%d", self->objectiveName, self->thinkTime); t = getTargetByName(name); if (t == NULL) { showErrorAndExit("Could not find target ", name); } self->startX = t->x; self->startY = t->y; if (self->x != self->startX) { self->dirX = self->startX < self->x ? -self->speed : self->speed; } if (self->y != self->startY) { self->dirY = self->startY < self->y ? -self->speed : self->speed; } } }
static void raiseDead() { char targetName[MAX_VALUE_LENGTH]; Target *t; Entity *e; self->thinkTime--; if (self->thinkTime <= 0) { snprintf(targetName, MAX_VALUE_LENGTH, "GRAVE_%c", self->description[self->mental]); t = getTargetByName(targetName); if (t == NULL) { showErrorAndExit("Azriel cannot find target"); } e = addEnemy("enemy/zombie", t->x, t->y); e->y = getMapFloor(self->x + self->w / 2, self->y); e->startX = e->x; e->startY = e->y - e->h; e->endY = e->y; e->thinkTime = 15 + prand() % 105; self->mental--; if (self->mental <= 0) { self->thinkTime = 30; self->action = &raiseDeadFinish; } } checkToMap(self); becomeTransparent(); }
static void eatAttackInit() { Target *t = getTargetByName("CHAOS_EAT_TARGET"); if (t == NULL) { showErrorAndExit("Chaos cannot find target"); } self->thinkTime = 60; self->action = &eatAttack; self->targetX = t->x; self->maxThinkTime--; checkToMap(self); }
static void initialise() { Target *t; self->flags |= NO_DRAW; if (self->active == TRUE) { if (cameraAtMinimum()) { createBody(); centerMapOnEntity(NULL); t = getTargetByName("SNAKE_BOSS_TARGET_RIGHT"); if (t == NULL) { showErrorAndExit("Snake boss cannot find target"); } setSnakePosition(t->x, t->y); self->targetY = self->y - 64; self->thinkTime = 60; self->face = LEFT; self->flags |= LIMIT_TO_SCREEN; self->action = &riseUp; playDefaultBossMusic(); initBossHealthBar(); setContinuePoint(FALSE, self->name, NULL); } } }
static void ceilingBurnInit() { Target *t = getTargetByName("CAVE_BOSS_TARGET_TOP"); if (t == NULL) { showErrorAndExit("Cave Boss cannot find target"); } self->targetX = t->x; self->targetY = t->y; self->dirY = -self->speed; if (self->y > self->targetY) { setEntityAnimation(self, "FIRE_WALK_UP"); } self->action = &ceilingBurnMoveToTop; }
static void dieShudder() { Target *t; self->x = self->startX + sin(DEG_TO_RAD(self->targetY)) * 4; self->targetY += 90; if (self->targetY >= 360) { self->targetY = 0; } self->thinkTime--; if (self->thinkTime <= 0) { self->flags |= NO_DRAW; addParticleExplosion(self->x + self->w / 2, self->y + self->h / 2); playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); t = getTargetByName("AZRIEL_TOP_TARGET"); if (t == NULL) { showErrorAndExit("Azriel cannot find target"); } self->x = t->x; self->y = self->startY; self->action = &dieMoveToTop; self->thinkTime = 60; self->mental = 0; } }
static void teleportPlayerOffscreen(Entity *other) { Target *t; t = getTargetByName("SORCEROR_PLAYER_TARGET"); if (t == NULL) { showErrorAndExit("Sorceror cannot find target"); } player.targetX = t->x; player.targetY = t->y; calculatePath(player.x, player.y, player.targetX, player.targetY, &player.dirX, &player.dirY); player.flags |= (NO_DRAW|HELPLESS|TELEPORTING); playSoundToMap("sound/common/spell", EDGAR_CHANNEL, self->x, self->y, 0); self->inUse = FALSE; }
static void punch2AttackInit() { Target *t; t = getCenterTarget(); self->startX = t->x; t = getTargetByName(player.x < self->x ? "BLOB_TARGET_LEFT" : "BLOB_TARGET_RIGHT"); if (t == NULL) { showErrorAndExit("Blob Boss could not find target"); } self->endX = t->x; self->targetY = self->y + self->h; self->layer = BACKGROUND_LAYER; self->action = &punch2Sink; }
static void teleportAway() { int rand; Target *t; self->thinkTime--; if (self->thinkTime <= 0) { rand = prand() % 2; t = getTargetByName(rand == 0 ? "SORCEROR_LEFT_TARGET" : "SORCEROR_RIGHT_TARGET"); if (t == NULL) { showErrorAndExit("Sorceror cannot find target"); } playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); addParticleExplosion(self->x + self->w / 2, self->y + self->h / 2); self->flags |= NO_DRAW|FLY; self->x = t->x; self->y = t->y; self->face = rand == 0 ? RIGHT : LEFT; self->action = &teleportAwayFinish; self->thinkTime = 30; } checkToMap(self); }
static void fireballAttackInit() { Target *t = getTargetByName((prand() % 2 == 0) ? "AWESOME_TARGET_LEFT" : "AWESOME_TARGET_RIGHT"); if (t == NULL) { showErrorAndExit("Awesome Boss cannot find target"); } self->x = t->x + (prand() % 16) * (prand() % 2 == 0 ? 1 : -1); self->y = t->y; facePlayer(); playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); self->flags &= ~NO_DRAW; addParticleExplosion(self->x + self->w / 2, self->y + self->h / 2); self->action = &fireballAttack; self->touch = &entityTouch; self->thinkTime = -1; }
static void soulSteal() { Target *t; setCustomAction(&player, &stickToFloor, 3, 0, 0); self->thinkTime--; player.x = self->targetX; self->maxThinkTime += self->mental; if (self->maxThinkTime > 255) { self->maxThinkTime = 255; self->mental *= -1; } else if (self->maxThinkTime < 0) { self->maxThinkTime = 0; self->mental *= -1; } player.alpha = self->maxThinkTime; if (self->thinkTime <= 0) { self->flags |= NO_DRAW; addParticleExplosion(self->x + self->w / 2, self->y + self->h / 2); playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); t = getTargetByName("AZRIEL_TOP_TARGET"); if (t == NULL) { showErrorAndExit("Azriel cannot find target"); } self->x = t->x; self->y = t->y; self->head->health++; self->head->alpha = self->head->health * 64; if (self->head->alpha > 255) { self->head->alpha = 255; } self->head->thinkTime = self->head->maxThinkTime; self->head->mental = 0; player.alpha = self->targetY; player.alpha -= 64; if (player.alpha <= 0) { player.alpha = 0; player.thinkTime = 600; player.health = 0; setPlayerLocked(TRUE); } self->thinkTime = 30; self->action = &soulStealFinish; } checkToMap(self); becomeTransparent(); }
static void spitMoveToTarget() { Target *t; checkToMap(self); if (self->dirY < 0 && self->y <= self->targetY) { self->y = self->targetY; self->dirY = 0; self->face = self->targetX < self->x ? LEFT : RIGHT; self->dirX = self->face == LEFT ? -self->speed : self->speed; switch ((int)self->endX) { case 1: setEntityAnimation(self, "FIRE_WALK"); break; case 2: setEntityAnimation(self, "ICE_WALK"); break; default: setEntityAnimation(self, "NORMAL_WALK"); break; } } else if ((self->dirX < 0 && self->x <= self->targetX) || (self->dirX > 0 && self->x >= self->targetX)) { t = getTargetByName(self->dirX < 0 ? "CAVE_BOSS_TARGET_LEFT" : "CAVE_BOSS_TARGET_RIGHT"); if (t == NULL) { showErrorAndExit("Cave Boss cannot find target"); } self->x = self->targetX; self->targetY = t->y; self->face = self->dirX < 0 ? RIGHT : LEFT; self->dirX = 0; self->dirY = self->speed; switch ((int)self->endX) { case 1: setEntityAnimation(self, "FIRE_WALK_UP"); break; case 2: setEntityAnimation(self, "ICE_WALK_UP"); break; default: setEntityAnimation(self, "NORMAL_WALK_UP"); break; } } else if (self->dirY > 0 && self->y >= self->targetY) { self->dirY = 0; self->y = self->targetY; switch ((int)self->endX) { case 1: setEntityAnimation(self, "FIRE_ATTACK"); self->action = &spitFire; break; case 2: setEntityAnimation(self, "ICE_ATTACK"); self->action = &spitIce; break; default: setEntityAnimation(self, "NORMAL_ATTACK"); self->action = &spitAcid; break; } facePlayer(); self->mental = 3 + prand() % 3; self->thinkTime = 30; } }
static void soulStealMoveToPlayer() { int mid; Entity *e; Target *t; self->thinkTime--; if (self->thinkTime <= 0) { setEntityAnimation(self, "SOUL_STEAL"); self->flags &= ~NO_DRAW; t = getTargetByName("AZRIEL_LEFT_TARGET"); if (t == NULL) { showErrorAndExit("Azriel cannot find target"); } mid = getMapStartX() + SCREEN_WIDTH / 2; self->x = player.x < mid ? player.x + player.w + 24 : player.x - self->w - 24; self->y = t->y; self->targetX = player.x; setCustomAction(&player, &stickToFloor, 3, 0, 0); facePlayer(); addParticleExplosion(self->x + self->w / 2, self->y + self->h / 2); playSoundToMap("sound/common/spell", -1, self->x, self->y, 0); self->action = &soulSteal; self->thinkTime = 600; self->maxThinkTime = player.alpha; self->targetY = player.alpha; self->mental = -3; e = getFreeEntity(); if (e == NULL) { showErrorAndExit("No free slots to add the Soul Steal Spell"); } loadProperties("boss/azriel_soul_steal_spell", e); setEntityAnimation(e, "STAND"); e->face = self->face; if (self->face == LEFT) { e->x = self->x + self->w - e->w - e->offsetX; } else { e->x = self->x + e->offsetX; } e->y = self->y + e->offsetY; e->action = &soulStealSpellAttack; e->startX = e->x; e->startY = e->y; e->head = self; e->endX = player.x + player.w / 2; e->endY = player.y + player.h / 2; e->draw = &drawSoulStealSpell; e->flags &= ~NO_DRAW; } checkToMap(self); becomeTransparent(); }
int patchEntities(double versionFile, char *mapName) { char patchFile[MAX_PATH_LENGTH], *line, *savePtr, itemName[MAX_VALUE_LENGTH]; char key[MAX_VALUE_LENGTH], value[MAX_VALUE_LENGTH]; int skipping = FALSE, x, y, read, found, saveMap; unsigned char *buffer; Entity *e; EntityList *el, *entities; Target *t; savePtr = NULL; snprintf(patchFile, sizeof(patchFile), "data/patch/%0.2f.dat", versionFile); saveMap = TRUE; if (existsInPak(patchFile) == TRUE) { buffer = loadFileFromPak(patchFile); line = strtok_r((char *)buffer, "\n", &savePtr); while (line != NULL) { if (line[strlen(line) - 1] == '\n') { line[strlen(line) - 1] = '\0'; } if (line[strlen(line) - 1] == '\r') { line[strlen(line) - 1] = '\0'; } sscanf(line, "%s", itemName); if (strcmpignorecase(itemName, "MAP_NAME") == 0) { sscanf(line, "%*s %s\n", itemName); skipping = strcmpignorecase(itemName, mapName) == 0 ? FALSE : TRUE; } else if (strcmpignorecase(itemName, "MODIFY_OBJECTIVE") == 0 && skipping == FALSE) { sscanf(line, "%*s \"%[^\"]\" \"%[^\"]\"", key, value); modifyObjective(key, value); } else if (strcmpignorecase(itemName, "REMOVE_OBJECTIVE") == 0 && skipping == FALSE) { sscanf(line, "%*s \"%[^\"]\"", key); removeObjective(key); } else if (strcmpignorecase(itemName, "REMOVE_TRIGGER") == 0 && skipping == FALSE) { sscanf(line, "%*s \"%[^\"]\"", key); removeGlobalTrigger(key); removeTrigger(key); } else if (strcmpignorecase(line, "ADD_ENTITY") == 0 && skipping == FALSE) { loadResources(savePtr); } else if (strcmpignorecase(itemName, "REMOVE_ENTITY") == 0 && skipping == FALSE) { read = sscanf(line, "%*s %s %d %d", itemName, &x, &y); found = FALSE; e = getEntityByObjectiveName(itemName); if (e != NULL) { e->inUse = FALSE; found = TRUE; } if (found == FALSE) { t = getTargetByName(itemName); if (t != NULL) { t->active = FALSE; found = TRUE; } } if (found == FALSE && read == 3) { e = getEntityByStartXY(x, y); if (e != NULL) { e->inUse = FALSE; found = TRUE; } } } else if (strcmpignorecase(itemName, "UPDATE_ENTITY") == 0 && skipping == FALSE) { read = sscanf(line, "%*s %s %s %s", itemName, key, value); if (strcmpignorecase(itemName, "PLAYER") == 0) { e = &player; } else { e = getEntityByObjectiveName(itemName); } if (e != NULL) { if (strcmpignorecase(value, "NULL") == 0) { STRNCPY(value, "", sizeof(value)); } setProperty(e, key, value); } } else if (strcmpignorecase(itemName, "UPDATE_ENTITY_BY_START") == 0 && skipping == FALSE) { read = sscanf(line, "%*s %d %d %s %[^\n]s", &x, &y, key, value); e = getEntityByStartXY(x, y); if (e != NULL) { setProperty(e, key, value); } } else if (strcmpignorecase(itemName, "UPDATE_ENTITY_BY_XY") == 0 && skipping == FALSE) { read = sscanf(line, "%*s %d %d %s %[^\n]s", &x, &y, key, value); e = getEntityByXY(x, y); if (e != NULL) { setProperty(e, key, value); } } else if (strcmpignorecase(itemName, "TRANSLATE_ENTITIES") == 0 && skipping == FALSE) { read = sscanf(line, "%*s %d %d", &x, &y); entities = getEntities(); player.x -= x; player.y -= y; for (el=entities->next;el!=NULL;el=el->next) { e = el->entity; e->x -= x; e->y -= y; if (e->startX - x > 0) { e->startX -= x; } if (e->startY - y > 0) { e->startY -= y; } if (e->endX - x > 0) { e->endX -= x; } if (e->endY - y > 0) { e->endY -= y; } } t = getTargets(); for (x=0;x<MAX_TARGETS;x++) { if (t[x].active == TRUE) { if (t[x].x - x > 0) { t[x].x -= x; } if (t[x].y - y > 0) { t[x].y -= y; } } } } else if (strcmpignorecase(itemName, "RENAME_MAP") == 0 && skipping == FALSE) { saveMap = FALSE; } line = strtok_r(NULL, "\n", &savePtr); } free(buffer); } return saveMap; }