Allow create new or load party after selecting scenario

This commit is contained in:
2025-08-02 17:37:11 -05:00
parent 9ed4dd00e3
commit a1312e357f
2 changed files with 63 additions and 44 deletions

View File

@@ -65,6 +65,8 @@ extern cCustomGraphics spec_scen_g;
extern std::map<eSkill,short> skill_max; extern std::map<eSkill,short> skill_max;
extern void give_help_and_record(short help1, short help2, bool help_forced = false); extern void give_help_and_record(short help1, short help2, bool help_forced = false);
extern void post_load(); extern void post_load();
extern void start_new_game(bool force = false);
extern void do_load();
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;
@@ -1815,6 +1817,7 @@ class cChooseScenario {
bool doSelectScenario(int which) { bool doSelectScenario(int which) {
int page = dynamic_cast<cStack&>(me["list"]).getPage(); int page = dynamic_cast<cStack&>(me["list"]).getPage();
scen_header_type scen;
if(page == 0) { if(page == 0) {
scen_header_type prefab; scen_header_type prefab;
switch(which) { switch(which) {
@@ -1827,31 +1830,47 @@ class cChooseScenario {
prefab.prog_make_ver[0] = 2; prefab.prog_make_ver[0] = 2;
prefab.prog_make_ver[1] = 0; prefab.prog_make_ver[1] = 0;
prefab.prog_make_ver[2] = 0; prefab.prog_make_ver[2] = 0;
me.setResult<scen_header_type>(prefab); scen = prefab;
me.toast(true);
} else { } else {
int scen_hit = which + (page - 1) * 3; int scen_hit = which + (page - 1) * 3;
if(scen_hit >= scen_headers.size()) return false; if(scen_hit >= scen_headers.size()) return false;
scen = scen_headers[scen_hit];
// Show text files, Offer to load prefab party }
auto scen = scen_headers[scen_hit];
std::vector<fs::path> files = extra_files(locate_scenario(scen.file));
if(!files.empty()){
std::vector<std::string> choices; std::vector<std::string> choices;
std::vector<std::function<void(cButtonPanel&)>> handlers; std::vector<std::function<void(cButtonPanel&)>> handlers;
// If no party is loaded, offer to load default or create new
if(!party_in_memory){
choices.push_back("Create new party");
handlers.push_back([](cButtonPanel& dlg) -> void {
start_new_game();
if(party_in_memory){
dlg->getControl("done").show();
}
});
choices.push_back("Load a party");
handlers.push_back([](cButtonPanel& dlg) -> void {
do_load();
if(party_in_memory){
dlg->getControl("done").show();
}
});
}
// Show text files, Offer to load prefab party
std::vector<fs::path> files = extra_files(locate_scenario(scen.file));
for(fs::path file : files){ for(fs::path file : files){
std::string ext = file.extension().string(); std::string ext = file.extension().string();
std::transform(ext.begin(), ext.end(), ext.begin(), tolower); std::transform(ext.begin(), ext.end(), ext.begin(), tolower);
if(ext == ".sav"){ if(ext == ".sav"){
choices.push_back("Load premade party: " + file.filename().string()); choices.push_back("Load premade party: " + file.filename().string());
handlers.push_back([file](cButtonPanel&) -> void { handlers.push_back([file](cButtonPanel& dlg) -> void {
if(!load_party(file, univ, spec_scen_g)) { if(!load_party(file, univ, spec_scen_g)) {
std::cout << "Failed to load save file: " << file << std::endl; std::cout << "Failed to load save file: " << file << std::endl;
}else{ }else{
finish_load_party(); finish_load_party();
if(overall_mode != MODE_STARTUP) if(overall_mode != MODE_STARTUP)
post_load(); post_load();
dlg->getControl("done").show();
} }
}); });
}else{ }else{
@@ -1862,7 +1881,11 @@ class cChooseScenario {
} }
} }
if(!choices.empty()){
cButtonPanel panel(choices, handlers, scen.name, "Launch", &me); cButtonPanel panel(choices, handlers, scen.name, "Launch", &me);
if(!party_in_memory){
panel->getControl("done").hide();
}
dynamic_cast<cPict&>(panel->getControl("pic")).setPict(scen.intro_pic,PIC_SCEN); dynamic_cast<cPict&>(panel->getControl("pic")).setPict(scen.intro_pic,PIC_SCEN);
if(panel.show()){ if(panel.show()){
// Launch pressed. // Launch pressed.
@@ -1876,7 +1899,6 @@ class cChooseScenario {
me.toast(true); me.toast(true);
} }
}
return true; return true;
} }

View File

@@ -91,9 +91,6 @@ void handle_startup_button_click(eStartButton btn, eKeyMod mods) {
force_party = true; force_party = true;
start_new_game(true); start_new_game(true);
} else {
cChoiceDlog("need-party").show();
break;
} }
} }