diff --git a/src/scenedit/scen.actions.cpp b/src/scenedit/scen.actions.cpp index 2f8d89ac..df52c974 100644 --- a/src/scenedit/scen.actions.cpp +++ b/src/scenedit/scen.actions.cpp @@ -68,7 +68,7 @@ extern cTown* town; extern short mode_count,to_create; extern ter_num_t template_terrain[64][64]; extern cScenario scenario; -extern std::shared_ptr right_sbar; +extern std::shared_ptr right_sbar, pal_sbar; extern cOutdoors* current_terrain; extern location cur_out; extern sf::RenderWindow mainPtr; @@ -132,8 +132,8 @@ void init_screen_locs() { for(i = 0; i < 256; i++) { terrain_rects[i] = terrain_rect_base; - terrain_rects[i].offset(3 + (i % 17) * (terrain_rect_base.right + 1), - 3 + (i / 17) * (terrain_rect_base.bottom + 1)); + terrain_rects[i].offset(3 + (i % 16) * (terrain_rect_base.right + 1), + 3 + (i / 16) * (terrain_rect_base.bottom + 1)); } } @@ -1002,7 +1002,7 @@ bool handle_action(location the_point,sf::Event /*event*/) { } else { edit_ter_type(i); - set_up_terrain_buttons(); + set_up_terrain_buttons(true); } place_location(); } @@ -2103,6 +2103,7 @@ void set_up_main_screen() { set_lb(NLS - 1,LB_TEXT,LB_NO_ACTION,"Copyright 1997, All rights reserved."); overall_mode = MODE_MAIN_SCREEN; right_sbar->show(); + pal_sbar->hide(); shut_down_menus(4); shut_down_menus(3); redraw_screen(); @@ -2122,10 +2123,11 @@ void start_town_edit() { set_lb(NLS - 1,LB_TEXT,LB_RETURN,"Back to Main Menu"); overall_mode = MODE_DRAWING; editing_town = true; - set_up_terrain_buttons(); + set_up_terrain_buttons(true); shut_down_menus(4); shut_down_menus(2); right_sbar->hide(); + pal_sbar->show(); set_string("Drawing mode",(char*)scenario.ter_types[current_terrain_type].name.c_str()); place_location(); copied_spec = -1; @@ -2151,8 +2153,9 @@ void start_out_edit() { set_lb(NLS - 1,LB_TEXT,LB_RETURN,"Back to Main Menu"); overall_mode = MODE_DRAWING; editing_town = false; - set_up_terrain_buttons(); + set_up_terrain_buttons(true); right_sbar->hide(); + pal_sbar->show(); shut_down_menus(4); shut_down_menus(1); redraw_screen(); @@ -2169,8 +2172,9 @@ void start_out_edit() { void start_terrain_editing() { right_sbar->hide(); + pal_sbar->show(); overall_mode = MODE_EDIT_TYPES; - set_up_terrain_buttons(); + set_up_terrain_buttons(true); place_location(); set_lb(NLS - 3,LB_CLEAR,LB_NO_ACTION,"",true); @@ -2185,6 +2189,7 @@ void start_monster_editing(short just_redo_text) { if(just_redo_text == 0) { overall_mode = MODE_MAIN_SCREEN; right_sbar->show(); + pal_sbar->hide(); right_sbar->setPosition(0); reset_rb(); @@ -2211,6 +2216,7 @@ void start_item_editing(short just_redo_text) { draw_full = true; overall_mode = MODE_MAIN_SCREEN; right_sbar->show(); + pal_sbar->hide(); right_sbar->setPosition(0); reset_rb(); @@ -2236,6 +2242,7 @@ void start_special_item_editing() { draw_full = true; overall_mode = MODE_MAIN_SCREEN; right_sbar->show(); + pal_sbar->hide(); right_sbar->setPosition(0); reset_rb(); @@ -2256,6 +2263,7 @@ void start_quest_editing() { set_up_main_screen(); overall_mode = MODE_MAIN_SCREEN; right_sbar->show(); + pal_sbar->hide(); right_sbar->setPosition(0); reset_rb(); right_sbar->setMaximum(num_options - NRSONPAGE); @@ -2277,6 +2285,7 @@ void start_shops_editing() { set_up_main_screen(); overall_mode = MODE_MAIN_SCREEN; right_sbar->show(); + pal_sbar->hide(); right_sbar->setPosition(0); reset_rb(); right_sbar->setMaximum(num_options - NRSONPAGE); @@ -2307,6 +2316,7 @@ void start_string_editing(short mode,short just_redo_text) { draw_full = true; overall_mode = MODE_MAIN_SCREEN; right_sbar->show(); + pal_sbar->hide(); reset_rb(); right_sbar->setMaximum(num_strs(mode) - NRSONPAGE); @@ -2369,6 +2379,7 @@ void start_special_editing(short mode,short just_redo_text) { draw_full = true; overall_mode = MODE_MAIN_SCREEN; right_sbar->show(); + pal_sbar->hide(); reset_rb(); right_sbar->setMaximum(num_specs + 1 - NRSONPAGE); @@ -2416,6 +2427,7 @@ void start_dialogue_editing(short restoring) { draw_full = true; overall_mode = MODE_MAIN_SCREEN; right_sbar->show(); + pal_sbar->hide(); if(restoring == 0) { right_sbar->setPosition(0); diff --git a/src/scenedit/scen.graphics.cpp b/src/scenedit/scen.graphics.cpp index 69fb1b60..f7547be3 100644 --- a/src/scenedit/scen.graphics.cpp +++ b/src/scenedit/scen.graphics.cpp @@ -49,7 +49,7 @@ extern rectangle left_button[NLS]; extern rectangle right_buttons[NRSONPAGE]; extern rectangle right_scrollbar_rect; extern rectangle right_area_rect; -extern std::shared_ptr right_sbar; +extern std::shared_ptr right_sbar, pal_sbar; extern bool left_buttons_active,right_buttons_active; extern std::array left_button_status; @@ -415,6 +415,7 @@ void draw_main_screen() { //rect_draw_some_item(terrain_buttons_gworld,terrain_buttons_rect, // terrain_buttons_gworld,draw_rect,0,1); place_location(); + pal_sbar->draw(); } @@ -482,33 +483,40 @@ void draw_rb_slot (short which,short mode) { win_draw_string(mainPtr,text_rect,right_button_status[which].label,eTextMode::WRAP,style); } -void set_up_terrain_buttons() { +void set_up_terrain_buttons(bool reset) { short i,j,pic,small_i; rectangle ter_from,ter_from_base = {0,0,36,28}; rectangle tiny_from,tiny_to; rectangle palette_from,palette_to = palette_button_base; + if(reset) pal_sbar->setPosition(0); + pal_sbar->setMaximum((scenario.ter_types.size() / 16) - 15); + if(overall_mode != MODE_EDIT_TYPES) + pal_sbar->setMaximum(pal_sbar->getMaximum() - 1); + tileImage(terrain_buttons_gworld,terrain_buttons_rect,bg[17]); frame_rect(terrain_buttons_gworld, terrain_buttons_rect, sf::Color::Black); + int first = pal_sbar->getPosition() * 16; + int end = min(first + 256, scenario.ter_types.size()); // first make terrain buttons switch(draw_mode){ case DRAW_TERRAIN: - for(i = 0; i < scenario.ter_types.size(); i++) { + for(i = first; i < end; i++) { ter_from = ter_from_base; pic = scenario.ter_types[i].picture; if(pic >= 1000) { sf::Texture* source_gworld; graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic % 1000); rect_draw_some_item(*source_gworld, - ter_from,terrain_buttons_gworld,terrain_rects[i]); + ter_from,terrain_buttons_gworld,terrain_rects[i - first]); } else if(pic < 960) { pic = pic % 50; ter_from.offset(28 * (pic % 10), 36 * (pic / 10)); rect_draw_some_item(terrain_gworld[scenario.ter_types[i].picture/50], - ter_from,terrain_buttons_gworld,terrain_rects[i]); + ter_from,terrain_buttons_gworld,terrain_rects[i - first]); } else { pic = (pic - 560) % 50; @@ -517,19 +525,13 @@ void set_up_terrain_buttons() { ter_from.top = 36 * (pic % 5); ter_from.bottom = ter_from.top + 36; rect_draw_some_item(anim_gworld, - ter_from,terrain_buttons_gworld,terrain_rects[i]); + ter_from,terrain_buttons_gworld,terrain_rects[i - first]); } small_i = get_small_icon(i); -// if(i == 82) -// small_i = 3; -// if(i == 83) -// small_i = 2; -// if((i == 7) || (i == 10) || (i == 13) || (i == 16)) -// small_i = 23; tiny_from = base_small_button_from; tiny_from.offset(7 * (small_i % 10),7 * (small_i / 10)); - tiny_to = terrain_rects[i]; + tiny_to = terrain_rects[i - first]; tiny_to.top = tiny_to.bottom - 7; tiny_to.left = tiny_to.right - 7; if(small_i > 0 && small_i < 255) diff --git a/src/scenedit/scen.graphics.h b/src/scenedit/scen.graphics.h index 8b232f4c..9554d619 100644 --- a/src/scenedit/scen.graphics.h +++ b/src/scenedit/scen.graphics.h @@ -11,7 +11,7 @@ void draw_lb(); void draw_lb_slot (short which,short mode) ; void draw_rb(); void draw_rb_slot (short which,short mode) ; -void set_up_terrain_buttons(); +void set_up_terrain_buttons(bool reset); void draw_terrain(); void draw_monsts(); rectangle get_item_template_rect (short type_wanted); diff --git a/src/scenedit/scen.main.cpp b/src/scenedit/scen.main.cpp index 7f7a413f..e84a6dc7 100644 --- a/src/scenedit/scen.main.cpp +++ b/src/scenedit/scen.main.cpp @@ -30,7 +30,7 @@ bool diff_depth_ok = false,mouse_button_held = false,editing_town = false; short cur_viewing_mode = 0; short cen_x, cen_y; eScenMode overall_mode = MODE_INTRO_SCREEN; -std::shared_ptr right_sbar; +std::shared_ptr right_sbar, pal_sbar; short mode_count = 0; cOutdoors* current_terrain; short pixel_depth,old_depth = 8; @@ -52,6 +52,7 @@ void ding(); cScenario scenario; rectangle right_sbar_rect; +extern rectangle terrain_buttons_rect; //Changed to ISO C specified argument and return type. int main(int, char* argv[]) { @@ -137,6 +138,14 @@ void Initialize(void) { right_sbar->setBounds(right_sbar_rect); right_sbar->setPageSize(NRSONPAGE - 1); right_sbar->hide(); + rectangle pal_sbar_rect = terrain_buttons_rect; + pal_sbar_rect.offset(RIGHT_AREA_UL_X,RIGHT_AREA_UL_Y); + pal_sbar_rect.left = pal_sbar_rect.right - 16; + pal_sbar_rect.height() = 17 * 16; + pal_sbar.reset(new cScrollbar(mainPtr)); + pal_sbar->setBounds(pal_sbar_rect); + pal_sbar->setPageSize(16); + pal_sbar->hide(); } void Handle_One_Event() { @@ -496,6 +505,8 @@ static void handleUpdateWhileScrolling(volatile bool& doneScrolling) { sf::sleep(sf::milliseconds(10)); // TODO: redraw_screen should probably take the argument specifying what to update redraw_screen(/*REFRESH_RIGHT_BAR*/); + if(overall_mode < MODE_MAIN_SCREEN || overall_mode == MODE_EDIT_TYPES) + set_up_terrain_buttons(false); } } @@ -509,6 +520,13 @@ void Mouse_Pressed() { doneScrolling = true; updater.join(); redraw_screen(/*REFRESH_RIGHT_BAR*/); + } else if(pal_sbar->isVisible() && mousePos.in(pal_sbar->getBounds())) { + std::thread updater(std::bind(handleUpdateWhileScrolling, std::ref(doneScrolling))); + pal_sbar->handleClick(mousePos); + doneScrolling = true; + updater.join(); + redraw_screen(/*REFRESH_RIGHT_BAR*/); + set_up_terrain_buttons(false); } else // ordinary click All_Done = handle_action(loc(event.mouseButton.x,event.mouseButton.y),event);