Пример #1
0
		void generateMaze(Maze & maze)
		{
			initialize(maze);

			// first line (y==2)
			for ( int x = 2, y = 2 ; x < maze.GetSizeX() - 2 ; x += 2 )
			{
				int direction;
				for ( direction = rand() % 4 ;
						IsWall(maze, x, y, direction) ;
						direction = rand() % 4 )
				{
				}
				SetWall(maze, x, y, direction);
			}

			// other lines (y!=2)
			for ( int y = 4 ; y < maze.GetSizeY() - 2; y += 2 )
			{
				for ( int x = 2 ; x < maze.GetSizeX() - 2; x += 2 )
				{
					int direction;
					for ( direction = rand() % 3 + 1 ;
							IsWall(maze, x, y, direction) ;
							direction = rand() % 3 + 1 )
					{
					}
					SetWall(maze, x, y, direction);
				}
			}
		}
//! set walls based on "-monotone-at-punctuation" flag
void ReorderingConstraint::SetMonotoneAtPunctuation( const Phrase &sentence )
{
  for( size_t i=0; i<sentence.GetSize(); i++ ) {
    const Word& word = sentence.GetWord(i);
    if (word[0]->GetString() == "," ||
        word[0]->GetString() == "." ||
        word[0]->GetString() == "!" ||
        word[0]->GetString() == "?" ||
        word[0]->GetString() == ":" ||
        word[0]->GetString() == ";" ||
        word[0]->GetString() == "\"") {
      // set wall before and after punc, but not at sentence start, end
      if (i>0 && i<m_size-1) SetWall( i, true );
      if (i>1)               SetWall( i-1, true );
    }
  }
}
Пример #3
0
Map::Map(const int width, const int height, char* mapData)
{
	Map::map = this;
	unsigned int start = clock();

	this->Width = width;
	this->Height = height;
	Noise* noiser = new Noise((unsigned int)time(NULL));

	heightMap = new int[width];
	for (int i = 0; i < Width; i++) {
		heightMap[i] = (int) (noiser->eval(i / 20.0f) * Height);
	}

	walls = new Wall*[Width];
	for (int i = 0; i < Width; i++) {
		walls[i] = new Wall[Height];
		for (int j = 0; j < Height; j++) {
			walls[i][j].Id = 0;
		}
	}
	blocks = new Tile*[Width];
	for (int i = 0; i < Width; i++) {
		blocks[i] = new Tile[Height];
	}

	if (!Settings::Multiplayer)
	{

		for (int i = 0; i < Width; i++) {
			int top = heightMap[i];
			for (int j = 0; j < Height; j++) {
				walls[i][j].Id = Block::Dirt->Id;
				if (rand() % 101 > 50 || true || j > top && j < top + 3)
					blocks[i][j].Id = Block::Dirt->Id;
			}
		}
		for (int i = 0; i < Width; i++) {
			int top = heightMap[i];
			for (int j = 0; j <= top; j++) {
				walls[i][j].Id = 0;
				blocks[i][j].Id = 0;
			}
		}
		printf("World tiles fill: %d ms. \n", clock() - start);
		start = clock();

		/*for (int i = 0; i < 0; i++)
			CelluarAuto(Height, i);*/

		printf("Celluar Auto: %d ms. \n", clock() - start);
		start = clock();

		int k = 0;
		while (k < 100)
		{
			int i = rand() % Width;
			int j = rand() % height;
			if (GetBlock(i, j) == 0)
				continue;
			k += GenerateVein(i, j, Block::Stone->Id, 5);
		}

		printf("Veins generation: %d ms. \n", (clock() - start));
	}
	else
	{
		for (int i = 0; i < Width; i++) {
			for (int j = 0; j < Height; j++) {
				blocks[i][j].Id = mapData[i + j * width];
			}
		}
	}


	start = clock();
	
	for (int i = 0; i < Width; i++) {
		for (int j = 0; j < Height; j++) {
			if (blocks[i][j].Id != 0)
				blocks[i][j].connectionIndex = GetConnectionIndex(i, j);
		}
	}
	for (int i = 0; i < Width; i++) {
		for (int j = 0; j < Height; j++) {
			if (walls[i][j].Id != 0)
				walls[i][j].connectionIndex = GetConnectionIndex(i, j, true);
		}
	}
	printf("Tiles connections: %d ms. \n", clock() - start);
	start = clock();

	for (int i = 0; i < Width; i++) {
		for (int j = 0; j < Height; j++) {
			if (blocks[i][j].Id == 0 && walls[i][j].Id == 0)
			{
				blocks[i][j].lightSource = MAX_LIGHT;
				if (NearLive(i, j, 1) == 0)
					blocks[i][j].lightValue = MAX_LIGHT;
			}
		}
	}

	minX = 0;
	minY = 0;
	maxX = width;
	maxY = height;
	CalculateLights(true);

	printf("Lights calculations: %d ms. \n", clock() - start);
	start = clock();

	player = new Player();
	Respawn();
	entities.push_back(player);

	int water_count = 3;
	int water_x = (int)player->GetPosition().x;
	int water_y = GetTop(water_x);
	for (int i = water_x - 2; i < water_x + 2; i++)
	{
		for (int j = water_y; j < water_y + 2; j++)
		{
			SetBlock(i, j, 0);
			SetWall(i, j, 0);
			for (int k = 0; k < water_count; k++)
			{
				for (int l = 0; l < water_count; l++)
				{
					Water* water = new Water();
					water->SetPosition(glm::vec2(i + k * (1 / (float)water_count), j + l * (1 / (float)water_count)));
					waters.push_back(water);
					entities.push_back(water);
				}
			}
		}
	}
	



	skyManager = new SkyManager(this->Width);
}