More taking advantage of the common superclass of cTown and cOutdoors

This commit is contained in:
2023-01-22 14:00:39 -05:00
parent 2539c28fe2
commit c8df04ab04
3 changed files with 51 additions and 81 deletions

View File

@@ -755,7 +755,7 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
change_made = true;
}
else { // MODE_ROOM_RECT
auto& area_descs = editing_town ? town->area_desc : current_terrain->area_desc;
auto& area_descs = cur_area->area_desc;
auto iter = std::find_if(area_descs.begin(), area_descs.end(), [](const info_rect_t& r) {
return r.right == 0;
});
@@ -776,13 +776,12 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
case MODE_SET_WANDER_POINTS:
if(mouse_button_held)
break;
if(!editing_town) {
current_terrain->wandering_locs[mode_count - 1].x = spot_hit.x;
current_terrain->wandering_locs[mode_count - 1].y = spot_hit.y;
}
if(editing_town) {
town->wandering_locs[mode_count - 1].x = spot_hit.x;
town->wandering_locs[mode_count - 1].y = spot_hit.y;
} else {
current_terrain->wandering_locs[mode_count - 1].x = spot_hit.x;
current_terrain->wandering_locs[mode_count - 1].y = spot_hit.y;
}
mode_count--;
switch(mode_count) {
@@ -927,26 +926,26 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
mouse_button_held = true;
break;
case MODE_TOGGLE_SPECIAL_DOT:
if(!editing_town){
if(editing_town){
make_field_type(spot_hit.x, spot_hit.y, SPECIAL_SPOT);
mouse_button_held = true;
} else {
if(!mouse_button_held)
mode_count = !current_terrain->special_spot[spot_hit.x][spot_hit.y];
current_terrain->special_spot[spot_hit.x][spot_hit.y] = mode_count;
mouse_button_held = true;
break;
}
make_field_type(spot_hit.x, spot_hit.y, SPECIAL_SPOT);
mouse_button_held = true;
break;
case MODE_TOGGLE_ROAD:
if(!editing_town){
if(editing_town){
make_field_type(spot_hit.x, spot_hit.y, SPECIAL_ROAD);
mouse_button_held = true;
} else {
if(!mouse_button_held)
mode_count = !current_terrain->roads[spot_hit.x][spot_hit.y];
current_terrain->roads[spot_hit.x][spot_hit.y] = mode_count;
mouse_button_held = true;
break;
}
make_field_type(spot_hit.x, spot_hit.y, SPECIAL_ROAD);
mouse_button_held = true;
break;
case MODE_CLEAR_FIELDS:
for(int i = 8; i <= SPECIAL_ROAD; i++)
@@ -958,9 +957,7 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
mouse_button_held = true;
break;
case MODE_EYEDROPPER:
if(editing_town)
set_new_terrain(town->terrain(spot_hit.x,spot_hit.y));
else set_new_terrain(current_terrain->terrain[spot_hit.x][spot_hit.y]);
set_new_terrain(cur_area->terrain(spot_hit.x,spot_hit.y));
overall_mode = MODE_DRAWING;
break;
case MODE_PLACE_SAME_ITEM:
@@ -984,9 +981,9 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
break;
case MODE_EDIT_SIGN: //edit sign
{
auto& signs = editing_town ? town->sign_locs : current_terrain->sign_locs;
auto& signs = cur_area->sign_locs;
auto iter = std::find(signs.begin(), signs.end(), spot_hit);
short picture = scenario.ter_types[editing_town ? town->terrain(spot_hit.x,spot_hit.y) : current_terrain->terrain[spot_hit.x][spot_hit.y]].picture;
short picture = scenario.ter_types[cur_area->terrain(spot_hit.x,spot_hit.y)].picture;
if(iter != signs.end()) {
edit_sign(*iter, iter - signs.begin(), picture);
} else {
@@ -1010,7 +1007,7 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
break;
case MODE_COPY_SPECIAL: //copy special
{
auto& specials = editing_town ? town->special_locs : current_terrain->special_locs;
auto& specials = cur_area->special_locs;
auto iter = std::find_if(town->special_locs.begin(), town->special_locs.end(), [](const spec_loc_t& loc) {
return loc == spot_hit && loc.spec >= 0;
});
@@ -1027,7 +1024,7 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
cChoiceDlog("not-at-edge").show();
break;
} else {
auto& specials = editing_town ? town->special_locs : current_terrain->special_locs;
auto& specials = cur_area->special_locs;
for(short x = 0; x <= specials.size(); x++) {
if(x == specials.size())
specials.emplace_back(-1,-1,-1);
@@ -1042,7 +1039,7 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
break;
case MODE_ERASE_SPECIAL: //erase special
{
auto& specials = editing_town ? town->special_locs : current_terrain->special_locs;
auto& specials = cur_area->special_locs;
for(short x = 0; x < specials.size(); x++)
if(specials[x] == spot_hit && specials[x].spec >= 0) {
specials[x] = {-1,-1};
@@ -1168,6 +1165,7 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
mouse_button_held = true;
}
auto max_dim = cur_area->max_dim - 5;
// This allows you to see a strip of terrain from the adjacent sector when editing outdoors
if(!editing_town) max_dim++;
if((the_point.in(border_rect[2])) && (cen_y < max_dim)) {
cen_y++;
@@ -1822,11 +1820,11 @@ void change_rect_terrain(rectangle r,ter_num_t terrain_type,short probability,bo
void flood_fill_terrain(location start, ter_num_t terrain_type) {
static const int dx[4] = {0, 1, 0, -1};
static const int dy[4] = {-1, 0, 1, 0};
ter_num_t to_replace = editing_town ? town->terrain(start.x, start.y) : current_terrain->terrain[start.x][start.y];
cArea* cur_area = get_current_area();
ter_num_t to_replace = cur_area->terrain(start.x, start.y);
std::stack<location> to_visit;
std::set<location, loc_compare> visited;
to_visit.push(start);
cArea* cur_area = get_current_area();
while(!to_visit.empty()) {
location this_loc = to_visit.top();
@@ -1895,7 +1893,7 @@ static ter_num_t find_object_part(unsigned char num, short x, short y, ter_num_t
bool terrain_matches(unsigned char x, unsigned char y, ter_num_t ter) {
ter_num_t ter2;
if(editing_town) ter2 = town->terrain(x,y); else ter2 = current_terrain->terrain[x][y];
ter2 = get_current_area()->terrain(x,y);
if(ter2 == ter) return true;
if(scenario.ter_types[ter2].ground_type != scenario.ter_types[ter].ground_type)
return false;
@@ -1948,7 +1946,7 @@ void set_terrain(location l,ter_num_t terrain_type) {
for(int x = -1; x <= 1; x++) {
for(int y = -1; y <= 1; y++) {
location l3(l.x+x,l.y+y);
ter_num_t ter_there = editing_town ? town->terrain(l3.x,l3.y) : current_terrain->terrain[l3.x][l3.y];
ter_num_t ter_there = cur_area->terrain(l3.x,l3.y);
unsigned int ground_there = scenario.ter_types[ter_there].ground_type;
if(ground_there != main_ground && ground_there != trim_ground) {
ter_num_t new_ter = scenario.get_ter_from_ground(trim_ground);
@@ -2017,7 +2015,7 @@ void adjust_space(location l) {
store_ter[dx+1][dy+1] = off_map;
continue;
}
store_ter[dx+1][dy+1] = editing_town ? town->terrain(x,y) : current_terrain->terrain[x][y];
store_ter[dx+1][dy+1] = cur_area->terrain(x,y);
cTerrain& ter_type = scenario.ter_types[store_ter[dx+1][dy+1]];
store_ter2[dx+1][dy+1] = ter_type.trim_ter;
store_ground[dx+1][dy+1] = ter_type.ground_type;
@@ -2143,7 +2141,7 @@ void place_edit_special(location loc) {
cChoiceDlog("not-at-edge").show();
return;
}
auto& specials = editing_town ? town->special_locs : current_terrain->special_locs;
auto& specials = get_current_area()->special_locs;
for(short i = 0; i < specials.size(); i++)
if(specials[i] == loc && specials[i].spec >= 0) {
edit_spec_enc(specials[i].spec, editing_town ? 2 : 1, nullptr);
@@ -2169,7 +2167,7 @@ void set_special(location spot_hit) {
cChoiceDlog("not-at-edge").show();
return;
}
auto& specials = editing_town ? town->special_locs : current_terrain->special_locs;
auto& specials = get_current_area()->special_locs;
for(short x = 0; x < specials.size(); x++)
if(specials[x] == spot_hit && specials[x].spec >= 0) {
int spec = edit_special_num(editing_town ? 2 : 1,specials[x].spec);

View File

@@ -283,7 +283,7 @@ static std::vector<short> get_small_icons(location at, ter_num_t t_to_draw) {
icons.push_back(ter_small_i);
if(is_special(at.x, at.y)) {
std::vector<spec_loc_t>& spec_list = editing_town ? town->special_locs : current_terrain->special_locs;
std::vector<spec_loc_t>& spec_list = get_current_area()->special_locs;
int num_spec = std::count_if(spec_list.begin(), spec_list.end(), [at](spec_loc_t which) {
return which.spec >= 0 && which.x == at.x && which.y == at.y;
});
@@ -764,9 +764,11 @@ void draw_terrain(){
which_pt.x = cen_x + q - 4;
which_pt.y =cen_y + r - 4;
if(!editing_town) {
for(short i = 0; i < scenario.boats.size(); i++) {
if(scenario.boats[i].which_town == 200 &&
if(editing_town && scenario.boats[i].which_town == cur_town &&
scenario.boats[i].loc == which_pt)
rect_draw_some_item(vehicle_gworld,boat_rect,mainPtr,destrec,sf::BlendAlpha);
if(!editing_town && scenario.boats[i].which_town == 200 &&
scenario.boats[i].sector == cur_out &&
scenario.boats[i].loc == which_pt)
rect_draw_some_item(vehicle_gworld,boat_rect,mainPtr,destrec,sf::BlendAlpha);
@@ -775,29 +777,17 @@ void draw_terrain(){
for(short i = 0; i < scenario.horses.size(); i++) {
source_rect = boat_rect;
source_rect.offset(0,36);
if(scenario.horses[i].which_town == 200 &&
if(editing_town && scenario.horses[i].which_town == cur_town &&
scenario.horses[i].loc == which_pt)
rect_draw_some_item(vehicle_gworld,source_rect,mainPtr,destrec,sf::BlendAlpha);
if(!editing_town && scenario.horses[i].which_town == 200 &&
scenario.horses[i].sector == cur_out &&
scenario.horses[i].loc == which_pt)
rect_draw_some_item(vehicle_gworld,source_rect,mainPtr,destrec,sf::BlendAlpha);
}
}
if(editing_town) {
for(short i = 0; i < scenario.boats.size(); i++) {
if(scenario.boats[i].which_town == cur_town &&
scenario.boats[i].loc == which_pt)
rect_draw_some_item(vehicle_gworld,boat_rect,mainPtr,destrec,sf::BlendAlpha);
}
for(short i = 0; i < scenario.horses.size(); i++) {
source_rect = boat_rect;
source_rect.offset(0,36);
if(scenario.horses[i].which_town == cur_town &&
scenario.horses[i].loc == which_pt)
rect_draw_some_item(vehicle_gworld,source_rect,mainPtr,destrec,sf::BlendAlpha);
}
if(is_field_type(cen_x + q - 4,cen_y + r - 4, FIELD_WEB)) {
from_rect = calc_rect(5,0);
rect_draw_some_item(fields_gworld,from_rect,mainPtr,destrec,sf::BlendAlpha);
@@ -919,18 +909,18 @@ void draw_terrain(){
clip_rect(mainPtr,clipping_rect);
// draw info rects
for(auto& area_desc : get_current_area()->area_desc)
if(area_desc.left > 0) {
draw_rect.left = 22 + 28 * (area_desc.left - cen_x + 4);
draw_rect.right = 22 + 28 * (area_desc.right - cen_x + 4);
draw_rect.top = 24 + 36 * (area_desc.top - cen_y + 4);
draw_rect.bottom = 24 + 36 * (area_desc.bottom - cen_y + 4);
draw_rect.inset(-10, -13);
draw_rect.offset(TER_RECT_UL_X, TER_RECT_UL_Y);
frame_rect(mainPtr, draw_rect, Colours::RED);
}
if(editing_town) {
// draw info rects
for(short i = 0; i < town->area_desc.size(); i++)
if(town->area_desc[i].left > 0) {
draw_rect.left = 22 + 28 * (town->area_desc[i].left - cen_x + 4);
draw_rect.right = 22 + 28 * (town->area_desc[i].right - cen_x + 4);
draw_rect.top = 24 + 36 * (town->area_desc[i].top - cen_y + 4);
draw_rect.bottom = 24 + 36 * (town->area_desc[i].bottom - cen_y + 4);
draw_rect.inset(-10, -13);
draw_rect.offset(TER_RECT_UL_X,TER_RECT_UL_Y);
frame_rect(mainPtr, draw_rect, Colours::RED);
}
// draw border rect
draw_rect.left = 21 + 28 * (town->in_town_rect.left - cen_x + 4);
draw_rect.right = 21 + 28 * (town->in_town_rect.right - cen_x + 4);
@@ -940,19 +930,6 @@ void draw_terrain(){
draw_rect.offset(TER_RECT_UL_X, TER_RECT_UL_Y);
frame_rect(mainPtr, draw_rect, sf::Color::White);
}
if(!editing_town) {
// draw info rects
for(short i = 0; i < current_terrain->area_desc.size(); i++)
if(current_terrain->area_desc[i].left > 0) {
draw_rect.left = 22 + 28 * (current_terrain->area_desc[i].left - cen_x + 4);
draw_rect.right = 22 + 28 * (current_terrain->area_desc[i].right - cen_x + 4);
draw_rect.top = 24 + 36 * (current_terrain->area_desc[i].top - cen_y + 4);
draw_rect.bottom = 24 + 36 * (current_terrain->area_desc[i].bottom - cen_y + 4);
draw_rect.inset(-10, -13);
draw_rect.offset(TER_RECT_UL_X, TER_RECT_UL_Y);
frame_rect(mainPtr, draw_rect, Colours::RED);
}
}
clip_rect(mainPtr, terrain_rect);
small_any_drawn = false;
@@ -981,7 +958,7 @@ void draw_terrain(){
for(short r = yMin; r < yMax; r++) {
if(q - xMin < 0 || q - xMin >= max_dim || r - yMin < 0 || r - yMin >= max_dim)
t_to_draw = 90;
else t_to_draw = editing_town ? town->terrain(q,r) : current_terrain->terrain[q][r];
else t_to_draw = get_current_area()->terrain(q,r);
draw_one_tiny_terrain_spot(q-xMin,r-yMin,t_to_draw,size,is_road(q,r));
small_what_drawn[q][r] = t_to_draw;
}
@@ -1547,14 +1524,9 @@ void set_string(std::string string,std::string string2) {
bool is_special(short i,short j) {
location check(i,j);
if(editing_town)
for(short k = 0; k < town->special_locs.size(); k++)
if(town->special_locs[k] == check && town->special_locs[k].spec >= 0)
return true;
if(!editing_town)
for(short k = 0; k < current_terrain->special_locs.size(); k++)
if(current_terrain->special_locs[k] == check && current_terrain->special_locs[k].spec >= 0)
return true;
for(auto loc : get_current_area()->special_locs)
if(loc == check && loc.spec >= 0)
return true;
return false;
}

View File

@@ -26,7 +26,7 @@
#include "fileio/resmgr/res_dialog.hpp"
extern short cen_x, cen_y, overall_mode;
extern bool mouse_button_held,editing_town,change_made;
extern bool mouse_button_held,change_made;
extern short cur_viewing_mode;
extern cTown* town;
extern short mode_count,to_create,cur_town;