scen.actions.cpp: correct some mistakes + try to do some cleaning
scen.graphics.cpp: check terrain's cen_x, if outside reset the cen_? to the terrain's center
This commit is contained in:
@@ -32,19 +32,16 @@ extern short mini_map_scales[3];
|
|||||||
extern rectangle terrain_rect;
|
extern rectangle terrain_rect;
|
||||||
extern eDrawMode draw_mode;
|
extern eDrawMode draw_mode;
|
||||||
// border rects order: top, left, bottom, right //
|
// border rects order: top, left, bottom, right //
|
||||||
rectangle border_rect[4];
|
static rectangle border_rect[4];
|
||||||
short current_block_edited = 0;
|
|
||||||
short current_terrain_type = 0;
|
short current_terrain_type = 0;
|
||||||
short safety = 0;
|
location mouse_spot(-1,-1);
|
||||||
location spot_hit,last_spot_hit(-1,-1),mouse_spot(-1,-1);
|
static short copied_spec = -1;
|
||||||
short copied_spec = -1;
|
|
||||||
cUndoList undo_list;
|
cUndoList undo_list;
|
||||||
|
|
||||||
cTown::cItem store_place_item;
|
static cTown::cItem store_place_item;
|
||||||
|
|
||||||
short flood_count = 0;
|
rectangle terrain_rects[256];
|
||||||
|
static rectangle terrain_rect_base = {0,0,16,16};
|
||||||
rectangle terrain_rects[256],terrain_rect_base = {0,0,16,16},command_rects[21];
|
|
||||||
extern rectangle terrain_buttons_rect;
|
extern rectangle terrain_buttons_rect;
|
||||||
|
|
||||||
extern short cen_x, cen_y, cur_town;
|
extern short cen_x, cen_y, cur_town;
|
||||||
@@ -66,7 +63,6 @@ std::array<lb_t,NLS> left_button_status;
|
|||||||
std::vector<rb_t> right_button_status;
|
std::vector<rb_t> right_button_status;
|
||||||
rectangle right_buttons[NRSONPAGE];
|
rectangle right_buttons[NRSONPAGE];
|
||||||
rectangle palette_buttons[10][6];
|
rectangle palette_buttons[10][6];
|
||||||
short current_rs_top = 0;
|
|
||||||
|
|
||||||
ePalBtn out_buttons[6][10] = {
|
ePalBtn out_buttons[6][10] = {
|
||||||
{PAL_PENCIL, PAL_BRUSH_LG, PAL_BRUSH_SM, PAL_SPRAY_LG, PAL_SPRAY_SM, PAL_ERASER, PAL_DROPPER, PAL_RECT_HOLLOW, PAL_RECT_FILLED, PAL_BUCKET},
|
{PAL_PENCIL, PAL_BRUSH_LG, PAL_BRUSH_SM, PAL_SPRAY_LG, PAL_SPRAY_SM, PAL_ERASER, PAL_DROPPER, PAL_RECT_HOLLOW, PAL_RECT_FILLED, PAL_BUCKET},
|
||||||
@@ -86,15 +82,11 @@ ePalBtn town_buttons[6][10] = {
|
|||||||
{PAL_SFX_SB, PAL_SFX_MB, PAL_SFX_LB, PAL_SFX_SS, PAL_SFX_LS, PAL_SFX_ASH, PAL_SFX_BONE, PAL_SFX_ROCK, PAL_BLANK, PAL_BLANK},
|
{PAL_SFX_SB, PAL_SFX_MB, PAL_SFX_LB, PAL_SFX_SS, PAL_SFX_LS, PAL_SFX_ASH, PAL_SFX_BONE, PAL_SFX_ROCK, PAL_BLANK, PAL_BLANK},
|
||||||
};
|
};
|
||||||
|
|
||||||
cTownperson last_placed_monst;
|
static cTownperson last_placed_monst;
|
||||||
|
|
||||||
rectangle working_rect;
|
static rectangle working_rect;
|
||||||
location last_space_hit;
|
|
||||||
bool erasing_mode;
|
|
||||||
ter_num_t current_ground = 0;
|
ter_num_t current_ground = 0;
|
||||||
|
|
||||||
short special_to_paste = -1;
|
|
||||||
|
|
||||||
bool monst_on_space(location loc,short m_num);
|
bool monst_on_space(location loc,short m_num);
|
||||||
static bool terrain_matches(unsigned char x, unsigned char y, ter_num_t ter);
|
static bool terrain_matches(unsigned char x, unsigned char y, ter_num_t ter);
|
||||||
|
|
||||||
@@ -267,14 +259,15 @@ static bool handle_lb_action(location the_point) {
|
|||||||
case LB_EDIT_SHOPS:
|
case LB_EDIT_SHOPS:
|
||||||
start_shops_editing(false);
|
start_shops_editing(false);
|
||||||
break;
|
break;
|
||||||
case LB_LOAD_OUT:
|
case LB_LOAD_OUT: {
|
||||||
spot_hit = pick_out(cur_out, scenario);
|
location new_out = pick_out(cur_out, scenario);
|
||||||
if(spot_hit != cur_out) {
|
if(new_out != cur_out) {
|
||||||
cur_out = spot_hit;
|
cur_out = new_out;
|
||||||
current_terrain = scenario.outdoors[cur_out.x][cur_out.y];
|
current_terrain = scenario.outdoors[cur_out.x][cur_out.y];
|
||||||
set_up_main_screen();
|
set_up_main_screen();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case LB_EDIT_OUT:
|
case LB_EDIT_OUT:
|
||||||
start_out_edit();
|
start_out_edit();
|
||||||
mouse_button_held = false;
|
mouse_button_held = false;
|
||||||
@@ -678,6 +671,7 @@ static bool handle_rb_action(location the_point, bool option_hit) {
|
|||||||
|
|
||||||
static bool handle_terrain_action(location the_point, bool ctrl_hit) {
|
static bool handle_terrain_action(location the_point, bool ctrl_hit) {
|
||||||
if(mouse_spot.x >= 0 && mouse_spot.y >= 0) {
|
if(mouse_spot.x >= 0 && mouse_spot.y >= 0) {
|
||||||
|
location spot_hit;
|
||||||
if(cur_viewing_mode == 0) {
|
if(cur_viewing_mode == 0) {
|
||||||
spot_hit.x = cen_x + mouse_spot.x - 4;
|
spot_hit.x = cen_x + mouse_spot.x - 4;
|
||||||
spot_hit.y = cen_y + mouse_spot.y - 4;
|
spot_hit.y = cen_y + mouse_spot.y - 4;
|
||||||
@@ -686,24 +680,13 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
short scale = mini_map_scales[cur_viewing_mode - 1];
|
short scale = mini_map_scales[cur_viewing_mode - 1];
|
||||||
if(scale > 4) {
|
spot_hit.x = cen_x - 256/scale/2 + mouse_spot.x;
|
||||||
if(cen_x + 5 > 256 / scale)
|
spot_hit.y = cen_y - 324/scale/2 + mouse_spot.y;
|
||||||
spot_hit.x = cen_x + 5 - 256/scale + mouse_spot.x;
|
|
||||||
else spot_hit.x = mouse_spot.x;
|
|
||||||
if(cen_y + 5 > 324 / scale)
|
|
||||||
spot_hit.y = cen_y + 5 - 324/scale + mouse_spot.y;
|
|
||||||
else spot_hit.y = mouse_spot.y;
|
|
||||||
} else {
|
|
||||||
spot_hit.x = mouse_spot.x;
|
|
||||||
spot_hit.y = mouse_spot.y;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
static location last_spot_hit(-1,-1);
|
||||||
if((mouse_button_held) && (spot_hit.x == last_spot_hit.x) &&
|
if(mouse_button_held && spot_hit== last_spot_hit)
|
||||||
(spot_hit.y == last_spot_hit.y))
|
|
||||||
return true;
|
return true;
|
||||||
else last_spot_hit = spot_hit;
|
else
|
||||||
if(!mouse_button_held)
|
|
||||||
last_spot_hit = spot_hit;
|
last_spot_hit = spot_hit;
|
||||||
|
|
||||||
eScenMode old_mode = overall_mode;
|
eScenMode old_mode = overall_mode;
|
||||||
@@ -712,7 +695,8 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
|
|||||||
if((spot_hit.x < 0) || (spot_hit.x > ((editing_town) ? town->max_dim - 1 : 47)) ||
|
if((spot_hit.x < 0) || (spot_hit.x > ((editing_town) ? town->max_dim - 1 : 47)) ||
|
||||||
(spot_hit.y < 0) || (spot_hit.y > ((editing_town) ? town->max_dim - 1 : 47))) ;
|
(spot_hit.y < 0) || (spot_hit.y > ((editing_town) ? town->max_dim - 1 : 47))) ;
|
||||||
else switch(overall_mode) {
|
else switch(overall_mode) {
|
||||||
case MODE_DRAWING:
|
case MODE_DRAWING: {
|
||||||
|
static bool erasing_mode = false;
|
||||||
if((!mouse_button_held && terrain_matches(spot_hit.x,spot_hit.y,current_terrain_type)) ||
|
if((!mouse_button_held && terrain_matches(spot_hit.x,spot_hit.y,current_terrain_type)) ||
|
||||||
(mouse_button_held && erasing_mode)) {
|
(mouse_button_held && erasing_mode)) {
|
||||||
set_terrain(spot_hit,current_ground);
|
set_terrain(spot_hit,current_ground);
|
||||||
@@ -725,6 +709,7 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
|
|||||||
erasing_mode = false;
|
erasing_mode = false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case MODE_ROOM_RECT: case MODE_SET_TOWN_RECT: case MODE_HOLLOW_RECT: case MODE_FILLED_RECT:
|
case MODE_ROOM_RECT: case MODE_SET_TOWN_RECT: case MODE_HOLLOW_RECT: case MODE_FILLED_RECT:
|
||||||
if(mouse_button_held)
|
if(mouse_button_held)
|
||||||
@@ -1007,7 +992,7 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
|
|||||||
case MODE_COPY_SPECIAL: //copy special
|
case MODE_COPY_SPECIAL: //copy special
|
||||||
{
|
{
|
||||||
auto& specials = editing_town ? town->special_locs : current_terrain->special_locs;
|
auto& specials = editing_town ? town->special_locs : current_terrain->special_locs;
|
||||||
auto iter = std::find_if(town->special_locs.begin(), town->special_locs.end(), [](const spec_loc_t& loc) {
|
auto iter = std::find_if(town->special_locs.begin(), town->special_locs.end(), [spot_hit](const spec_loc_t& loc) {
|
||||||
return loc == spot_hit && loc.spec >= 0;
|
return loc == spot_hit && loc.spec >= 0;
|
||||||
});
|
});
|
||||||
if(iter != specials.end())
|
if(iter != specials.end())
|
||||||
@@ -1114,7 +1099,7 @@ static bool handle_terrain_action(location the_point, bool ctrl_hit) {
|
|||||||
break;
|
break;
|
||||||
case MODE_PLACE_BOAT: case MODE_PLACE_HORSE: {
|
case MODE_PLACE_BOAT: case MODE_PLACE_HORSE: {
|
||||||
auto& all = overall_mode == MODE_PLACE_BOAT ? scenario.boats : scenario.horses;
|
auto& all = overall_mode == MODE_PLACE_BOAT ? scenario.boats : scenario.horses;
|
||||||
auto iter = std::find_if(all.begin(), all.end(), [](const cVehicle& what) {
|
auto iter = std::find_if(all.begin(), all.end(), [spot_hit](const cVehicle& what) {
|
||||||
if(editing_town && cur_town != what.which_town) return false;
|
if(editing_town && cur_town != what.which_town) return false;
|
||||||
else if(!editing_town && what.which_town != 200) return false;
|
else if(!editing_town && what.which_town != 200) return false;
|
||||||
return what.loc == spot_hit;
|
return what.loc == spot_hit;
|
||||||
@@ -1376,9 +1361,6 @@ static bool handle_toolpal_action(location cur_point2) {
|
|||||||
overall_mode = MODE_COPY_SPECIAL;
|
overall_mode = MODE_COPY_SPECIAL;
|
||||||
break;
|
break;
|
||||||
case PAL_PASTE_SPEC:
|
case PAL_PASTE_SPEC:
|
||||||
if(special_to_paste < 0) {
|
|
||||||
set_string("Can't paste special","No special to paste");
|
|
||||||
}
|
|
||||||
set_string("Paste special","Select location to paste");
|
set_string("Paste special","Select location to paste");
|
||||||
overall_mode = MODE_PASTE_SPECIAL;
|
overall_mode = MODE_PASTE_SPECIAL;
|
||||||
break;
|
break;
|
||||||
@@ -1534,8 +1516,6 @@ void handle_action(location the_point,sf::Event /*event*/) {
|
|||||||
std::string s2;
|
std::string s2;
|
||||||
|
|
||||||
bool option_hit = false,ctrl_hit = false;
|
bool option_hit = false,ctrl_hit = false;
|
||||||
location spot_hit;
|
|
||||||
location cur_point,cur_point2;
|
|
||||||
rectangle temp_rect;
|
rectangle temp_rect;
|
||||||
if(kb::isKeyPressed(kb::LAlt) || kb::isKeyPressed(kb::RAlt))
|
if(kb::isKeyPressed(kb::LAlt) || kb::isKeyPressed(kb::RAlt))
|
||||||
option_hit = true;
|
option_hit = true;
|
||||||
@@ -1553,13 +1533,13 @@ void handle_action(location the_point,sf::Event /*event*/) {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if(!mouse_button_held && ((overall_mode < MODE_MAIN_SCREEN) || (overall_mode == MODE_EDIT_TYPES))) {
|
if(!mouse_button_held && ((overall_mode < MODE_MAIN_SCREEN) || (overall_mode == MODE_EDIT_TYPES))) {
|
||||||
cur_point = the_point;
|
location cur_point = the_point;
|
||||||
cur_point.x -= RIGHT_AREA_UL_X;
|
cur_point.x -= RIGHT_AREA_UL_X;
|
||||||
cur_point.y -= RIGHT_AREA_UL_Y;
|
cur_point.y -= RIGHT_AREA_UL_Y;
|
||||||
if(handle_terpal_action(cur_point, option_hit))
|
if(handle_terpal_action(cur_point, option_hit))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cur_point2 = the_point;
|
location cur_point2 = the_point;
|
||||||
cur_point2.x -= 5;
|
cur_point2.x -= 5;
|
||||||
cur_point2.y -= terrain_rects[255].bottom + 5;
|
cur_point2.y -= terrain_rects[255].bottom + 5;
|
||||||
if(handle_toolpal_action(cur_point2))
|
if(handle_toolpal_action(cur_point2))
|
||||||
|
@@ -686,6 +686,11 @@ void draw_terrain(){
|
|||||||
if(cur_viewing_mode == 0) {
|
if(cur_viewing_mode == 0) {
|
||||||
tileImage(mainPtr,terrain_rect,bg[17]);
|
tileImage(mainPtr,terrain_rect,bg[17]);
|
||||||
frame_rect(mainPtr, terrain_rect, sf::Color::Black);
|
frame_rect(mainPtr, terrain_rect, sf::Color::Black);
|
||||||
|
// limits for town: only town and for outside terrain: sector+one outside bordering
|
||||||
|
int const limits[]={editing_town ? 4 : 3, int(editing_town ? town->max_dim-1 : 48)-4};
|
||||||
|
// if outside, resets the position to center of the map
|
||||||
|
if (cen_x<limits[0] || cen_x>limits[1]) cen_x=(editing_town ? town->max_dim-1 : 48)/2;
|
||||||
|
if (cen_y<limits[0] || cen_y>limits[1]) cen_y=(editing_town ? town->max_dim-1 : 48)/2;
|
||||||
for(short q = 0; q < 9; q++)
|
for(short q = 0; q < 9; q++)
|
||||||
for(short r = 0; r < 9; r++) {
|
for(short r = 0; r < 9; r++) {
|
||||||
where_draw.x = q;
|
where_draw.x = q;
|
||||||
|
Reference in New Issue
Block a user