Scenario transition refactoring

Carryover gold and recalls handled out of game
This commit is contained in:
Anja Keicher 2012-06-27 09:36:08 +00:00
parent 85981e784e
commit e6f0fe42bc
3 changed files with 72 additions and 88 deletions

View file

@ -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_){

View file

@ -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:

View file

@ -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())