Ejemplo n.º 1
0
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;
}