MapPathFinderGraph *ComputerCharacter::searchMyPathes() { const int my_index = field->getMap()->getTileIndex(getMapTile()); MapPathFinderGraph *path = field->getCurrentFinder()->getGraph(); path->nodes[my_index].distance = 1; // set individual scores for (int i = 0; i < path->nodes_count; i++) { // destructible brics // to left from i-tile for (int d = 1; d <= this->power(); d++) { MapTile *t = field->getMap()->getTile(i - d); if (t == NULL || t->type() == MapTile::Tile_Wall || path->nodes[i-d].explosive) // dont place more bomb that needed break; if (t->type() == MapTile::Tile_Brick) { path->nodes[i].score_place_bomb += 50; break; } } // to right from i-tile for (int d = 1; d <= this->power(); d++) { MapTile *t = field->getMap()->getTile(i + d); if (t == NULL || t->type() == MapTile::Tile_Wall || path->nodes[i+d].explosive) break; if (t->type() == MapTile::Tile_Brick) { path->nodes[i].score_place_bomb += 50; break; } } // up from i-tile for (int d = 1; d <= this->power(); d++) { MapTile *t = field->getMap()->getTile(i - d*field->getMap()->getCols()); if (t == NULL || t->type() == MapTile::Tile_Wall || path->nodes[i - d*field->getMap()->getCols()].explosive) break; if (t->type() == MapTile::Tile_Brick) { path->nodes[i].score_place_bomb += 50; break; } } // down from i-tile for (int d = 1; d <= this->power(); d++) { MapTile *t = field->getMap()->getTile(i + d *field->getMap()->getCols()); if (t == NULL || t->type() == MapTile::Tile_Wall || path->nodes[i + d*field->getMap()->getCols()].explosive) break; if (t->type() == MapTile::Tile_Brick) { path->nodes[i].score_place_bomb += 50; break; } } } // scores for other players and ability to go throught bomb in current tile for(int i = 0; i < field->objectsCount(); i++) { GameObject *object = field->object(i); int obj_map_index = field->getMap()->getTileIndex(object->getMapTile()); if (object != this && object->type == PLAYER && !static_cast<Character *>(object)->isDead()) { path->nodes[obj_map_index].score_place_bomb += 250; // tiles around // left for (int d = 1; d <= bombsPower; d++) { MapTile *tile = field->getMap()->getTile(obj_map_index-d); if (tile != NULL && tile->absorbExplosionFake() == MapTile::Absorbtion_None) { // score is greater than directly on object because here cannot go throught bomb path->nodes[obj_map_index-d].score_place_bomb += 400 - (d * 20); } else break; } // right for (int d = 1; d <= bombsPower; d++) { MapTile *tile = field->getMap()->getTile(obj_map_index+d); if (tile != NULL && tile->absorbExplosionFake() == MapTile::Absorbtion_None) { path->nodes[obj_map_index+d].score_place_bomb += 400 - (d*20); } else break; } // down for (int d = 1; d <= bombsPower; d++) { MapTile *tile = field->getMap()->getTile(obj_map_index+d*field->getMap()->getCols()); if (tile != NULL && tile->absorbExplosionFake() == MapTile::Absorbtion_None) { path->nodes[obj_map_index+d*field->getMap()->getCols()].score_place_bomb += 400 - d*20; } else break; } // up for (int d = 1; d <= bombsPower; d++) { MapTile *tile = field->getMap()->getTile(obj_map_index-d*field->getMap()->getCols()); if (tile != NULL && tile->absorbExplosionFake() == MapTile::Absorbtion_None) { path->nodes[obj_map_index-d*field->getMap()->getCols()].score_place_bomb += 400 - d*20; } else break; } } else if (object->type == BOMB && object->objectRect().intersects(this->objectRect())) { path->nodes[obj_map_index].is_accessible = true; } } field->getCurrentFinder()->searchPathes(path); return path; }