void get_best_way(t_paths **path, t_map *map) { float best_len; float len; int best_way; int i; best_way = 0; for (i = 0; (*path)->neighboors[i] != NULL; i++); if (i == 1) best_way = 0; else for (i = 0; (*path)->neighboors[i] != NULL; i++) { if (((*path)->neighboors[i])->pos[0] == map->fortress_pos[0] && ((*path)->neighboors[i])->pos[1] == map->fortress_pos[1]) { best_len = 1; best_way = i; } else if (i == 0) { best_len = pathfinding((*path)->neighboors[i], map); best_way = i; } else if ((distance(((*path)->neighboors[i])->pos, map->fortress_pos)) < best_len) if ((len = pathfinding((*path)->neighboors[i], map)) < best_len && len != -1) { best_len = len; best_way = i; } } (*path)->best_way[0] = (*path)->neighboors[best_way]->pos[0]; (*path)->best_way[1] = (*path)->neighboors[best_way]->pos[1]; }
t_coord *get_path(t_engine *e, t_entity *t, t_coord g) { t_coord *res; t_path *path; t_path *next; int i; res = (t_coord*)xmalloc(sizeof(*res) * e->map_data.w * e->map_data.h + 1); i = 0; path = pathfinding(e, t, &g); if (!path) { free(res); return (0); } while (path) { next = path->next; res[i].x = path->x; res[i].y = path->y; i++; free(path); path = next; } res[i].x = -1; res[i].y = -1; return (res); }
int pathfinding(char ***map, t_pos dst, t_pos pos, char c) { char tmp; if (pos.x == dst.x && pos.y == dst.y) return (1); else if (pos.x < 0 || pos.y < 0) return (0); else if ((*map)[pos.y][pos.x] == 'X' || (*map)[pos.y][pos.x] == c) return (0); tmp = (*map)[pos.y][pos.x]; (*map)[pos.y][pos.x] = c; if (pathfinding(map, dst, new_pos(pos.x, pos.y + 1), c)) return (1); if (pathfinding(map, dst, new_pos(pos.x + 1, pos.y), c)) return (1); if (pathfinding(map, dst, new_pos(pos.x, pos.y - 1), c)) return (1); if (pathfinding(map, dst, new_pos(pos.x - 1, pos.y), c)) return (1); (*map)[pos.y][pos.x] = tmp; return (0); }
void GameStatePlay::update() { //enemy.moveRight = true; //enemy.setSpeedX(10); for(int i = 0; i < Entity::entityList.size(); i++) { if(!Entity::entityList[i]) continue; if(Entity::entityList[i]->type == Entity::ENTITYTYPE_ENEMY && (!Entity::entityList[i]->nextTile && Entity::entityList[i]->curTile) && Entity::entityList[i]->nextReached == true) { //if(Entity::entityList[i]->type == Entity::ENTITYTYPE_ENEMY && Entity::entityList[i]->nextReached == true) { printf("\rPATHFINDING FOR %f, %f with id %i type %i place %i\r", Entity::entityList[i]->x, Entity::entityList[i]->y, Entity::entityList[i]->id, Entity::entityList[i]->type, i); pathfinding(Entity::entityList[i]); } //printf("pathfinding1 %i type %i\r", Entity::entityList[i]->getId(), Entity::entityList[i]->type); /*else if(Entity::entityList[i]->type == Entity::ENTITYTYPE_ENEMY && Entity::entityList[i]->nextTile && Entity::entityList[i]->curTile) if(Entity::entityList[i]->nextTile->tileID < 0 && Entity::entityList[i]->curTile->tileID != Entity::entityList[i]->nextTile->tileID) pathfinding(Entity::entityList[i]); //printf("pathfinding2 %i type %i\r", Entity::entityList[i]->getId(), Entity::entityList[i]->type);*/ Entity::entityList[i]->update(); } // Collisions for(int i = 0; i < CollisionHandler::entityColQueue.size(); i++) { Entity* entityA = CollisionHandler::entityColQueue[i].entityA; Entity* entityB = CollisionHandler::entityColQueue[i].entityB; if(entityA == NULL || entityB == NULL) continue; if(entityA->handleCollision(entityB)) { entityB->handleCollision(entityA); } } CollisionHandler::entityColQueue.clear(); if(debugMessages.size() > 0) { for(int i = 0; i < debugMessages.size(); i++) { delete debugMessages[i]; debugMessages[i] = NULL; } debugMessages.clear(); SDL_Color textColor = {255, 255, 255}; char buffer[100]; sprintf(buffer, "Camera: %i, %i", CameraHandler::cameraControl.getX() + WWIDTH/2, CameraHandler::cameraControl.getY() + WHEIGHT/2); debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor)); sprintf(buffer, "Tile: %i, %i", mouseposX / TILE_SIZE, mouseposY / TILE_SIZE); debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor)); sprintf(buffer, "TileId: %i", MapArea::areaControl.getTileHoveredId()); debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor)); sprintf(buffer, "TileType: %i", MapArea::areaControl.getTileId(MapArea::areaControl.getTileHoveredId())->typeID); debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor)); sprintf(buffer, "Entities: %i", Entity::entityList.size()); debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor)); if(Entity::entityList[1]->nextTile) { sprintf(buffer, "Entity on: %i", MapArea::areaControl.getTileAt(Entity::entityList[1]->x, Entity::entityList[1]->y)->tileID); debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor)); sprintf(buffer, "Entity nextTile: %i", Entity::entityList[1]->nextTile->tileID); debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor)); sprintf(buffer, "Entity turntime: %i", Entity::entityList[1]->turnTime); debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor)); } } }