Scenario transition refactoring
Carryover gold and recalls handled out of game
This commit is contained in:
parent
85981e784e
commit
e6f0fe42bc
3 changed files with 72 additions and 88 deletions
|
@ -64,23 +64,27 @@ static lg::log_domain log_enginerefac("enginerefac");
|
|||
#define LOG_RG LOG_STREAM(info, log_enginerefac)
|
||||
|
||||
carryover::carryover(const config& side)
|
||||
: save_id_(side["save_id"])
|
||||
, gold_(side["gold"].to_int())
|
||||
, add_(side["gold_add"].to_bool())
|
||||
: add_(side["gold_add"].to_bool())
|
||||
, color_(side["color"])
|
||||
, current_player_(side["current_player"])
|
||||
, gold_(side["gold"].to_int())
|
||||
, name_(side["name"])
|
||||
, previous_recruits_()
|
||||
, recall_list_()
|
||||
, save_id_(side["save_id"])
|
||||
{
|
||||
std::string recruits = side["previous_recruits"];
|
||||
std::size_t begin = 0;
|
||||
std::size_t pos = 0;
|
||||
while(pos != recruits.npos){
|
||||
pos = recruits.find(',', begin);
|
||||
previous_recruits_.insert(recruits.substr(begin, pos-begin));
|
||||
begin = pos + 1;
|
||||
}
|
||||
//TODO: remove once confirmed
|
||||
// std::string recruits = side["previous_recruits"];
|
||||
// std::size_t begin = 0;
|
||||
// std::size_t pos = 0;
|
||||
// while(pos != recruits.npos){
|
||||
// pos = recruits.find(',', begin);
|
||||
// previous_recruits_.insert(recruits.substr(begin, pos-begin));
|
||||
// begin = pos + 1;
|
||||
// }
|
||||
|
||||
std::vector<std::string> temp_recruits = utils::split(side["previous_recruits"], ',');
|
||||
previous_recruits_.insert(temp_recruits.begin(), temp_recruits.end());
|
||||
|
||||
foreach(const config& u, side.child_range("unit")){
|
||||
recall_list_.push_back(unit(u));
|
||||
|
@ -88,48 +92,62 @@ carryover::carryover(const config& side)
|
|||
}
|
||||
|
||||
carryover::carryover(const team& t, const int gold, const bool add)
|
||||
: save_id_(t.save_id())
|
||||
, gold_(gold)
|
||||
, add_ (add)
|
||||
: add_ (add)
|
||||
, color_(t.color())
|
||||
, current_player_(t.current_player())
|
||||
, gold_(gold)
|
||||
, name_(t.name())
|
||||
, previous_recruits_(t.recruits())
|
||||
, recall_list_(t.recall_list())
|
||||
, save_id_(t.save_id())
|
||||
{}
|
||||
|
||||
//TODO: remove
|
||||
//carryover::carryover(const std::string& save_id, const std::set<std::string>& recruits)
|
||||
// : save_id_(save_id)
|
||||
// , gold_()
|
||||
// , add_()
|
||||
// , color_()
|
||||
// , current_player_()
|
||||
// , name_()
|
||||
// , previous_recruits_(recruits)
|
||||
// , recall_list_()
|
||||
// {}
|
||||
|
||||
static const int default_gold_qty = 100;
|
||||
|
||||
void carryover::transfer_all_gold_to(config& side_cfg){
|
||||
LOG_RG <<"config gold before default " <<side_cfg["gold"]<<"\n";
|
||||
|
||||
int cfg_gold = side_cfg["gold"].to_int();
|
||||
if(cfg_gold == 0) {
|
||||
|
||||
if(side_cfg["gold"].empty()) {
|
||||
cfg_gold = default_gold_qty;
|
||||
side_cfg["gold"] = cfg_gold;
|
||||
}
|
||||
LOG_RG <<"config gold after default " <<side_cfg["gold"]<<"\n";
|
||||
|
||||
if(add_){
|
||||
side_cfg["gold"] = cfg_gold + gold_;
|
||||
gold_ = 0;
|
||||
}
|
||||
else if(gold_ > cfg_gold){
|
||||
side_cfg["gold"] = gold_;
|
||||
gold_ = 0;
|
||||
}
|
||||
|
||||
gold_ = 0;
|
||||
}
|
||||
|
||||
void carryover::transfer_all_recruits_to(config& side_cfg){
|
||||
//TODO:remove
|
||||
// std::stringstream can_recruit;
|
||||
// for(std::set<std::string>::iterator i = previous_recruits_.begin(); i != previous_recruits_.end(); i++){
|
||||
// can_recruit << *i << ",";
|
||||
// previous_recruits_.erase(i);
|
||||
// }
|
||||
//
|
||||
// std::string can_recruit_str = can_recruit.str();
|
||||
// // Remove the trailing comma
|
||||
// if(can_recruit_str.empty() == false) {
|
||||
// can_recruit_str.resize(can_recruit_str.size()-1);
|
||||
// }
|
||||
|
||||
std::string can_recruit_str = utils::join(previous_recruits_, ",");
|
||||
previous_recruits_.clear();
|
||||
side_cfg["previous_recruits"] = can_recruit_str;
|
||||
}
|
||||
|
||||
void carryover::transfer_all_recalls_to(config& side_cfg){
|
||||
foreach(unit& u, recall_list_){
|
||||
config& new_unit = side_cfg.add_child("unit");
|
||||
u.write(new_unit);
|
||||
}
|
||||
recall_list_.clear();
|
||||
}
|
||||
|
||||
std::string carryover::get_recruits(bool erase){
|
||||
|
@ -156,22 +174,12 @@ void carryover::update_carryover(const team& t, const int gold, const bool add){
|
|||
name_ = t.name();
|
||||
previous_recruits_.insert(t.recruits().begin(), t.recruits().end());
|
||||
recall_list_.insert(recall_list_.end(), t.recall_list().begin(), t.recall_list().end());
|
||||
LOG_RG << "gold after carryover store" << str_cast<int>(gold_) << "\n";
|
||||
}
|
||||
|
||||
void carryover::initialize_team(config& side_cfg){
|
||||
transfer_all_gold_to(side_cfg);
|
||||
}
|
||||
|
||||
//TODO: remove
|
||||
//void carryover::add_recruits(const std::set<std::string>& recruits){
|
||||
// previous_recruits_.insert(recruits.begin(), recruits.end());
|
||||
//}
|
||||
//
|
||||
//void carryover::add_recall(const unit& u){
|
||||
// recall_list_.push_back(u);
|
||||
//}
|
||||
|
||||
const std::string carryover::to_string(){
|
||||
std::string side = "";
|
||||
side.append("Side " + save_id_ + ": gold " + str_cast<int>(gold_) + " recruits " + get_recruits(false) + " units ");
|
||||
|
@ -215,14 +223,6 @@ void carryover_info::add_side(const config& cfg) {
|
|||
carryover_sides_.push_back(carryover(cfg));
|
||||
}
|
||||
|
||||
//TODO: remove
|
||||
//void carryover_info::add_side(const team& t, const int gold, const bool add){
|
||||
// carryover_sides_.push_back(carryover(t, gold, add));
|
||||
//}
|
||||
//
|
||||
//void carryover_info::add_side(const std::string& save_id, const std::set<std::string>& recruits) {
|
||||
// carryover_sides_.push_back(carryover(save_id, recruits));
|
||||
//}
|
||||
|
||||
const end_level_data& carryover_info::get_end_level() const{
|
||||
return end_level_;
|
||||
|
@ -239,6 +239,17 @@ void carryover_info::transfer_from(const team& t, int carryover_gold){
|
|||
carryover_sides_.push_back(carryover(t, carryover_gold, end_level_.carryover_add));
|
||||
}
|
||||
|
||||
void carryover_info::transfer_all_to(config& side_cfg){
|
||||
foreach(carryover& side, carryover_sides_){
|
||||
if(side.get_save_id() == side_cfg["save_id"]){
|
||||
side.transfer_all_gold_to(side_cfg);
|
||||
side.transfer_all_recalls_to(side_cfg);
|
||||
side.transfer_all_recruits_to(side_cfg);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const config carryover_info::to_config() {
|
||||
config cfg;
|
||||
foreach(carryover& c, carryover_sides_){
|
||||
|
|
|
@ -42,42 +42,40 @@ typedef boost::shared_ptr<team_builder> team_builder_ptr;
|
|||
class carryover{
|
||||
public:
|
||||
carryover()
|
||||
: save_id_()
|
||||
, gold_()
|
||||
, add_ ()
|
||||
: add_ ()
|
||||
, color_()
|
||||
, current_player_()
|
||||
, gold_()
|
||||
, name_()
|
||||
, previous_recruits_()
|
||||
, recall_list_()
|
||||
, save_id_()
|
||||
{};
|
||||
// Turns config from a loaded savegame into carryover_info
|
||||
explicit carryover(const config& side);
|
||||
carryover(const team& t, const int gold, const bool add);
|
||||
//TODO: remove
|
||||
//carryover(const std::string& save_id, const std::set<std::string> & recruits);
|
||||
~carryover(){};
|
||||
|
||||
const std::string& get_save_id() const{ return save_id_; };
|
||||
void transfer_all_gold_to(config& side_cfg);
|
||||
std::string get_recruits(bool erase=false);
|
||||
std::vector<unit>& get_recall_list() { return recall_list_; };
|
||||
void transfer_all_recruits_to(config& side_cfg);
|
||||
void transfer_all_recalls_to(config& side_cfg);
|
||||
//std::vector<unit>& get_recall_list() { return recall_list_; };
|
||||
void update_carryover(const team& t, const int gold, const bool add);
|
||||
void initialize_team(config& side_cfg);
|
||||
//TODO: remove
|
||||
// void add_recruits(const std::set<std::string>& recruits);
|
||||
// void add_recall(const unit& u);
|
||||
const std::string to_string();
|
||||
void to_config(config& cfg);
|
||||
private:
|
||||
std::string save_id_;
|
||||
int gold_;
|
||||
bool add_;
|
||||
std::string color_;
|
||||
std::string current_player_;
|
||||
int gold_;
|
||||
std::string name_;
|
||||
std::set<std::string> previous_recruits_;
|
||||
std::vector<unit> recall_list_;
|
||||
std::string save_id_;
|
||||
|
||||
std::string get_recruits(bool erase=false);
|
||||
};
|
||||
|
||||
class carryover_info{
|
||||
|
@ -94,9 +92,9 @@ public:
|
|||
void add_side(const config& cfg);
|
||||
void add_side(const team& t, const int gold, const bool add);
|
||||
//TODO: remove
|
||||
//void add_side(const std::string& save_id, const std::set<std::string>& recruits);
|
||||
void set_end_level(const end_level_data& end_level) { end_level_ = end_level; };
|
||||
void transfer_from(const team& t, int carryover_gold);
|
||||
void transfer_all_to(config& side_cfg);
|
||||
const end_level_data& get_end_level() const;
|
||||
const config to_config();
|
||||
private:
|
||||
|
|
|
@ -74,20 +74,7 @@ typedef std::map<std::string, player_controller> controller_map;
|
|||
|
||||
static void team_init(config& level, game_state& gamestate){
|
||||
foreach(config& side_cfg, level.child_range("side")){
|
||||
carryover* side = gamestate.carryover_sides.get_side(side_cfg["save_id"]);
|
||||
|
||||
if(side == NULL ){ continue; }
|
||||
side->transfer_all_gold_to(side_cfg);
|
||||
std::string can_recruit_str = side->get_recruits(true);
|
||||
side_cfg["previous_recruits"] = can_recruit_str;
|
||||
|
||||
std::vector<unit>::iterator i = side->get_recall_list().begin();
|
||||
while( i != side->get_recall_list().end()){
|
||||
LOG_RG<<"adding unit " << i->name() << " \n";
|
||||
config& new_unit = side_cfg.add_child("unit");
|
||||
i->write(new_unit);
|
||||
i = side->get_recall_list().erase(i);
|
||||
}
|
||||
gamestate.carryover_sides.transfer_all_to(side_cfg);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -212,22 +199,16 @@ static LEVEL_RESULT playsingle_scenario(const config& game_config,
|
|||
const int ticks = SDL_GetTicks();
|
||||
int num_turns = (*level)["turns"].to_int(-1);
|
||||
|
||||
LOG_RG << "before level init "<< str_cast<int>((*level)["carryover_percentage"]) << "\n";
|
||||
|
||||
config init_level = *level;
|
||||
team_init(init_level, state_of_game);
|
||||
|
||||
LOG_RG << "after level init "<< str_cast<int>((*level)["carryover_percentage"]) << "\n";
|
||||
|
||||
LOG_NG << "creating objects... " << (SDL_GetTicks() - ticks) << "\n";
|
||||
playsingle_controller playcontroller(init_level, state_of_game, ticks, num_turns, game_config, disp.video(), skip_replay);
|
||||
LOG_NG << "created objects... " << (SDL_GetTicks() - playcontroller.get_ticks()) << "\n";
|
||||
|
||||
LEVEL_RESULT res = playcontroller.play_scenario(story, skip_replay);
|
||||
end_level = playcontroller.get_end_level_data_const();
|
||||
LOG_RG<< "carryover percentage before " << str_cast<int>(end_level.carryover_percentage) << "\n";
|
||||
state_of_game.carryover_sides.set_end_level(end_level);
|
||||
LOG_RG<< "carryover percentage after " << str_cast<int>(state_of_game.carryover_sides.get_end_level().carryover_percentage) << "\n";
|
||||
|
||||
if (res == DEFEAT) {
|
||||
if (resources::persist != NULL)
|
||||
|
@ -264,20 +245,14 @@ static LEVEL_RESULT playmp_scenario(const config& game_config,
|
|||
const int ticks = SDL_GetTicks();
|
||||
int num_turns = (*level)["turns"].to_int(-1);
|
||||
|
||||
LOG_RG << "before level init "<< str_cast<int>((*level)["carryover_percentage"]) << "\n";
|
||||
|
||||
config init_level = *level;
|
||||
team_init(init_level, state_of_game);
|
||||
|
||||
LOG_RG << "after level init "<< str_cast<int>((*level)["carryover_percentage"]) << "\n";
|
||||
|
||||
playmp_controller playcontroller(init_level, state_of_game, ticks, num_turns,
|
||||
game_config, disp.video(), skip_replay, io_type == IO_SERVER);
|
||||
LEVEL_RESULT res = playcontroller.play_scenario(story, skip_replay);
|
||||
end_level = playcontroller.get_end_level_data_const();
|
||||
LOG_RG<< "carryover percentage before " << str_cast<int>(end_level.carryover_percentage) << "\n";
|
||||
state_of_game.carryover_sides.set_end_level(end_level);
|
||||
LOG_RG<< "carryover percentage" << str_cast<int>(state_of_game.carryover_sides.get_end_level().carryover_percentage) << "\n";
|
||||
|
||||
//Check if the player started as mp client and changed to host
|
||||
if (io_type == IO_CLIENT && playcontroller.is_host())
|
||||
|
|
Loading…
Add table
Reference in a new issue