|
|
@ -48,7 +48,7 @@ namespace embark_assist {
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<display_strings> embark_info;
|
|
|
|
std::vector<display_strings> embark_info;
|
|
|
|
|
|
|
|
|
|
|
|
Screen::Pen region_match_grid[16][16];
|
|
|
|
Screen::Pen local_match_grid[16][16];
|
|
|
|
|
|
|
|
|
|
|
|
pen_column *world_match_grid = nullptr;
|
|
|
|
pen_column *world_match_grid = nullptr;
|
|
|
|
uint16_t match_count = 0;
|
|
|
|
uint16_t match_count = 0;
|
|
|
@ -60,26 +60,38 @@ namespace embark_assist {
|
|
|
|
|
|
|
|
|
|
|
|
//====================================================================
|
|
|
|
//====================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/* // Attempt to replicate the DF logic for sizing the right world map. This
|
|
|
|
// Logic for sizing the World map to the right.
|
|
|
|
// code seems to compute the values correctly, but the author hasn't been
|
|
|
|
|
|
|
|
// able to apply them at the same time as DF does to 100%.
|
|
|
|
|
|
|
|
// DF seems to round down on 0.5 values.
|
|
|
|
|
|
|
|
df::coord2d world_dimension_size(uint16_t available_screen, uint16_t map_size) {
|
|
|
|
df::coord2d world_dimension_size(uint16_t available_screen, uint16_t map_size) {
|
|
|
|
uint16_t result;
|
|
|
|
uint16_t result;
|
|
|
|
|
|
|
|
|
|
|
|
for (uint16_t factor = 1; factor < 17; factor++) {
|
|
|
|
for (uint16_t factor = 1; factor < 17; factor++) {
|
|
|
|
result = map_size / factor;
|
|
|
|
result = ceil (double (map_size - 1) / factor);
|
|
|
|
if ((map_size - result * factor) * 2 != factor) {
|
|
|
|
|
|
|
|
result = (map_size + factor / 2) / factor;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (result <= available_screen) {
|
|
|
|
if (result <= available_screen) {
|
|
|
|
|
|
|
|
if (factor == 1 &&
|
|
|
|
|
|
|
|
map_size <= available_screen) {
|
|
|
|
|
|
|
|
return{ uint16_t(result + 1), factor };
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if ((map_size == 129 && // Weird exceptions where the last row/column goes unused.
|
|
|
|
|
|
|
|
(factor == 6 ||
|
|
|
|
|
|
|
|
factor == 7)) ||
|
|
|
|
|
|
|
|
(map_size == 257 &&
|
|
|
|
|
|
|
|
(factor == 5 ||
|
|
|
|
|
|
|
|
factor == 11 ||
|
|
|
|
|
|
|
|
factor == 12 ||
|
|
|
|
|
|
|
|
factor == 14 ||
|
|
|
|
|
|
|
|
factor == 15))) {
|
|
|
|
|
|
|
|
return{ uint16_t(result - 1), factor };
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
return{ result, factor };
|
|
|
|
return{ result, factor };
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
return{16, 16}; // Should never get here.
|
|
|
|
return{16, 16}; // Should never get here.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
//====================================================================
|
|
|
|
//====================================================================
|
|
|
|
|
|
|
|
|
|
|
|
class ViewscreenOverlay : public df::viewscreen_choose_start_sitest
|
|
|
|
class ViewscreenOverlay : public df::viewscreen_choose_start_sitest
|
|
|
@ -155,6 +167,7 @@ namespace embark_assist {
|
|
|
|
|
|
|
|
|
|
|
|
Screen::Pen pen_lr(' ', COLOR_LIGHTRED);
|
|
|
|
Screen::Pen pen_lr(' ', COLOR_LIGHTRED);
|
|
|
|
Screen::Pen pen_w(' ', COLOR_WHITE);
|
|
|
|
Screen::Pen pen_w(' ', COLOR_WHITE);
|
|
|
|
|
|
|
|
Screen::Pen pen_g(' ', COLOR_GREY);
|
|
|
|
|
|
|
|
|
|
|
|
Screen::paintString(pen_lr, width - 28, 20, DFHack::Screen::getKeyDisplay(df::interface_key::CUSTOM_I).c_str(), false);
|
|
|
|
Screen::paintString(pen_lr, width - 28, 20, DFHack::Screen::getKeyDisplay(df::interface_key::CUSTOM_I).c_str(), false);
|
|
|
|
Screen::paintString(pen_w, width - 27, 20, ": Embark Assistant Info", false);
|
|
|
|
Screen::paintString(pen_w, width - 27, 20, ": Embark Assistant Info", false);
|
|
|
@ -166,6 +179,7 @@ namespace embark_assist {
|
|
|
|
Screen::paintString(pen_w, width - 27, 23, ": Quit Embark Assistant", false);
|
|
|
|
Screen::paintString(pen_w, width - 27, 23, ": Quit Embark Assistant", false);
|
|
|
|
Screen::paintString(pen_w, width - 28, 25, "Matching World Tiles:", false);
|
|
|
|
Screen::paintString(pen_w, width - 28, 25, "Matching World Tiles:", false);
|
|
|
|
Screen::paintString(empty_pen, width - 6, 25, to_string(state->match_count), false);
|
|
|
|
Screen::paintString(empty_pen, width - 6, 25, to_string(state->match_count), false);
|
|
|
|
|
|
|
|
Screen::paintString(pen_g, width - 28, 26, "(Those on the Region Map)", false);
|
|
|
|
|
|
|
|
|
|
|
|
if (height > 25) { // Mask the vanilla DF find help as it's overridden.
|
|
|
|
if (height > 25) { // Mask the vanilla DF find help as it's overridden.
|
|
|
|
Screen::paintString(pen_w, 50, height - 2, " ", false);
|
|
|
|
Screen::paintString(pen_w, 50, height - 2, " ", false);
|
|
|
@ -221,12 +235,24 @@ namespace embark_assist {
|
|
|
|
|
|
|
|
|
|
|
|
for (uint8_t i = 0; i < 16; i++) {
|
|
|
|
for (uint8_t i = 0; i < 16; i++) {
|
|
|
|
for (uint8_t k = 0; k < 16; k++) {
|
|
|
|
for (uint8_t k = 0; k < 16; k++) {
|
|
|
|
if (state->region_match_grid[i][k].ch) {
|
|
|
|
if (state->local_match_grid[i][k].ch) {
|
|
|
|
Screen::paintTile(state->region_match_grid[i][k], i + 1, k + 2);
|
|
|
|
Screen::paintTile(state->local_match_grid[i][k], i + 1, k + 2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t l_width = width - 30 - (ceil(double_t(width) / 2) - 5) + 1; // Horizontal space available for world map.
|
|
|
|
|
|
|
|
uint16_t l_height = height - 8 - 2 + 1; // Vertical space available for world map.
|
|
|
|
|
|
|
|
df::coord2d size_factor_x = world_dimension_size(l_width, world->worldgen.worldgen_parms.dim_x);
|
|
|
|
|
|
|
|
df::coord2d size_factor_y = world_dimension_size(l_height, world->worldgen.worldgen_parms.dim_y);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (uint16_t i = 0; i < world->worldgen.worldgen_parms.dim_x; i++) {
|
|
|
|
|
|
|
|
for (uint16_t k = 0; k < world->worldgen.worldgen_parms.dim_y; k++) {
|
|
|
|
|
|
|
|
if (state->world_match_grid[i][k].ch) {
|
|
|
|
|
|
|
|
Screen::paintTile(state->world_match_grid[i][k], width / 2 - 5 + min(size_factor_x.x - 1, i / size_factor_x.y), 2 + min(size_factor_y.x - 1, k / size_factor_y.y));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
/* // Stuff for trying to replicate the DF right world map sizing logic. Close, but not there.
|
|
|
|
/* // Stuff for trying to replicate the DF right world map sizing logic. Close, but not there.
|
|
|
|
Screen::Pen pen(' ', COLOR_YELLOW);
|
|
|
|
Screen::Pen pen(' ', COLOR_YELLOW);
|
|
|
|
// Boundaries of the top level world map
|
|
|
|
// Boundaries of the top level world map
|
|
|
@ -390,11 +416,11 @@ void embark_assist::overlay::set_mid_level_tile_match(embark_assist::defs::mlt_m
|
|
|
|
for (uint8_t i = 0; i < 16; i++) {
|
|
|
|
for (uint8_t i = 0; i < 16; i++) {
|
|
|
|
for (uint8_t k = 0; k < 16; k++) {
|
|
|
|
for (uint8_t k = 0; k < 16; k++) {
|
|
|
|
if (mlt_matches[i][k]) {
|
|
|
|
if (mlt_matches[i][k]) {
|
|
|
|
state->region_match_grid[i][k] = green_x_pen;
|
|
|
|
state->local_match_grid[i][k] = green_x_pen;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
state->region_match_grid[i][k] = empty_pen;
|
|
|
|
state->local_match_grid[i][k] = empty_pen;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -411,7 +437,7 @@ void embark_assist::overlay::clear_match_results() {
|
|
|
|
|
|
|
|
|
|
|
|
for (uint8_t i = 0; i < 16; i++) {
|
|
|
|
for (uint8_t i = 0; i < 16; i++) {
|
|
|
|
for (uint8_t k = 0; k < 16; k++) {
|
|
|
|
for (uint8_t k = 0; k < 16; k++) {
|
|
|
|
state->region_match_grid[i][k] = empty_pen;
|
|
|
|
state->local_match_grid[i][k] = empty_pen;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|