diff --git a/src/fileio/fileio_scen.cpp b/src/fileio/fileio_scen.cpp index b0f2066e..eb43fe70 100644 --- a/src/fileio/fileio_scen.cpp +++ b/src/fileio/fileio_scen.cpp @@ -627,7 +627,7 @@ static void readShopFromXml(ticpp::Element& data, cShop& shop) { entry->GetText(&num); shop.addItem(num, dummy_item, amount, chance); } else if(type == "special") { - int amount, node, cost = 0, icon; + int amount=0, node=-1, cost = 0, icon=-1; std::string title, descr; std::set reqs = {"quantity", "node", "icon", "name", "description"}; Iterator attr; diff --git a/src/game/boe.actions.cpp b/src/game/boe.actions.cpp index 321db2fc..6cf3bbc2 100644 --- a/src/game/boe.actions.cpp +++ b/src/game/boe.actions.cpp @@ -76,7 +76,6 @@ extern cShop active_shop; extern short cen_x, cen_y;//,pc_moves[6]; extern eGameMode overall_mode; extern eItemWinMode stat_window; -extern location to_create; extern bool All_Done,spell_forced,monsters_going; extern bool party_in_memory; extern sf::View mainView; diff --git a/src/game/boe.infodlg.cpp b/src/game/boe.infodlg.cpp index 3f7de93a..9be4f07d 100644 --- a/src/game/boe.infodlg.cpp +++ b/src/game/boe.infodlg.cpp @@ -34,7 +34,6 @@ short mage_spell_pos = 0,priest_spell_pos = 0,skill_pos = 0; extern std::map skill_cost; extern std::map skill_max; extern std::map skill_g_cost; -extern short cur_town_talk_loaded; extern sf::RenderWindow mainPtr; extern short on_monst_menu[256]; diff --git a/src/gfx/gfxsheets.hpp b/src/gfx/gfxsheets.hpp index 26d71bc3..2454892d 100644 --- a/src/gfx/gfxsheets.hpp +++ b/src/gfx/gfxsheets.hpp @@ -30,7 +30,6 @@ struct cCustomGraphics { bool is_old = false; void clear() { sheets.clear(); - party_sheet=Texture(); } explicit operator bool() { return !sheets.empty() && bool(sheets[0]); diff --git a/src/scenario/item.hpp b/src/scenario/item.hpp index 357fdc99..c1bd4c93 100644 --- a/src/scenario/item.hpp +++ b/src/scenario/item.hpp @@ -87,6 +87,7 @@ public: static cItem bad() { cItem badItem; badItem.graphic_num = 9999; + badItem.name = badItem.full_name = "Bad Item"; return badItem; } }; diff --git a/src/scenedit/scen.actions.cpp b/src/scenedit/scen.actions.cpp index 18e2bc36..e8d130f0 100644 --- a/src/scenedit/scen.actions.cpp +++ b/src/scenedit/scen.actions.cpp @@ -42,34 +42,13 @@ extern eScenMode overall_mode; extern bool mouse_button_held,editing_town; extern short cur_viewing_mode; extern cTown* town; -extern short mode_count,to_create; -extern ter_num_t template_terrain[64][64]; +extern short mode_count; extern cScenario scenario; extern cOutdoors* current_terrain; extern location cur_out; extern sf::RenderWindow mainPtr; extern bool change_made; -rectangle palette_buttons[10][6]; - -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_EDIT_TOWN, PAL_ERASE_TOWN, PAL_BLANK, PAL_BLANK, PAL_EDIT_SIGN, PAL_TEXT_AREA, PAL_WANDER, PAL_CHANGE, PAL_ZOOM, PAL_BLANK}, - {PAL_SPEC, PAL_COPY_SPEC, PAL_PASTE_SPEC, PAL_ERASE_SPEC, PAL_EDIT_SPEC, PAL_SPEC_SPOT, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK}, - {PAL_BOAT, PAL_HORSE, PAL_ROAD, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK}, - {PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK}, - {PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK}, -}; - -ePalBtn town_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_ENTER_N, PAL_ENTER_W, PAL_ENTER_S, PAL_ENTER_E, PAL_EDIT_SIGN, PAL_TEXT_AREA, PAL_WANDER, PAL_CHANGE, PAL_ZOOM, PAL_TERRAIN}, - {PAL_SPEC, PAL_COPY_SPEC, PAL_PASTE_SPEC, PAL_ERASE_SPEC, PAL_EDIT_SPEC, PAL_SPEC_SPOT, PAL_EDIT_ITEM, PAL_SAME_ITEM, PAL_ERASE_ITEM, PAL_ITEM}, - {PAL_BOAT, PAL_HORSE, PAL_ROAD, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_EDIT_MONST, PAL_SAME_MONST, PAL_ERASE_MONST, PAL_MONST}, - {PAL_WEB, PAL_CRATE, PAL_BARREL, PAL_BLOCK, PAL_FIRE_BARR, PAL_FORCE_BARR, PAL_QUICKFIRE, PAL_FORCECAGE, PAL_ERASE_FIELD, 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}, -}; - static cTownperson last_placed_monst; static rectangle working_rect; @@ -1214,10 +1193,10 @@ static bool handle_toolpal_action(location cur_point2) { auto &controls=scen_controls; for(int i = 0; i < 10; i++) for(int j = 0; j < 6; j++) { - auto cur_palette_buttons = editing_town ? town_buttons : out_buttons; - if(cur_palette_buttons[j][i] != PAL_BLANK && !mouse_button_held && cur_point2.in(palette_buttons[i][j]) + auto cur_palette_buttons = editing_town ? controls.town_buttons : controls.out_buttons; + if(cur_palette_buttons[j][i] != PAL_BLANK && !mouse_button_held && cur_point2.in(controls.palette_buttons[i][j]) && /*((j < 3) || (editing_town)) &&*/ (overall_mode < MODE_MAIN_SCREEN)) { - rectangle temp_rect = palette_buttons[i][j]; + rectangle temp_rect = controls.palette_buttons[i][j]; temp_rect.offset(RIGHT_AREA_UL_X + 5, RIGHT_AREA_UL_Y + controls.terrain_rects[255].bottom + 5); flash_rect(temp_rect); auto const &ter_type=scenario.get_terrain(current_terrain_type); @@ -1664,23 +1643,23 @@ void handle_keystroke(sf::Event event) { overall_mode = 8; break;*/ case 'D': - pass_point.x = RIGHT_AREA_UL_X + 6 + palette_buttons[0][0].left; - pass_point.y = RIGHT_AREA_UL_Y + 6 + controls.terrain_rects[255].bottom + palette_buttons[0][0].top; + pass_point.x = RIGHT_AREA_UL_X + 6 + controls.palette_buttons[0][0].left; + pass_point.y = RIGHT_AREA_UL_Y + 6 + controls.terrain_rects[255].bottom + controls.palette_buttons[0][0].top; handle_action(pass_point,event); break; case 'R': - pass_point.x = RIGHT_AREA_UL_X + 6 + palette_buttons[7][0].left; - pass_point.y = RIGHT_AREA_UL_Y + 6 + controls.terrain_rects[255].bottom + palette_buttons[7][0].top; + pass_point.x = RIGHT_AREA_UL_X + 6 + controls.palette_buttons[7][0].left; + pass_point.y = RIGHT_AREA_UL_Y + 6 + controls.terrain_rects[255].bottom + controls.palette_buttons[7][0].top; handle_action(pass_point,event); break; case '1': case '2': case '3': case '4': case '5': case '6': - pass_point.x = RIGHT_AREA_UL_X + 6 + palette_buttons[chr - 49][4].left; - pass_point.y = RIGHT_AREA_UL_Y + 6 + controls.terrain_rects[255].bottom + palette_buttons[chr - 48][4].top; + pass_point.x = RIGHT_AREA_UL_X + 6 + controls.palette_buttons[chr - 49][4].left; + pass_point.y = RIGHT_AREA_UL_Y + 6 + controls.terrain_rects[255].bottom + controls.palette_buttons[chr - 48][4].top; handle_action(pass_point,event); break; case '0': - pass_point.x = RIGHT_AREA_UL_X + 6 + palette_buttons[7][4].left; - pass_point.y = RIGHT_AREA_UL_Y + 6 + controls.terrain_rects[255].bottom + palette_buttons[7][4].top; + pass_point.x = RIGHT_AREA_UL_X + 6 + controls.palette_buttons[7][4].left; + pass_point.y = RIGHT_AREA_UL_Y + 6 + controls.terrain_rects[255].bottom + controls.palette_buttons[7][4].top; handle_action(pass_point,event); break; case 'I': @@ -2199,40 +2178,8 @@ void town_entry(location spot_hit) { } } -static std::string version() { - static std::string version; - if(version.empty()) { - std::ostringstream sout; - sout << "Version " << oboeVersionString(); -#if defined(GIT_REVISION) && defined(GIT_TAG_REVISION) - if(strcmp(GIT_REVISION, GIT_TAG_REVISION) != 0) { - sout << " [" << GIT_REVISION << "]"; - } -#endif - version = sout.str(); - } - return version; -} - -// is slot >= 0, force that slot -// if -1, use 1st free slot void set_up_start_screen() { - auto &controls=scen_controls; - controls.reset_left_buttons(); - controls.reset_right_bar_and_buttons(); - controls.set_left_button(0,LB_TITLE,LB_NO_ACTION,"Blades of Exile"); - controls.set_left_button(1,LB_TITLE,LB_NO_ACTION,"Scenario Editor"); - controls.set_left_button(3,LB_TEXT,LB_NEW_SCEN,"Make New Scenario"); - controls.set_left_button(4,LB_TEXT,LB_LOAD_SCEN,"Load Scenario"); - controls.set_left_button(7,LB_TEXT,LB_NO_ACTION,"To find out how to use the"); - controls.set_left_button(8,LB_TEXT,LB_NO_ACTION,"editor, select Getting Started "); - controls.set_left_button(9,LB_TEXT,LB_NO_ACTION,"from the Help menu."); - controls.set_left_button(NLS - 6,LB_TEXT,LB_NO_ACTION,"Be sure to read the file Blades"); - controls.set_left_button(NLS - 5,LB_TEXT,LB_NO_ACTION,"of Exile License. Using this"); - controls.set_left_button(NLS - 4,LB_TEXT,LB_NO_ACTION,"program implies that you agree "); - controls.set_left_button(NLS - 3,LB_TEXT,LB_NO_ACTION,"with the terms of the license."); - controls.set_left_button(NLS - 2,LB_TEXT,LB_NO_ACTION,"Copyright 1997, All rights reserved."); - controls.set_left_button(NLS - 1,LB_TEXT,LB_NO_ACTION,version()); + scen_controls.set_startup_screen(); change_made = false; update_mouse_spot(translate_mouse_coordinates(sf::Mouse::getPosition(mainPtr))); } @@ -2240,38 +2187,8 @@ void set_up_start_screen() { void set_up_main_screen() { std::ostringstream strb; - auto &controls=scen_controls; - controls.reset_left_buttons(); - controls.reset_right_bar_and_buttons(); - controls.set_left_button(-1,LB_TITLE,LB_NO_ACTION,"Blades of Exile"); - controls.set_left_button(-1,LB_TEXT,LB_NO_ACTION,"Scenario Options"); - controls.set_left_button(-1,LB_TEXT,LB_EDIT_TER,"Edit Terrain Types"); - controls.set_left_button(-1,LB_TEXT,LB_EDIT_MONST,"Edit Monsters"); - controls.set_left_button(-1,LB_TEXT,LB_EDIT_ITEM,"Edit Items"); - controls.set_left_button(-1,LB_TEXT,LB_NEW_TOWN,"Create New Town"); - controls.set_left_button(-1,LB_TEXT,LB_EDIT_TEXT,"Edit Scenario Text"); - controls.set_left_button(-1,LB_TEXT,LB_EDIT_SPECITEM,"Edit Special Items"); - controls.set_left_button(-1,LB_TEXT,LB_EDIT_QUEST,"Edit Quests"); - controls.set_left_button(-1,LB_TEXT,LB_EDIT_SHOPS,"Edit Shops"); - controls.set_left_button(-1,LB_TEXT,LB_NO_ACTION,""); - controls.set_left_button(-1,LB_TEXT,LB_NO_ACTION,"Outdoors Options"); - strb << " Section x = " << cur_out.x << ", y = " << cur_out.y; - controls.set_left_button(-1,LB_TEXT,LB_NO_ACTION, strb.str()); - controls.set_left_button(-1,LB_TEXT,LB_LOAD_OUT,"Load New Section"); - controls.set_left_button(-1,LB_TEXT,LB_EDIT_OUT,"Edit Outdoor Terrain"); - controls.set_left_button(-1,LB_TEXT,LB_NO_ACTION,"",0); - controls.set_left_button(-1,LB_TEXT,LB_NO_ACTION,"Town/Dungeon Options"); - strb.str(""); - strb << " Town " << cur_town << ": " << town->name; - controls.set_left_button(-1,LB_TEXT,LB_NO_ACTION, strb.str()); - controls.set_left_button(-1,LB_TEXT,LB_LOAD_TOWN,"Load Another Town"); - controls.set_left_button(-1,LB_TEXT,LB_EDIT_TOWN,"Edit Town Terrain"); - controls.set_left_button(-1,LB_TEXT,LB_EDIT_TALK,"Edit Town Dialogue"); - controls.set_left_button(NLS - 2,LB_TEXT,LB_NO_ACTION,"Copyright 1997, All rights reserved."); - controls.set_left_button(NLS - 1,LB_TEXT,LB_NO_ACTION,version()); + scen_controls.set_main_screen(cur_out, cur_town, town->name); overall_mode = MODE_MAIN_SCREEN; - controls.show_right_bar(); - controls.show_palette_bar(false); shut_down_menus(4); shut_down_menus(3); redraw_screen(); @@ -2358,12 +2275,7 @@ void start_monster_editing(bool just_redo_text) { auto &controls=scen_controls; if(!just_redo_text) { overall_mode = MODE_MAIN_SCREEN; - controls.show_right_bar(); - controls.show_palette_bar(false); - - controls.right_bar->setPosition(0);; - controls.reset_right_bar_and_buttons(); - controls.right_bar->setMaximum(num_options - 1 - NRSONPAGE); + controls.reset_right(num_options - 1 - NRSONPAGE); } for(short i = 1; i < num_options; i++) { std::string title; @@ -2389,12 +2301,7 @@ void start_item_editing(bool just_redo_text) { if(overall_mode == MODE_EDIT_TYPES) draw_full = true; overall_mode = MODE_MAIN_SCREEN; - controls.show_right_bar(); - controls.show_palette_bar(false); - - controls.right_bar->setPosition(0);; - controls.reset_right_bar_and_buttons(); - controls.right_bar->setMaximum(num_options - NRSONPAGE); + controls.reset_right(num_options - NRSONPAGE); } for(short i = 0; i < num_options; i++) { std::string title; @@ -2416,12 +2323,7 @@ void start_special_item_editing(bool just_redo_text) { if(overall_mode < MODE_MAIN_SCREEN) set_up_main_screen(); overall_mode = MODE_MAIN_SCREEN; - controls.show_right_bar(); - controls.show_palette_bar(false); - - controls.right_bar->setPosition(0);; - controls.reset_right_bar_and_buttons(); - controls.right_bar->setMaximum(num_options - NRSONPAGE); + controls.reset_right(num_options - NRSONPAGE); } for(short i = 0; i < num_options; i++) { std::string title; @@ -2443,11 +2345,7 @@ void start_quest_editing(bool just_redo_text) { if(overall_mode < MODE_MAIN_SCREEN) set_up_main_screen(); overall_mode = MODE_MAIN_SCREEN; - controls.show_right_bar(); - controls.show_palette_bar(false); - controls.right_bar->setPosition(0);; - controls.reset_right_bar_and_buttons(); - controls.right_bar->setMaximum(num_options - NRSONPAGE); + controls.reset_right(num_options - NRSONPAGE); } for(int i = 0; i < num_options; i++) { std::string title; @@ -2469,11 +2367,7 @@ void start_shops_editing(bool just_redo_text) { if(overall_mode < MODE_MAIN_SCREEN) set_up_main_screen(); overall_mode = MODE_MAIN_SCREEN; - controls.show_right_bar(); - controls.show_palette_bar(false); - controls.right_bar->setPosition(0);; - controls.reset_right_bar_and_buttons(); - controls.right_bar->setMaximum(num_options - NRSONPAGE); + controls.reset_right(num_options - NRSONPAGE); } for(int i = 0; i < num_options; i++) { std::string title; @@ -2500,11 +2394,7 @@ void start_string_editing(eStrMode mode,short just_redo_text) { if(overall_mode < MODE_MAIN_SCREEN) set_up_main_screen(); overall_mode = MODE_MAIN_SCREEN; - controls.show_right_bar(); - controls.show_palette_bar(false); - - controls.reset_right_bar_and_buttons(); - controls.right_bar->setMaximum(num_strs(mode) + 1 - NRSONPAGE); + controls.reset_right(num_strs(mode) + 1 - NRSONPAGE); } size_t num_strs = ::num_strs(mode); for(size_t i = 0; i < num_strs; i++) { @@ -2577,11 +2467,7 @@ void start_special_editing(short mode,short just_redo_text) { if(overall_mode < MODE_MAIN_SCREEN) set_up_main_screen(); overall_mode = MODE_MAIN_SCREEN; - controls.show_right_bar(); - controls.show_palette_bar(false); - - controls.reset_right_bar_and_buttons(); - controls.right_bar->setMaximum(num_specs + 1 - NRSONPAGE); + controls.reset_right(num_specs + 1 - NRSONPAGE); } for(size_t i = 0; i < num_specs; i++) { diff --git a/src/scenedit/scen.btnmg.cpp b/src/scenedit/scen.btnmg.cpp index d8850d5d..59a14776 100644 --- a/src/scenedit/scen.btnmg.cpp +++ b/src/scenedit/scen.btnmg.cpp @@ -23,7 +23,23 @@ cScenButtonsBars scen_controls; extern sf::RenderWindow mainPtr; extern cDrawableManager drawable_mgr; -extern rectangle terrain_buttons_rect; + +ePalBtn cScenButtonsBars::town_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_ENTER_N, PAL_ENTER_W, PAL_ENTER_S, PAL_ENTER_E, PAL_EDIT_SIGN, PAL_TEXT_AREA, PAL_WANDER, PAL_CHANGE, PAL_ZOOM, PAL_TERRAIN}, + {PAL_SPEC, PAL_COPY_SPEC, PAL_PASTE_SPEC, PAL_ERASE_SPEC, PAL_EDIT_SPEC, PAL_SPEC_SPOT, PAL_EDIT_ITEM, PAL_SAME_ITEM, PAL_ERASE_ITEM, PAL_ITEM}, + {PAL_BOAT, PAL_HORSE, PAL_ROAD, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_EDIT_MONST, PAL_SAME_MONST, PAL_ERASE_MONST, PAL_MONST}, + {PAL_WEB, PAL_CRATE, PAL_BARREL, PAL_BLOCK, PAL_FIRE_BARR, PAL_FORCE_BARR, PAL_QUICKFIRE, PAL_FORCECAGE, PAL_ERASE_FIELD, 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}, +}; +ePalBtn cScenButtonsBars::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_EDIT_TOWN, PAL_ERASE_TOWN, PAL_BLANK, PAL_BLANK, PAL_EDIT_SIGN, PAL_TEXT_AREA, PAL_WANDER, PAL_CHANGE, PAL_ZOOM, PAL_BLANK}, + {PAL_SPEC, PAL_COPY_SPEC, PAL_PASTE_SPEC, PAL_ERASE_SPEC, PAL_EDIT_SPEC, PAL_SPEC_SPOT, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK}, + {PAL_BOAT, PAL_HORSE, PAL_ROAD, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK}, + {PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK}, + {PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK, PAL_BLANK}, +}; void cScenButtonsBars::init() { @@ -53,6 +69,9 @@ void cScenButtonsBars::init() // terrains terrain_rectangle = {0,0,340,272}; terrain_rectangle.offset(TER_RECT_UL_X, TER_RECT_UL_Y); + terrain_buttons_rect = {0,0,410,294}; + terrain_buttons_rect.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y); + for(auto &rect : terrain_border_rects) rect = scen_controls.terrain_rectangle; terrain_border_rects[0].bottom = terrain_border_rects[0].top + 8; @@ -67,6 +86,25 @@ void cScenButtonsBars::init() 3 + (i / 16) * (terrain_rect_base.bottom + 1)); } + // palette buttons + palette_button_base = {0,0,18,26}; + palette_button_base.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y); + + for(short i = 0; i < 10; i++) + for(short j = 0; j < 6; j++) { + palette_buttons[i][j] = palette_button_base; + palette_buttons[i][j].offset(i * 25, j * 17); + } + for(short i = 0; i < 10; i++) + for(short j = /*2*/0; j < 6; j++) + palette_buttons[i][j].offset(0, 3); + for(short i = 0; i < 10; i++) + for(short j = /*3*/0; j < 6; j++) + palette_buttons[i][j].offset(0, 3); + for(short i = 0; i < 10; i++) + for(short j = /*4*/0; j < 6; j++) + palette_buttons[i][j].offset(0, 3); + // scrollbars rectangle right_bar_rect; right_bar_rect.top = RIGHT_AREA_UL_Y - 1; @@ -77,12 +115,99 @@ void cScenButtonsBars::init() right_bar->setPosition(0); rectangle pal_bar_rect = terrain_buttons_rect; - pal_bar_rect.offset(RIGHT_AREA_UL_X,RIGHT_AREA_UL_Y); pal_bar_rect.left = pal_bar_rect.right - 16; pal_bar_rect.height() = 17 * 16; init_bar(palette_bar, "pal_sbar", pal_bar_rect, { 5, 287, 279, 581 }, 16); } +static std::string version() { + static std::string version; + if(version.empty()) { + std::ostringstream sout; + sout << "Version " << oboeVersionString(); +#if defined(GIT_REVISION) && defined(GIT_TAG_REVISION) + if(strcmp(GIT_REVISION, GIT_TAG_REVISION) != 0) { + sout << " [" << GIT_REVISION << "]"; + } +#endif + version = sout.str(); + } + return version; +} + +void cScenButtonsBars::set_startup_screen() +{ + reset_left_buttons(); + reset_right_bar_and_buttons(); + set_left_button(0,LB_TITLE,LB_NO_ACTION,"Blades of Exile"); + set_left_button(1,LB_TITLE,LB_NO_ACTION,"Scenario Editor"); + set_left_button(3,LB_TEXT,LB_NEW_SCEN,"Make New Scenario"); + set_left_button(4,LB_TEXT,LB_LOAD_SCEN,"Load Scenario"); + set_left_button(7,LB_TEXT,LB_NO_ACTION,"To find out how to use the"); + set_left_button(8,LB_TEXT,LB_NO_ACTION,"editor, select Getting Started "); + set_left_button(9,LB_TEXT,LB_NO_ACTION,"from the Help menu."); + set_left_button(NLS - 6,LB_TEXT,LB_NO_ACTION,"Be sure to read the file Blades"); + set_left_button(NLS - 5,LB_TEXT,LB_NO_ACTION,"of Exile License. Using this"); + set_left_button(NLS - 4,LB_TEXT,LB_NO_ACTION,"program implies that you agree "); + set_left_button(NLS - 3,LB_TEXT,LB_NO_ACTION,"with the terms of the license."); + set_left_button(NLS - 2,LB_TEXT,LB_NO_ACTION,"Copyright 1997, All rights reserved."); + set_left_button(NLS - 1,LB_TEXT,LB_NO_ACTION,version()); +} + +void cScenButtonsBars::set_main_screen(location const &cur_out, int cur_town, std::string const &town_name) +{ + reset_left_buttons(); + reset_right_bar_and_buttons(); + set_left_button(-1,LB_TITLE,LB_NO_ACTION,"Blades of Exile"); + set_left_button(-1,LB_TEXT,LB_NO_ACTION,"Scenario Options"); + set_left_button(-1,LB_TEXT,LB_EDIT_TER,"Edit Terrain Types"); + set_left_button(-1,LB_TEXT,LB_EDIT_MONST,"Edit Monsters"); + set_left_button(-1,LB_TEXT,LB_EDIT_ITEM,"Edit Items"); + set_left_button(-1,LB_TEXT,LB_NEW_TOWN,"Create New Town"); + set_left_button(-1,LB_TEXT,LB_EDIT_TEXT,"Edit Scenario Text"); + set_left_button(-1,LB_TEXT,LB_EDIT_SPECITEM,"Edit Special Items"); + set_left_button(-1,LB_TEXT,LB_EDIT_QUEST,"Edit Quests"); + set_left_button(-1,LB_TEXT,LB_EDIT_SHOPS,"Edit Shops"); + set_left_button(-1,LB_TEXT,LB_NO_ACTION,""); + set_left_button(-1,LB_TEXT,LB_NO_ACTION,"Outdoors Options"); + std::ostringstream strb; + + strb << " Section x = " << cur_out.x << ", y = " << cur_out.y; + set_left_button(-1,LB_TEXT,LB_NO_ACTION, strb.str()); + set_left_button(-1,LB_TEXT,LB_LOAD_OUT,"Load New Section"); + set_left_button(-1,LB_TEXT,LB_EDIT_OUT,"Edit Outdoor Terrain"); + set_left_button(-1,LB_TEXT,LB_NO_ACTION,"",0); + set_left_button(-1,LB_TEXT,LB_NO_ACTION,"Town/Dungeon Options"); + strb.str(""); + strb << " Town " << cur_town << ": " << town_name; + set_left_button(-1,LB_TEXT,LB_NO_ACTION, strb.str()); + set_left_button(-1,LB_TEXT,LB_LOAD_TOWN,"Load Another Town"); + set_left_button(-1,LB_TEXT,LB_EDIT_TOWN,"Edit Town Terrain"); + set_left_button(-1,LB_TEXT,LB_EDIT_TALK,"Edit Town Dialogue"); + set_left_button(NLS - 2,LB_TEXT,LB_NO_ACTION,"Copyright 1997, All rights reserved."); + set_left_button(NLS - 1,LB_TEXT,LB_NO_ACTION,version()); + show_right_bar(); + show_palette_bar(false); +} + +void cScenButtonsBars::reset_right(long newMaximum) +{ + show_right_bar(); + show_palette_bar(false); + + right_bar->setPosition(0);; + reset_right_bar_and_buttons(); + right_bar->setMaximum(newMaximum); +} + +bool cScenButtonsBars::handle_one_event(const sf::Event& event) +{ + for (auto& listener : scen_controls.event_listeners) { + if(listener.second->handle_event(event)) return true; + } + return false; +} + void cScenButtonsBars::draw_left_buttons() { for(short i = 0; i < NLS; i++) draw_left_slot(i,0); @@ -191,6 +316,27 @@ void cScenButtonsBars::reset_right_bar_and_buttons() { right_bar->setPosition(0); } +void cScenButtonsBars::draw_palette(bool editing_town) const +{ + rectangle palette_to = palette_button_base; + palette_to.offset(5,terrain_rects[255].bottom + 14); + auto const &editor_mixed = *ResMgr::textures.get("edbuttons"); + auto const &cur_palette_buttons = editing_town ? town_buttons : out_buttons; + for(short i = 0; i < 10; i++){ + for(short j = 0; j < 6; j++){ + if(cur_palette_buttons[j][i] != PAL_BLANK) { + rectangle palette_from = palette_button_base; + palette_from.offset(-RIGHT_AREA_UL_X, -RIGHT_AREA_UL_Y); + int n = cur_palette_buttons[j][i]; + palette_from.offset((n%10) * 25, (n/10) * 17); + rect_draw_some_item(editor_mixed, palette_from, mainPtr, palette_to, sf::BlendAlpha); + } + palette_to.offset(0,17); + } + palette_to.offset(25,-6*17); + } +} + void cScenButtonsBars::init_bar(std::shared_ptr& sbar, const std::string& name, rectangle const &rect, rectangle const &events_rect, int pgSz) { sbar.reset(new cScrollbar(mainPtr)); sbar->setBounds(rect); diff --git a/src/scenedit/scen.btnmg.hpp b/src/scenedit/scen.btnmg.hpp index e2b6c804..16a5bd73 100644 --- a/src/scenedit/scen.btnmg.hpp +++ b/src/scenedit/scen.btnmg.hpp @@ -3,6 +3,7 @@ #include #include +#include "scen.global.hpp" #include "scrollbar.hpp" enum eLBAction { @@ -102,21 +103,42 @@ public: void draw_right_slot(short which,short mode) const ; void set_right_button(short slot, eRBAction action, int i, std::string const &label, bool do_draw = false); void reset_right_bar_and_buttons(); + void reset_right(long newMaximum); + + void draw_palette(bool editing_town) const; + + void set_startup_screen(); + void set_main_screen(location const &cur_out, int cur_town, std::string const &town_name); + bool handle_one_event(const sf::Event& event); + protected: void init_bar(std::shared_ptr& sbar, const std::string& name, rectangle const &rect, rectangle const &events_rect, int pgSz); public: std::array left_buttons; std::array left_buttons_rectangles; // 0 - whole, 1 - blue button - std::vector right_buttons; - std::array right_buttons_rectangles; - rectangle terrain_rectangle; // the terrain main rectangle rectangle terrain_border_rects[4]; // border rects order: top, left, bottom, right rectangle terrain_rects[256]; - - std::shared_ptr right_bar, palette_bar; + rectangle terrain_buttons_rect; + rectangle const terrain_base_small_button_from = {120,0,127,7}; + // right: one big part + std::vector right_buttons; + std::array right_buttons_rectangles; + std::shared_ptr right_bar; + + // right: two part + // ---- top ------- + std::shared_ptr palette_bar; // big and half size right scrollbar + + // ---- bottom ------- + rectangle palette_buttons[10][6]; + static ePalBtn out_buttons[6][10], town_buttons[6][10]; +protected: + rectangle palette_button_base; + +protected: std::unordered_map> event_listeners; }; diff --git a/src/scenedit/scen.core.cpp b/src/scenedit/scen.core.cpp index a250e90b..d1ff2bfa 100644 --- a/src/scenedit/scen.core.cpp +++ b/src/scenedit/scen.core.cpp @@ -41,8 +41,6 @@ extern bool editing_town; extern short cur_viewing_mode; extern cTown* town; extern cOutdoors* current_terrain; -extern short mode_count,to_create; -extern ter_num_t template_terrain[64][64]; extern cScenario scenario; extern cCustomGraphics spec_scen_g; extern location cur_out; diff --git a/src/scenedit/scen.graphics.cpp b/src/scenedit/scen.graphics.cpp index ef30b4b0..9b32f961 100644 --- a/src/scenedit/scen.graphics.cpp +++ b/src/scenedit/scen.graphics.cpp @@ -51,11 +51,6 @@ cCustomGraphics spec_scen_g; const sf::Color hilite_colour = {0xff, 0x00, 0x80, 0x40}; // begin new stuff -rectangle base_small_button_from = {120,0,127,7}; -extern rectangle palette_buttons[10][6]; -extern ePalBtn town_buttons[6][10], out_buttons[6][10]; -static rectangle palette_button_base = {0,0,18,26}; -rectangle terrain_buttons_rect = {0,0,410,294}; std::string current_string[2]; static short get_small_icon(ter_num_t ter){ @@ -290,26 +285,6 @@ static std::vector get_small_icons(location at, ter_num_t t_to_draw) { return icons; } -void Set_up_win() { - terrain_buttons_rect.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y); - palette_button_base.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y); - - for(short i = 0; i < 10; i++) - for(short j = 0; j < 6; j++) { - palette_buttons[i][j] = palette_button_base; - palette_buttons[i][j].offset(i * 25, j * 17); - } - for(short i = 0; i < 10; i++) - for(short j = /*2*/0; j < 6; j++) - palette_buttons[i][j].offset(0, 3); - for(short i = 0; i < 10; i++) - for(short j = /*3*/0; j < 6; j++) - palette_buttons[i][j].offset(0, 3); - for(short i = 0; i < 10; i++) - for(short j = /*4*/0; j < 6; j++) - palette_buttons[i][j].offset(0, 3); -} - void run_startup_g() { sf::Event event; auto & pict_to_draw = *ResMgr::textures.get("edsplash", true); @@ -407,9 +382,8 @@ void set_up_terrain_buttons(bool reset) { if(draw_mode == DRAW_MONST) first++, max++; int end = min(first + 256, max); - rectangle palette_from,palette_to = palette_button_base; short pic,small_i; - rectangle ter_from,ter_from_base = {0,0,36,28}, ter_plus_from = {148,235,164,251}; + rectangle ter_from; rectangle tiny_from,tiny_to; // first make terrain buttons @@ -420,6 +394,7 @@ void set_up_terrain_buttons(bool reset) { switch(draw_mode){ case DRAW_TERRAIN: { if(i == scenario.ter_types.size()) { + rectangle ter_plus_from = {148,235,164,251}; rect_draw_some_item(editor_mixed, ter_plus_from, mainPtr, draw_rect); break; } @@ -427,7 +402,7 @@ void set_up_terrain_buttons(bool reset) { if (cPict::get_picture(scenario.get_terrain(i).get_picture_num(), source_gworld, ter_from)) rect_draw_some_item(source_gworld,ter_from, mainPtr, draw_rect); small_i = get_small_icon(i); - tiny_from = base_small_button_from; + tiny_from = controls.terrain_base_small_button_from; tiny_from.offset(7 * (small_i % 30),7 * (small_i / 30)); tiny_to = draw_rect; tiny_to.top = tiny_to.bottom - 7; @@ -547,23 +522,8 @@ void set_up_terrain_buttons(bool reset) { } } - if(overall_mode < MODE_MAIN_SCREEN) { - palette_to.offset(5,controls.terrain_rects[255].bottom + 14); - for(short i = 0; i < 10; i++){ - for(short j = 0; j < 6; j++){ - auto cur_palette_buttons = editing_town ? town_buttons : out_buttons; - if(cur_palette_buttons[j][i] != PAL_BLANK) { - palette_from = palette_button_base; - palette_from.offset(-RIGHT_AREA_UL_X, -RIGHT_AREA_UL_Y); - int n = cur_palette_buttons[j][i]; - palette_from.offset((n%10) * 25, (n/10) * 17); - rect_draw_some_item(editor_mixed, palette_from, mainPtr, palette_to, sf::BlendAlpha); - } - palette_to.offset(0,17); - } - palette_to.offset(25,-6*17); - } - } + if(overall_mode < MODE_MAIN_SCREEN) + controls.draw_palette(editing_town); } void draw_terrain(){ @@ -1085,7 +1045,7 @@ static void place_selected_terrain(ter_num_t ter, rectangle draw_rect) { rectangle tiny_to = draw_rect; tiny_to.top = tiny_to.bottom - 7; tiny_to.left = tiny_to.right - 7; - rectangle tiny_from = base_small_button_from; + rectangle tiny_from = scen_controls.terrain_base_small_button_from; tiny_from.offset(7 * (small_i % 30),7 * (small_i / 30)); if(small_i >= 0 && small_i < 255) rect_draw_some_item(*ResMgr::textures.get("edbuttons"),tiny_from,mainPtr,tiny_to); @@ -1093,20 +1053,20 @@ static void place_selected_terrain(ter_num_t ter, rectangle draw_rect) { void place_location() { std::ostringstream sout; + auto &controls=scen_controls; rectangle draw_rect,source_rect; rectangle text_rect = {0,0,12,100}; text_rect.offset(RIGHT_AREA_UL_X,RIGHT_AREA_UL_Y); short picture_wanted; - tileImage(mainPtr, terrain_buttons_rect, bg[17]); - frame_rect(mainPtr, terrain_buttons_rect, sf::Color::Black); + tileImage(mainPtr, controls.terrain_buttons_rect, bg[17]); + frame_rect(mainPtr, controls.terrain_buttons_rect, sf::Color::Black); location mouse = translate_mouse_coordinates(sf::Mouse::getPosition(mainPtr)); - auto &controls=scen_controls; draw_rect = text_rect; draw_rect.offset({5, controls.terrain_rects[255].top + 18}); if(overall_mode < MODE_MAIN_SCREEN) { // std::cout << "Mouse: " << mouse << " Buttons: " << terrain_buttons_rect << " Terrain: " << terrain_rect << std::endl; - if(mouse.in(terrain_buttons_rect)) { + if(mouse.in(controls.terrain_buttons_rect)) { location rel_mouse = mouse; rel_mouse.x -= RIGHT_AREA_UL_X; rel_mouse.y -= RIGHT_AREA_UL_Y; @@ -1165,8 +1125,8 @@ void place_location() { win_draw_string(mainPtr, draw_rect, current_string[1], eTextMode::LEFT_TOP, style); } - draw_rect.top = palette_buttons[0][0].top + controls.terrain_rects[255].bottom + 5; - draw_rect.left = palette_buttons[9][0].right + 10; // + 17; + draw_rect.top = controls.palette_buttons[0][0].top + controls.terrain_rects[255].bottom + 5; + draw_rect.left = controls.palette_buttons[9][0].right + 10; // + 17; draw_rect.bottom = draw_rect.top + 36; draw_rect.right = draw_rect.left + 28; diff --git a/src/scenedit/scen.graphics.hpp b/src/scenedit/scen.graphics.hpp index 0762c0c7..e8e0b43e 100644 --- a/src/scenedit/scen.graphics.hpp +++ b/src/scenedit/scen.graphics.hpp @@ -5,7 +5,6 @@ #include "fields.hpp" #include "location.hpp" -void Set_up_win (); void run_startup_g(); void load_graphics(); void draw_main_screen(); diff --git a/src/scenedit/scen.keydlgs.cpp b/src/scenedit/scen.keydlgs.cpp index 64a50d51..7920c5dd 100644 --- a/src/scenedit/scen.keydlgs.cpp +++ b/src/scenedit/scen.keydlgs.cpp @@ -24,10 +24,9 @@ extern short cen_x, cen_y; extern short cur_viewing_mode; -extern cTown* town; -extern short mode_count,to_create; -extern ter_num_t template_terrain[64][64]; extern cScenario scenario; +extern cTown* town; +extern short mode_count; extern cOutdoors* current_terrain; extern cCustomGraphics spec_scen_g; diff --git a/src/scenedit/scen.main.cpp b/src/scenedit/scen.main.cpp index 9452faf7..d0e32f1f 100644 --- a/src/scenedit/scen.main.cpp +++ b/src/scenedit/scen.main.cpp @@ -191,7 +191,6 @@ void init_scened(int argc, char* argv[]) { scen_controls.init(); - Set_up_win(); load_graphics(); cDialog::init(); if(get_bool_pref("ShowStartupLogo", true)) @@ -263,11 +262,8 @@ void handle_events() { } void handle_one_event(const sf::Event& event) { - - // Check if any of the event listeners want this event. - for (auto& listener : scen_controls.event_listeners) { - if(listener.second->handle_event(event)) return; - } + if (scen_controls.handle_one_event(event)) + return; switch(event.type) { case sf::Event::KeyPressed: diff --git a/src/scenedit/scen.townout.cpp b/src/scenedit/scen.townout.cpp index 4d722ce1..c83e22fc 100644 --- a/src/scenedit/scen.townout.cpp +++ b/src/scenedit/scen.townout.cpp @@ -28,8 +28,7 @@ extern short cen_x, cen_y, overall_mode; extern bool editing_town,change_made; extern short cur_viewing_mode; extern cTown* town; -extern short mode_count,to_create,cur_town; -extern ter_num_t template_terrain[64][64]; +extern short cur_town; extern cScenario scenario; extern cOutdoors* current_terrain; extern location cur_out;