Skip to content

Commit

Permalink
Implement invalidate_on_tod_change for aspects
Browse files Browse the repository at this point in the history
  • Loading branch information
CelticMinstrel authored and mattsc committed Mar 22, 2016
1 parent b472056 commit c86b4ee
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 19 deletions.
9 changes: 3 additions & 6 deletions src/ai/composite/aspect.cpp
Expand Up @@ -50,8 +50,7 @@ aspect::~aspect()
manager::remove_turn_started_observer(this);
}
if (invalidate_on_tod_change_) {
///@todo 1.9 add tod_changed_observer
//manager::remove_tod_changed_observer(this);
manager::remove_tod_changed_observer(this);
}
if (invalidate_on_gamestate_change_) {
manager::remove_gamestate_observer(this);
Expand All @@ -77,8 +76,7 @@ bool aspect::redeploy(const config &cfg, const std::string& /*id*/)
manager::remove_turn_started_observer(this);
}
if (invalidate_on_tod_change_) {
///@todo 1.9 add tod_changed_observer
//manager::remove_tod_changed_observer(this);
manager::remove_tod_changed_observer(this);
}
if (invalidate_on_gamestate_change_) {
manager::remove_gamestate_observer(this);
Expand All @@ -104,8 +102,7 @@ bool aspect::redeploy(const config &cfg, const std::string& /*id*/)
manager::add_turn_started_observer(this);
}
if (invalidate_on_tod_change_) {
///@todo 1.9 add tod_changed_observer
//manager::add_tod_changed_observer(this);
manager::add_tod_changed_observer(this);
}
if (invalidate_on_gamestate_change_) {
manager::add_gamestate_observer(this);
Expand Down
20 changes: 20 additions & 0 deletions src/ai/manager.cpp
Expand Up @@ -27,6 +27,7 @@
#include "map/location.hpp" // for map_location
#include "resources.hpp"
#include "serialization/string_utils.hpp"
#include "tod_manager.hpp"

#include "composite/ai.hpp" // for ai_composite
#include "composite/component.hpp" // for component_manager
Expand Down Expand Up @@ -329,6 +330,7 @@ manager::AI_map_of_stacks manager::ai_map_;
game_info *manager::ai_info_;
events::generic_event manager::user_interact_("ai_user_interact");
events::generic_event manager::sync_network_("ai_sync_network");
events::generic_event manager::tod_changed_("ai_tod_changed");
events::generic_event manager::gamestate_changed_("ai_gamestate_changed");
events::generic_event manager::turn_started_("ai_turn_started");
events::generic_event manager::recruit_list_changed_("ai_recruit_list_changed");
Expand Down Expand Up @@ -383,6 +385,16 @@ void manager::remove_gamestate_observer(events::observer* event_observer){
}


void manager::add_tod_changed_observer( events::observer* event_observer){
tod_changed_.attach_handler(event_observer);
}


void manager::remove_tod_changed_observer(events::observer* event_observer){
tod_changed_.detach_handler(event_observer);
}



void manager::add_map_changed_observer( events::observer* event_observer )
{
Expand Down Expand Up @@ -447,6 +459,11 @@ void manager::raise_gamestate_changed() {
}


void manager::raise_tod_changed() {
tod_changed_.notify_observers();
}


void manager::raise_turn_started() {
turn_started_.notify_observers();
}
Expand Down Expand Up @@ -791,6 +808,9 @@ void manager::play_turn( side_number side ){
interface& ai_obj = get_active_ai_for_side(side);
resources::game_events->pump().fire("ai turn");
raise_turn_started();
if (resources::tod_manager->has_tod_bonus_changed()) {
raise_tod_changed();
}
ai_obj.new_turn();
ai_obj.play_turn();
const int turn_end_time= SDL_GetTicks();
Expand Down
19 changes: 19 additions & 0 deletions src/ai/manager.hpp
Expand Up @@ -202,6 +202,12 @@ class manager
static void raise_gamestate_changed();


/**
* Notifies all observers of 'ai_tod_changed' event.
*/
static void raise_tod_changed();


/**
* Notifies all observers of 'ai_recruit_list_changed' event.
*/
Expand Down Expand Up @@ -238,6 +244,12 @@ class manager
static void add_turn_started_observer( events::observer* event_observer );


/**
* Adds an observer of 'ai_tod_changed' event.
*/
static void add_tod_changed_observer( events::observer* event_observer );


/**
* Deletes an observer of 'ai_map_changed' event.
*/
Expand All @@ -257,6 +269,12 @@ class manager
static void remove_turn_started_observer( events::observer* event_observer );


/**
* Deletes an observer of 'ai_tod_changed' event.
*/
static void remove_tod_changed_observer( events::observer* event_observer );


private:

manager();
Expand Down Expand Up @@ -467,6 +485,7 @@ class manager
static events::generic_event recruit_list_changed_;
static events::generic_event user_interact_;
static events::generic_event sync_network_;
static events::generic_event tod_changed_;
static events::generic_event gamestate_changed_;
static events::generic_event turn_started_;
static int last_interact_;
Expand Down
50 changes: 45 additions & 5 deletions src/tod_manager.cpp
Expand Up @@ -269,27 +269,41 @@ bool tod_manager::is_start_ToD(const std::string& random_start_time)

void tod_manager::replace_schedule(const config& time_cfg)
{
int bonus = times_[currentTime_].lawful_bonus;
times_.clear();
time_of_day::parse_times(time_cfg,times_);
currentTime_ = time_cfg["current_time"].to_int(0);
if (bonus != times_[currentTime_].lawful_bonus) {
has_tod_bonus_changed_ = true;
}
}

void tod_manager::replace_schedule(const std::vector<time_of_day>& schedule)
{
int bonus = times_[currentTime_].lawful_bonus;
times_ = schedule;
currentTime_ = 0;
if (bonus != times_[currentTime_].lawful_bonus) {
has_tod_bonus_changed_ = true;
}
}

void tod_manager::replace_area_locations(int area_index, const std::set<map_location>& locs) {
assert(area_index < static_cast<int>(areas_.size()));
areas_[area_index].hexes = locs;
has_tod_bonus_changed_ = true;
}

void tod_manager::replace_local_schedule(const std::vector<time_of_day>& schedule, int area_index)
{
assert(area_index < static_cast<int>(areas_.size()));
areas_[area_index].times = schedule;
areas_[area_index].currentTime = 0;
area_time_of_day& area = areas_[area_index];
int bonus = area.times[area.currentTime].lawful_bonus;
area.times = schedule;
area.currentTime = 0;
if (bonus != area.times[area.currentTime].lawful_bonus) {
has_tod_bonus_changed_ = true;
}
}

void tod_manager::set_area_id(int area_index, const std::string& id) {
Expand Down Expand Up @@ -331,6 +345,7 @@ void tod_manager::add_time_area(const gamemap & map, const config& cfg)
std::vector<map_location> const& locs (map.parse_location_range(area.xsrc, area.ysrc, true));
area.hexes.insert(locs.begin(), locs.end());
time_of_day::parse_times(cfg, area.times);
has_tod_bonus_changed_ = true;
}

void tod_manager::add_time_area(const std::string& id, const std::set<map_location>& locs,
Expand All @@ -342,6 +357,7 @@ void tod_manager::add_time_area(const std::string& id, const std::set<map_locati
area.hexes = locs;
area.currentTime = time_cfg["current_time"].to_int(0);
time_of_day::parse_times(time_cfg, area.times);
has_tod_bonus_changed_ = true;
}

void tod_manager::remove_time_area(const std::string& area_id)
Expand All @@ -359,12 +375,14 @@ void tod_manager::remove_time_area(const std::string& area_id)
}
}
}
has_tod_bonus_changed_ = true;
}

void tod_manager::remove_time_area(int area_index)
{
assert(area_index < static_cast<int>(areas_.size()));
areas_.erase(areas_.begin() + area_index);
has_tod_bonus_changed_ = true;
}

const time_of_day& tod_manager::get_time_of_day_turn(const std::vector<time_of_day>& times, int nturn, const int current_time) const
Expand Down Expand Up @@ -411,6 +429,7 @@ void tod_manager::set_number_of_turns_by_wml(int num)

void tod_manager::set_turn(const int num, game_data* vars, const bool increase_limit_if_needed)
{
has_tod_bonus_changed_ = false;
const int new_turn = std::max<int>(num, 1);
LOG_NG << "changing current turn number from " << turn_ << " to " << new_turn << '\n';
// Correct ToD
Expand All @@ -431,12 +450,13 @@ void tod_manager::set_turn_by_wml(const int num, game_data* vars, const bool inc
}
void tod_manager::set_new_current_times(const int new_current_turn_number)
{
currentTime_ = calculate_current_time(times_.size(), new_current_turn_number, currentTime_);
set_current_time(calculate_current_time(times_.size(), new_current_turn_number, currentTime_));
BOOST_FOREACH(area_time_of_day& area, areas_) {
area.currentTime = calculate_current_time(
set_current_time(calculate_current_time(
area.times.size(),
new_current_turn_number,
area.currentTime);
area.currentTime),
area);
}
}

Expand All @@ -454,6 +474,26 @@ int tod_manager::calculate_current_time(
return new_current_time;
}

void tod_manager::set_current_time(int time) {
if (times_[time].lawful_bonus != times_[currentTime_].lawful_bonus) {
has_tod_bonus_changed_ = true;
}
currentTime_ = time;
}

void tod_manager::set_current_time(int time, int area_index) {
assert(area_index < static_cast<int>(areas_.size()));
set_current_time(time, areas_[area_index]);
}

void tod_manager::set_current_time(int time, area_time_of_day& area) {
assert(time < static_cast<int>(area.times.size()) );
if (area.times[time].lawful_bonus != area.times[area.currentTime].lawful_bonus) {
has_tod_bonus_changed_ = true;
}
area.currentTime = time;
}

bool tod_manager::next_turn(game_data* vars)
{
set_turn(turn_ + 1, vars, false);
Expand Down
15 changes: 7 additions & 8 deletions src/tod_manager.hpp
Expand Up @@ -45,14 +45,8 @@ class tod_manager : public savegame::savegame_config
void resolve_random(random_new::rng& r);
int get_current_time(const map_location& loc = map_location::null_location()) const;

void set_current_time(int time) { currentTime_ = time; }

void set_current_time(int time, int area_index) {
assert(area_index < static_cast<int>(areas_.size()));
assert(time < static_cast<int>(areas_[area_index].times.size()) );
areas_[area_index].currentTime = time;
}

void set_current_time(int time);
void set_current_time(int time, int area_index);
void set_area_id(int area_index, const std::string& id);

/**
Expand Down Expand Up @@ -184,6 +178,8 @@ class tod_manager : public savegame::savegame_config
{ return has_turn_event_fired_; }
void turn_event_fired()
{ has_turn_event_fired_ = true; }
bool has_tod_bonus_changed()
{ return has_tod_bonus_changed_; }
private:

/**
Expand Down Expand Up @@ -229,6 +225,8 @@ class tod_manager : public savegame::savegame_config
int currentTime;
};

void set_current_time(int time, area_time_of_day& area);

//index of the times vector of the main time where we're currently at
int currentTime_;
std::vector<time_of_day> times_;
Expand All @@ -240,6 +238,7 @@ class tod_manager : public savegame::savegame_config
int num_turns_;
//Whether the "turn X" and the "new turn" events were already fired this turn.
bool has_turn_event_fired_;
bool has_tod_bonus_changed_;
//
config::attribute_value random_tod_;
};
Expand Down

0 comments on commit c86b4ee

Please sign in to comment.