forked from townforge/townforge
cc: add adjecent squares calc
I'm sure it'll come handy soon
This commit is contained in:
parent
a6b50d309c
commit
b9146035de
@ -204,4 +204,24 @@ uint32_t calculate_influence(uint8_t role, const uint32_t cumulative_influence[N
|
||||
return score;
|
||||
}
|
||||
|
||||
// assumes non intersection
|
||||
uint32_t connection_squares(uint32_t ax0, uint32_t ay0, uint32_t ax1, uint32_t ay1, uint32_t bx0, uint32_t by0, uint32_t bx1, uint32_t by1)
|
||||
{
|
||||
// left or right
|
||||
if (ax1 + 1 == bx0 || bx1 + 1 == ax0)
|
||||
{
|
||||
const uint32_t maxy = std::min(ay1, by1);
|
||||
const uint32_t miny = std::max(ay0, by0);
|
||||
return maxy >= miny ? maxy - miny + 1 : 0;
|
||||
}
|
||||
// top or bottom
|
||||
if (by1 + 1 == ay0 || ay1 + 1 == by0)
|
||||
{
|
||||
const uint32_t maxx = std::min(ax1, bx1);
|
||||
const uint32_t minx = std::max(ax0, bx0);
|
||||
return maxx >= minx ? maxx - minx + 1 : 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -84,4 +84,6 @@ namespace cc
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t connection_squares(uint32_t ax0, uint32_t ay0, uint32_t ax1, uint32_t ay1, uint32_t bx0, uint32_t by0, uint32_t bx1, uint32_t by1);
|
||||
}
|
||||
|
@ -2321,6 +2321,58 @@ TEST(cc, distance_percentage)
|
||||
ASSERT_EQ(221, cc::get_distance_percentage(2210, 1000));
|
||||
}
|
||||
|
||||
TEST(cc, connection_squares)
|
||||
{
|
||||
// disjoint
|
||||
ASSERT_EQ(cc::connection_squares(0, 0, 0, 0, 2, 2, 2, 2), 0);
|
||||
|
||||
// corners
|
||||
ASSERT_EQ(cc::connection_squares(1, 1, 1, 1, 2, 2, 2, 2), 0);
|
||||
ASSERT_EQ(cc::connection_squares(1, 1, 1, 1, 2, 2, 2, 2), 0);
|
||||
ASSERT_EQ(cc::connection_squares(2, 1, 2, 1, 1, 2, 1, 2), 0);
|
||||
ASSERT_EQ(cc::connection_squares(1, 2, 1, 2, 2, 1, 2, 1), 0);
|
||||
|
||||
// full tile
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 1, 2, 1, 2), 1);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 2, 1, 2, 1), 1);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 2, 3, 2, 3), 1);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 3, 2, 3, 2), 1);
|
||||
|
||||
// one tile in the middle
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 1, 1, 1, 3), 1);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 1, 1, 3, 1), 1);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 1, 3, 3, 3), 1);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 3, 1, 3, 3), 1);
|
||||
|
||||
// 0 1 2 3 4 5
|
||||
// . . . . . . 0
|
||||
// . . . . . . 1
|
||||
// . . x x . . 2
|
||||
// . . x x . . 3
|
||||
// . . . . . . 4
|
||||
// . . . . . . 5
|
||||
|
||||
// one tile, corners
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 0, 1, 2), 1);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 0, 2, 1), 1);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 3, 0, 5, 1), 1);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 4, 0, 5, 2), 1);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 3, 1, 5), 1);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 4, 2, 5), 1);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 3, 4, 5, 5), 1);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 4, 3, 5, 5), 1);
|
||||
|
||||
// full 2
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 0, 1, 5), 2);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 0, 5, 1), 2);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 4, 0, 5, 5), 2);
|
||||
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 4, 5, 5), 2);
|
||||
ASSERT_EQ(cc::connection_squares(0, 0, 1, 5, 2, 2, 3, 3), 2);
|
||||
ASSERT_EQ(cc::connection_squares(0, 0, 5, 1, 2, 2, 3, 3), 2);
|
||||
ASSERT_EQ(cc::connection_squares(4, 0, 5, 5, 2, 2, 3, 3), 2);
|
||||
ASSERT_EQ(cc::connection_squares(0, 4, 5, 5, 2, 2, 3, 3), 2);
|
||||
}
|
||||
|
||||
TEST(cc_influence, monotonic)
|
||||
{
|
||||
static const uint8_t potential[] = {0, 80, 105, 180, 255};
|
||||
|
Loading…
Reference in New Issue
Block a user