aboutsummaryrefslogtreecommitdiff
path: root/CreateArtistTileBehavior.cpp
blob: ae0cd7c6d31e1a21384d0bc8ad2bb84d03f67d23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <memory>
#include <random>

#include "CreateArtistTileBehavior.h"
#include "StepTileBehavior.h"
#include "Tile.h"
#include "Museum.h"

using std::uniform_int_distribution;
using std::uniform_real_distribution;
using std::random_device;
using std::mt19937;
using namespace std;

CreateArtistTileBehavior CreateArtistTileBehavior::instance { CreateArtistTileBehavior::type };

random_device dev{};
mt19937 rng(dev());
uniform_int_distribution<int> random_bool(0, 1);
uniform_real_distribution<float> random_float(-1, 1);

void CreateArtistTileBehavior::update(Tile & tile) {
	unsigned int new_artists = this->interactions - this->last_interactions;
	this->last_interactions = this->interactions;

	for (unsigned int i = 0; i < new_artists; i++) {
		if (i >= 2) break;
		ArtistData new_data = {
			.x = static_cast<float>(tile.data.x),
			.y = static_cast<float>(tile.data.y),
		};
		float velocity = random_float(rng);
		random_bool(rng) ? new_data.vx = velocity : new_data.vy = velocity;
		this->museum->people.add_artist(new_data);
	}

	if (this->interactions < 2) return;
	tile.set_type(StepTileBehavior::type);
}

unique_ptr<TileBehavior> CreateArtistTileBehavior::clone(Museum & museum) {
	auto instance = new CreateArtistTileBehavior();
	instance->museum = &museum;
	return unique_ptr<TileBehavior>(instance);
}