Refactor out some dialog globals

This commit is contained in:
2016-09-13 22:14:21 -04:00
parent 7008bf9149
commit 67dc5b3511

View File

@@ -33,7 +33,7 @@
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>
#include "prefs.hpp" #include "prefs.hpp"
#include "shop.hpp" #include "shop.hpp"
#define NUM_HINTS 30 #include "restypes.hpp"
extern short stat_window; extern short stat_window;
extern eGameMode overall_mode; extern eGameMode overall_mode;
@@ -59,7 +59,6 @@ extern std::vector<scen_header_type> scen_headers;
short sign_mode,person_graphic,store_person_graphic,store_sign_mode; short sign_mode,person_graphic,store_person_graphic,store_sign_mode;
long num_talk_entries; long num_talk_entries;
char null_string[256] = ""; char null_string[256] = "";
short store_tip_page_on = 0;
extern bool party_in_memory; extern bool party_in_memory;
// Talking vars // Talking vars
@@ -96,8 +95,6 @@ rectangle shop_frame = {62,10,352,269};
rectangle shop_done_rect = {388,212,411,275}; rectangle shop_done_rect = {388,212,411,275};
short shop_array[30]; short shop_array[30];
short store_scen_page_on,store_num_scen;
cShop active_shop; cShop active_shop;
short active_shop_num; short active_shop_num;
@@ -1317,33 +1314,32 @@ void edit_party() {
} }
static bool tip_of_day_event_filter(cDialog& me, std::string item_hit, eKeyMod) { static bool tip_of_day_event_filter(cDialog& me, std::string item_hit, short& page) {
std::string place_str; std::string place_str;
if(item_hit == "done") { if(item_hit == "done") {
me.toast(true); me.toast(true);
} else if(item_hit == "next") { } else if(item_hit == "next") {
store_tip_page_on++; page++;
if(store_tip_page_on == NUM_HINTS) if(page == ResMgr::get<StringRsrc>("tips")->size() - 50)
store_tip_page_on = 0; page = 0;
place_str = get_str("tips",50 + store_tip_page_on); place_str = get_str("tips",50 + page);
me["tip"].setText(place_str); me["tip"].setText(place_str);
} }
return true; return true;
} }
void tip_of_day() { void tip_of_day() {
std::string place_str; using namespace std::placeholders;
store_tip_page_on = get_ran(1,0,NUM_HINTS - 1); short page = get_ran(1,0,ResMgr::get<StringRsrc>("tips")->size() - 51);
make_cursor_sword(); make_cursor_sword();
cDialog tips("tip-of-day"); cDialog tips("tip-of-day");
tips.attachClickHandlers(&tip_of_day_event_filter,{"done","next"}); tips.attachClickHandlers(std::bind(tip_of_day_event_filter, _1, _2, std::ref(page)),{"done","next"});
place_str = get_str("tips",50 + store_tip_page_on); tips["tip"].setText(get_str("tips",50 + page));
tips["tip"].setText(place_str);
cLed& showAtStart = dynamic_cast<cLed&>(tips["onstart"]); cLed& showAtStart = dynamic_cast<cLed&>(tips["onstart"]);
showAtStart.setState(get_bool_pref("GiveIntroHint", true) ? led_red : led_off); showAtStart.setState(get_bool_pref("GiveIntroHint", true) ? led_red : led_off);
@@ -1354,7 +1350,7 @@ void tip_of_day() {
} }
static void put_scen_info(cDialog& me) { static void put_scen_info(cDialog& me, short page) {
std::ostringstream sout; std::ostringstream sout;
static const char *difficulty[] = {"Low","Medium","High","Very High"}; static const char *difficulty[] = {"Low","Medium","High","Very High"};
@@ -1363,18 +1359,18 @@ static void put_scen_info(cDialog& me) {
sout.str(""); sout.str("");
sout << i + 1; sout << i + 1;
std::string n = sout.str(); std::string n = sout.str();
if(scen_headers.size() > (store_scen_page_on * 3 + i)) { if(scen_headers.size() > (page * 3 + i)) {
me["pic" + n].show(); me["pic" + n].show();
dynamic_cast<cPict&>(me["pic" + n]).setPict(scen_headers[store_scen_page_on * 3 + i].intro_pic); dynamic_cast<cPict&>(me["pic" + n]).setPict(scen_headers[page * 3 + i].intro_pic);
sout.str(""); sout.str("");
sout << scen_headers[store_scen_page_on * 3 + i].name; sout << scen_headers[page * 3 + i].name;
sout << " v" << int(scen_headers[store_scen_page_on * 3 + i].ver[0]); sout << " v" << int(scen_headers[page * 3 + i].ver[0]);
sout << '.' << int(scen_headers[store_scen_page_on * 3 + i].ver[1]); sout << '.' << int(scen_headers[page * 3 + i].ver[1]);
sout << '.' << int(scen_headers[store_scen_page_on * 3 + i].ver[2]); sout << '.' << int(scen_headers[page * 3 + i].ver[2]);
sout << " - | Difficulty: " << difficulty[scen_headers[store_scen_page_on * 3 + i].difficulty]; sout << " - | Difficulty: " << difficulty[scen_headers[page * 3 + i].difficulty];
sout << ", Rating: " << scen_headers[store_scen_page_on * 3 + i].rating; sout << ", Rating: " << scen_headers[page * 3 + i].rating;
sout << " |" << scen_headers[store_scen_page_on * 3 + i].who1; sout << " |" << scen_headers[page * 3 + i].who1;
sout << " |" << scen_headers[store_scen_page_on * 3 + i].who2; sout << " |" << scen_headers[page * 3 + i].who2;
me["desc" + n].setText(sout.str()); me["desc" + n].setText(sout.str());
me["start" + n].show(); me["start" + n].show();
} }
@@ -1386,50 +1382,46 @@ static void put_scen_info(cDialog& me) {
} }
} }
static bool pick_a_scen_event_filter(cDialog& me, std::string item_hit, eKeyMod) { static bool pick_a_scen_event_filter(cDialog& me, std::string item_hit, short& page) {
if(item_hit == "cancel") { if(item_hit == "cancel") {
me.setResult<short>(-1); me.setResult<short>(-1);
me.toast(false); me.toast(false);
} else if(item_hit == "next") { } else if(item_hit == "next") {
if(store_scen_page_on == 0) if(page == 0)
store_scen_page_on = (store_num_scen - 1) / 3; page = (scen_headers.size() - 1) / 3;
else store_scen_page_on--; else page--;
put_scen_info(me); put_scen_info(me, page);
} else if(item_hit == "prev") { } else if(item_hit == "prev") {
if(store_scen_page_on == (store_num_scen - 1) / 3) if(page == (scen_headers.size() - 1) / 3)
store_scen_page_on = 0; page = 0;
else store_scen_page_on++; else page++;
put_scen_info(me); put_scen_info(me, page);
} else if(item_hit.substr(0,item_hit.length()-1) == "start") { } else if(item_hit.substr(0,item_hit.length()-1) == "start") {
int scen_hit = item_hit[item_hit.length()-1] - '1'; int scen_hit = item_hit[item_hit.length()-1] - '1';
me.setResult<short>(scen_hit + store_scen_page_on * 3); me.setResult<short>(scen_hit + page * 3);
me.toast(true); me.toast(true);
} }
return true; return true;
} }
short pick_a_scen() { short pick_a_scen() {
using namespace std::placeholders;
// TODO: Add a button to jump to the scenarios folder
build_scen_headers(); build_scen_headers();
store_num_scen = scen_headers.size(); if(scen_headers.empty()) {
// for(short i = 0; i < 25; i++)
// if(scen_headers[i].flag1 != 0)
// store_num_scen++;
store_scen_page_on = 0;
if(store_num_scen == 0) {
cChoiceDlog("no-scenarios").show(); cChoiceDlog("no-scenarios").show();
return -1; return -1;
} }
make_cursor_sword(); make_cursor_sword();
cDialog pickScen("pick-scenario"); cDialog pickScen("pick-scenario");
pickScen.attachClickHandlers(pick_a_scen_event_filter, {"cancel", "next", "prev", "start1", "start2", "start3"}); short page = 0;
pickScen.attachClickHandlers(std::bind(pick_a_scen_event_filter, _1, _2, std::ref(page)), {"cancel", "next", "prev", "start1", "start2", "start3"});
put_scen_info(pickScen); put_scen_info(pickScen, 0);
if(store_num_scen <= 3) { if(scen_headers.size() <= 3) {
pickScen["next"].hide(); pickScen["next"].hide();
pickScen["prev"].hide(); pickScen["prev"].hide();
} }