diff --git a/src/game/boe.main.cpp b/src/game/boe.main.cpp index fe8e12bd..696ee82f 100644 --- a/src/game/boe.main.cpp +++ b/src/game/boe.main.cpp @@ -83,8 +83,8 @@ std::string scenario_temp_dir_name = "scenario"; extern fs::path tempDir; std::vector extra_scen_dirs; boost::optional scen_arg_path; -boost::optional scen_arg_town, scen_arg_town_entrance, scen_arg_out_x, scen_arg_out_y, scen_arg_x, scen_arg_y; - +boost::optional scen_arg_town, scen_arg_town_entrance; +boost::optional scen_arg_out_sec, scen_arg_loc; struct cParseEntrance { boost::optional& opt; @@ -122,6 +122,20 @@ struct cParseEntrance { } }; +struct cParseLocation { + boost::optional& opt; + cParseLocation(boost::optional& opt) : opt(opt) {} + ParserResult operator()(std::string v) const { + try{ + opt = boost::lexical_cast(v); + return ParserResult::ok( ParseResultType::Matched ); + } + catch(boost::bad_lexical_cast){ + return ParserResult::logicError( "Invalid location: '" + v + "'. Try '(x,y)' format."); + } + } +}; + /* Display globals */ short combat_posing_monster = -1, current_working_monster = -1; // 0-5 PC 100 + x - monster x short fast_bang = false; // Note: This mostly behaves as a boolean variable, but values other than 1 are assigned to it, so I made it a short @@ -309,10 +323,8 @@ static void process_args(int argc, char* argv[]) { cli |= clara::Opt(scen_arg_path, "scen-path")["--scenario"]("Launch a scenario, with the default party if no party is loaded."); cli |= clara::Opt(scen_arg_town, "town")["--town"]("Put the party in a town."); cli |= clara::Opt(cParseEntrance(scen_arg_town_entrance), "entrance")["--entrance"]("Put the party at a town entrance point."); - cli |= clara::Opt(scen_arg_out_x, "x")["--out-x"]("Put the party in an outdoor section (x coordinate)."); - cli |= clara::Opt(scen_arg_out_y, "y")["--out-y"]("Put the party in an outdoor section (y coordinate)."); - cli |= clara::Opt(scen_arg_x, "x")["--x"]("Put the party at a location (x coordinate)."); - cli |= clara::Opt(scen_arg_y, "y")["--y"]("Put the party at a location (y coordinate)."); + cli |= clara::Opt(cParseLocation(scen_arg_out_sec), "(x,y)")["--out-sec"]("Put the party in an outdoor section."); + cli |= clara::Opt(cParseLocation(scen_arg_loc), "(x,y)")["--loc"]("Put the party at a location."); // Party option: cli |= clara::Arg(saved_game, "save-file")("Launch and load a saved game file."); @@ -372,17 +384,11 @@ static void process_args(int argc, char* argv[]) { post_load(); } - if(scen_arg_town && (scen_arg_out_x || scen_arg_out_y)){ - std::cout << "Warning: --out-x and --out-y conflict with --town and will be ignored." << std::endl; + if(scen_arg_town && scen_arg_out_sec){ + std::cout << "Warning: --out-sec conflicts with --town and will be ignored." << std::endl; } - if((scen_arg_out_x || scen_arg_out_y) && !(scen_arg_out_x && scen_arg_out_y)){ - std::cout << "Warning: --out-x and --out-y must both be supplied. Partial outdoor coordinate input will be ignored." << std::endl; - } - if(scen_arg_town_entrance && (scen_arg_x || scen_arg_y)){ - std::cout << "Warning: --x and --y conflict with --entrance and will be ignored." << std::endl; - } - if((scen_arg_x || scen_arg_y) && !(scen_arg_x && scen_arg_y)){ - std::cout << "Warning: --x and --y must both be supplied. Partial coordinate input will be ignored." << std::endl; + if(scen_arg_town_entrance && scen_arg_loc){ + std::cout << "Warning: --loc conflicts with --entrance and will be ignored." << std::endl; } } @@ -412,7 +418,7 @@ static void handle_scenario_args() { } } if(!univ.party.is_in_scenario()){ - put_party_in_scen(path.filename().string(), scen_arg_town || scen_arg_out_x); + put_party_in_scen(path.filename().string(), scen_arg_town || scen_arg_out_sec); } }else{ std::cerr << "Failed to load scenario: " << *scen_arg_path << std::endl; @@ -460,23 +466,22 @@ static void handle_scenario_args() { location town_location; if(scen_arg_town_entrance){ town_entrance = *scen_arg_town_entrance; - }else if(scen_arg_x && scen_arg_y){ - town_location = location(*scen_arg_x, *scen_arg_y); + }else if(scen_arg_loc){ town_entrance = 9; } - force_town_enter(*scen_arg_town, town_location); + force_town_enter(*scen_arg_town, *scen_arg_loc); start_town_mode(*scen_arg_town, town_entrance); - }else if(scen_arg_out_x && scen_arg_out_y){ + }else if(scen_arg_out_sec){ if(!party_in_memory || !univ.party.is_in_scenario() || - univ.scenario.outdoors.width() < (*scen_arg_out_x + 1) || - univ.scenario.outdoors.height() < (*scen_arg_out_y + 1)){ - std::cerr << "Expected a party loaded within a scenario with at least " << (*scen_arg_out_x + 1) << "x" << (*scen_arg_out_y +1) << " outdoor sections" << std::endl; + univ.scenario.outdoors.width() < (scen_arg_out_sec->x + 1) || + univ.scenario.outdoors.height() < (scen_arg_out_sec->y + 1)){ + std::cerr << "Expected a party loaded within a scenario with at least " << (scen_arg_out_sec->x + 1) << "x" << (scen_arg_out_sec->y + 1) << " outdoor sections" << std::endl; exit(1); } - if(scen_arg_x && scen_arg_y){ + if(scen_arg_loc){ overall_mode = MODE_OUTDOORS; - position_party(*scen_arg_out_x,*scen_arg_out_y,*scen_arg_x,*scen_arg_y); + position_party(scen_arg_out_sec->x,scen_arg_out_sec->y,scen_arg_loc->x,scen_arg_loc->y); clear_map(); update_explored(univ.party.out_loc); redraw_screen(REFRESH_ALL);