+ }
+ }
+
+ // left
+ for (int y = e.hbox.Top(), x = e.hbox.Left(),
+ end = std::ceil(e.hbox.Bottom()); y < end; ++y) {
+ const Tile &tile = TileAt(Vector<int>(x, y));
+ if (tile.IsSolid()) {
+ response.x = x + 1 - e.hbox.Left();
+ e.vel.x = 0;
+ break;
+ }
+ }
+
+ // right
+ for (int y = e.hbox.Top(), x = e.hbox.Right(),
+ end = std::ceil(e.hbox.Bottom()); y < end; ++y) {
+ const Tile &tile = TileAt(Vector<int>(x, y));
+ if (tile.IsSolid()) {
+ response.x = x - e.hbox.Right();
+ e.vel.x = 0;
+ break;
+ }
+ }
+
+ if (response.x > fixSpeed * dt) {
+ response.x = fixSpeed * dt;
+ } else if (response.x < -fixSpeed * dt) {
+ response.x = -fixSpeed * dt;
+ }
+ if (response.y > fixSpeed * dt) {
+ response.y = fixSpeed * dt;
+ } else if (response.y < -fixSpeed * dt) {
+ response.y = -fixSpeed * dt;
+ }
+ e.Move(response);
+}
+
+void World::EntityCollision() {
+ if (entities.size() <= 1) return;
+
+ auto firstEnd(entities.end());
+ --firstEnd;
+ for (auto first(entities.begin()); first != firstEnd; ++first) {
+ auto second(first);
+ ++second;
+ for (auto secondEnd(entities.end()); second != secondEnd; ++second) {
+ if (first->bounds.Intersects(second->bounds)) {
+ // damage + knockback