Author: crab
Date: Sun Jun 28 15:01:41 2009
New Revision: 36440

URL: http://svn.gna.org/viewcvs/wesnoth?rev=36440&view=rev
Log:
optional new-style AI configs and generation of AI lists in multiplayer from 
files

Added:
    trunk/data/ai/dev/formula_ai.cfg   (with props)
Removed:
    trunk/data/ai/ais/formula_ai.cfg
Modified:
    trunk/data/_main.cfg
    trunk/data/ai/ais/default_ai.cfg
    trunk/data/ai/dev/formula_ai_poisoning.cfg
    trunk/data/ai/dev/idle_ai.cfg
    trunk/data/ai/dev/testing_ai_default.cfg
    trunk/src/ai/configuration.cpp
    trunk/src/ai/configuration.hpp
    trunk/src/ai/manager.cpp
    trunk/src/ai/manager.hpp
    trunk/src/game.cpp
    trunk/src/multiplayer_connect.cpp
    trunk/src/multiplayer_connect.hpp

Modified: trunk/data/_main.cfg
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/_main.cfg?rev=36440&r1=36439&r2=36440&view=diff
==============================================================================
--- trunk/data/_main.cfg (original)
+++ trunk/data/_main.cfg Sun Jun 28 15:01:41 2009
@@ -9,6 +9,13 @@
 #endif
 
 {campaigns/}
+
+[ais]
+    {ai/ais/}
+#ifdef DEBUG_MODE
+    {ai/dev/}
+#endif
+[/ais]
 
 #ifdef EDITOR
 [textdomain]

Modified: trunk/data/ai/ais/default_ai.cfg
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/ai/ais/default_ai.cfg?rev=36440&r1=36439&r2=36440&view=diff
==============================================================================
--- trunk/data/ai/ais/default_ai.cfg (original)
+++ trunk/data/ai/ais/default_ai.cfg Sun Jun 28 15:01:41 2009
@@ -1,5 +1,6 @@
 #textdomain wesnoth
-ai_algorithm=default
+ai_algorithm=default_ai
 [ai]
-ai_identifier=default_ai_stable
+    id=default
+    description=Default AI
 [/ai]

Removed: trunk/data/ai/ais/formula_ai.cfg
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/ai/ais/formula_ai.cfg?rev=36439&view=auto
==============================================================================
--- trunk/data/ai/ais/formula_ai.cfg (original)
+++ trunk/data/ai/ais/formula_ai.cfg (removed)
@@ -1,5 +1,0 @@
-#textdomain wesnoth
-ai_algorithm=formula_ai
-[ai]
- ai_identifier=formula_ai_stable
-[/ai]

Added: trunk/data/ai/dev/formula_ai.cfg
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/ai/dev/formula_ai.cfg?rev=36440&view=auto
==============================================================================
--- trunk/data/ai/dev/formula_ai.cfg (added)
+++ trunk/data/ai/dev/formula_ai.cfg Sun Jun 28 15:01:41 2009
@@ -1,0 +1,10 @@
+#textdomain wesnoth
+[ai]
+    id=formula_ai_stable
+    description=Formula AI
+    [stage]
+         engine=cpp
+         name=testing_ai_default::fallback
+         fallback=formula_ai
+    [/stage]
+[/ai]

Propchange: trunk/data/ai/dev/formula_ai.cfg
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/data/ai/dev/formula_ai_poisoning.cfg
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/ai/dev/formula_ai_poisoning.cfg?rev=36440&r1=36439&r2=36440&view=diff
==============================================================================
--- trunk/data/ai/dev/formula_ai_poisoning.cfg (original)
+++ trunk/data/ai/dev/formula_ai_poisoning.cfg Sun Jun 28 15:01:41 2009
@@ -1,8 +1,14 @@
 #textdomain wesnoth
-ai_algorithm =formula_ai
 [ai]
+    ai_algorithm =formula_ai
+    id=formula_ai_poisoning
+    description=Formula AI with poisoning formula
+    [stage]
+         engine=cpp
+         name=testing_ai_default::fallback
+         fallback=formula_ai
+    [/stage]
     eval_list=yes
-
     [register_candidate_action]
         name=poisoner
         type=attack

Modified: trunk/data/ai/dev/idle_ai.cfg
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/ai/dev/idle_ai.cfg?rev=36440&r1=36439&r2=36440&view=diff
==============================================================================
--- trunk/data/ai/dev/idle_ai.cfg (original)
+++ trunk/data/ai/dev/idle_ai.cfg Sun Jun 28 15:01:41 2009
@@ -1,2 +1,10 @@
 #textdomain wesnoth
-ai_algorithm=idle_ai
+[ai]
+    id=ai_idle
+    description=Idle AI
+    [stage]
+         engine=cpp
+         name=testing_ai_default::fallback
+         fallback=idle_ai
+    [/stage]
+[/ai]

Modified: trunk/data/ai/dev/testing_ai_default.cfg
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/ai/dev/testing_ai_default.cfg?rev=36440&r1=36439&r2=36440&view=diff
==============================================================================
--- trunk/data/ai/dev/testing_ai_default.cfg (original)
+++ trunk/data/ai/dev/testing_ai_default.cfg Sun Jun 28 15:01:41 2009
@@ -1,7 +1,7 @@
 #textdomain wesnoth
-ai_algorithm=composite_ai
 [ai]
-    ai_identifier=testing_ai_default
+    id=testing_ai_default
+    description=RCA AI
     [stage]
         engine=cpp
         name=testing_ai_default::candidate_action_evaluation_loop

Modified: trunk/src/ai/configuration.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/ai/configuration.cpp?rev=36440&r1=36439&r2=36440&view=diff
==============================================================================
--- trunk/src/ai/configuration.cpp (original)
+++ trunk/src/ai/configuration.cpp Sun Jun 28 15:01:41 2009
@@ -35,6 +35,55 @@
 #define WRN_AI_CONFIGURATION LOG_STREAM(warn, log_ai_configuration)
 #define ERR_AI_CONFIGURATION LOG_STREAM(err, log_ai_configuration)
 
+void configuration::init(const config &game_config)
+{
+       ai_configurations_.clear();
+
+       const config &ais = game_config.child("ais");
+       foreach (const config &ai_configuration, ais.child_range("ai")) {
+               const std::string &id = ai_configuration["id"];
+               if (id.empty()){
+
+                       ERR_AI_CONFIGURATION << "skipped AI config due to 
missing id" << ". Config contains:"<< std::endl << ai_configuration << 
std::endl;
+                       continue;
+               }
+               if (ai_configurations_.count(id)>0){
+                       ERR_AI_CONFIGURATION << "skipped AI config due to 
duplicate id [" << id << "]. Config contains:"<< std::endl << ai_configuration 
<< std::endl;
+                       continue;
+               }
+
+               description desc;
+               desc.id=id;
+               desc.description=ai_configuration["description"];
+               desc.cfg=ai_configuration;
+
+               ai_configurations_.insert(std::make_pair(id,desc));
+               LOG_AI_CONFIGURATION << "loaded AI config: " << 
ai_configuration["description"] << std::endl;
+       }
+}
+
+std::vector<description*> configuration::get_available_ais(){
+       std::vector<description*> ais_list;
+       for(description_map::iterator desc = ai_configurations_.begin(); 
desc!=ai_configurations_.end(); ++desc) {
+               ais_list.push_back(&desc->second);      
+               DBG_AI_CONFIGURATION << "has ai with config: "<< std::endl << 
desc->second.cfg<< std::endl;
+       }
+       return ais_list;
+}
+
+const config& configuration::get_ai_config_for(const std::string &id)
+{
+       description_map::iterator cfg_it = ai_configurations_.find(id);
+       if (cfg_it==ai_configurations_.end()){
+               return default_config_;
+       }
+       return cfg_it->second.cfg;
+}
+
+
+configuration::description_map configuration::ai_configurations_ = 
configuration::description_map();
+config configuration::default_config_ = config();
+
 
 static std::string bind_config_parameter( const std::string& value_from_config,
                const std::string& value_from_global_config,
@@ -49,16 +98,16 @@
 }
 
 bool configuration::get_side_config_from_file(const std::string& file, config& 
cfg ){
-             try {
-                scoped_istream stream = 
preprocess_file(get_wml_location(file));
-                read(cfg, *stream);
-                LOG_AI_CONFIGURATION << "Reading AI configuration from file '" 
<< file  << "'" << std::endl;
-             } catch(config::error &) {
-                ERR_AI_CONFIGURATION << "Error while reading AI configuration 
from file '" << file  << "'" << std::endl;
-                return false;
-             }
-                        LOG_AI_CONFIGURATION << "Successfully read AI 
configuration from file '" << file  << "'" << std::endl;
-             return true;
+       try {
+               scoped_istream stream = preprocess_file(get_wml_location(file));
+               read(cfg, *stream);
+               LOG_AI_CONFIGURATION << "Reading AI configuration from file '" 
<< file  << "'" << std::endl;
+       } catch(config::error &) {
+               ERR_AI_CONFIGURATION << "Error while reading AI configuration 
from file '" << file  << "'" << std::endl;
+               return false;
+       }
+       LOG_AI_CONFIGURATION << "Successfully read AI configuration from file 
'" << file  << "'" << std::endl;
+       return true;
 }
 
 
@@ -73,6 +122,71 @@
        LOG_AI_CONFIGURATION << "Parsing [side] configuration from config" << 
std::endl;
        DBG_AI_CONFIGURATION << "Config contains:"<< std::endl << cfg << 
std::endl;
 
+       bool new_syntax=false;//@todo 1.8 remove old way when necessary
+       foreach (const config &aiparam, cfg.child_range("ai")) {
+               if (aiparam.child("stage")){
+                       new_syntax=true;
+                       break;
+               }
+       }
+
+       if (new_syntax) {
+               DBG_AI_CONFIGURATION << "new syntax parsing rules"<< std::endl;
+               return 
parse_side_config_new(cfg,ai_algorithm_type,global_ai_parameters,ai_parameters,default_ai_parameters,ai_memory,effective_ai_parameters);
+       } else {
+               DBG_AI_CONFIGURATION << "old syntax parsing rules"<< std::endl;
+               return 
parse_side_config_old(cfg,ai_algorithm_type,global_ai_parameters,ai_parameters,default_ai_parameters,ai_memory,effective_ai_parameters);
+       }
+}
+
+bool configuration::parse_side_config_new(const config &cfg,
+               std::string &ai_algorithm_type,
+               config &global_ai_parameters,
+               std::vector<config> &ai_parameters,
+               const config &default_ai_parameters,
+               config &ai_memory,
+               config &effective_ai_parameters )
+{
+       //construct new-style integrated config
+       ai_parameters.push_back(default_ai_parameters);
+       global_ai_parameters.append(default_ai_parameters);
+       global_ai_parameters["ai_algorithm"] = "composite_ai";
+       DBG_AI_CONFIGURATION << "after taking default values into account, 
new-style config contains:"<< std::endl << global_ai_parameters << std::endl;
+
+       foreach (const config &aiparam, cfg.child_range("ai"))
+       {
+               ai_parameters.push_back(aiparam);
+               global_ai_parameters.append(aiparam);
+       }
+
+       DBG_AI_CONFIGURATION << "finally, new-style config contains:"<< 
std::endl << global_ai_parameters << std::endl;
+
+       ai_algorithm_type = global_ai_parameters["ai_algorithm"];
+
+       //AI memory
+       foreach (const config &aimem, 
global_ai_parameters.child_range("ai_memory")) {
+               ai_memory.append(aimem);
+       }
+
+       
effective_ai_parameters["number_of_possible_recruits_to_force_recruit"]= 
global_ai_parameters["number_of_possible_recruits_to_force_recruit"];
+       effective_ai_parameters["villages_per_scout"] = 
global_ai_parameters["villages_per_scout"];
+       effective_ai_parameters["leader_value"] = 
global_ai_parameters["leader_value"];
+       effective_ai_parameters["village_value"] = 
global_ai_parameters["village_value"];
+       effective_ai_parameters["aggression"] = 
global_ai_parameters["aggression"];
+       effective_ai_parameters["caution"] = global_ai_parameters["caution"];
+
+       return true;
+}
+
+bool configuration::parse_side_config_old(const config& cfg,
+               std::string& ai_algorithm_type,
+               config& global_ai_parameters,
+               std::vector<config>& ai_parameters,
+               const config& default_ai_parameters,
+               config& ai_memory,
+               config& effective_ai_parameters )
+{
+
        foreach (const config &aiparam, cfg.child_range("ai"))
        {
                ai_parameters.push_back(aiparam);
@@ -139,7 +253,7 @@
 
        default_cfg["init"] = "true";
 
-       default_cfg["al_algorithm"] = "default";
+       default_cfg["ai_algorithm"] = "default_ai";
 
        //A number 0 or higher which determines how many scouts the AI 
recruits. If 0,
        //the AI doesn't recruit scouts to capture villages.

Modified: trunk/src/ai/configuration.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/ai/configuration.hpp?rev=36440&r1=36439&r2=36440&view=diff
==============================================================================
--- trunk/src/ai/configuration.hpp (original)
+++ trunk/src/ai/configuration.hpp Sun Jun 28 15:01:41 2009
@@ -25,6 +25,7 @@
 #include "../config.hpp"
 
 
+#include <map>
 #include <vector>
 
 namespace ai {
@@ -46,8 +47,36 @@
  * then, if (3) is equal:
  * use any and loudly complain.
  */
+
+struct description {
+public:
+       std::string description;
+       std::string id;
+       config cfg;
+};
+
 class configuration {
 public:
+
+       /**
+        * Init the parameters of ai configuration parser
+        * @param game_config_ game config
+        */
+       static void init(const config &game_config);
+
+
+       /**
+        * Return the config for a specified ai
+        */
+       static const config& get_ai_config_for(const std::string &id);
+
+
+       /**
+        * Returns a list of available AIs.
+        * @return the list of available AIs.
+        */
+       static std::vector<description*> get_available_ais();
+
 
        /**
         * get side config from file
@@ -81,12 +110,41 @@
                        config& ai_memory,
                        config& effective_ai_parameters );
 
+
+       /**
+        * Same as parse_side_config, new syntax
+        */
+       static bool parse_side_config_new(const config& cfg,
+               std::string& ai_algorithm_type,
+               config& global_ai_parameters,
+               std::vector<config>& ai_parameters,
+               const config& default_ai_parameters,
+               config& ai_memory,
+               config& effective_ai_parameters );
+
+
+       /**
+        * Same as parse_side_config, old syntax
+        */
+       static bool parse_side_config_old(const config& cfg,
+               std::string& ai_algorithm_type,
+               config& global_ai_parameters,
+               std::vector<config>& ai_parameters,
+               const config& default_ai_parameters,
+               config& ai_memory,
+               config& effective_ai_parameters );
+
        /**
         * get default AI parameters
         * @return default AI parameters
         */
        static const config& get_default_ai_parameters();
 
+private:
+       typedef std::map<std::string, description> description_map;
+       static std::map<std::string, description> ai_configurations_;
+       static config default_config_;
+
 };
 
 } //end of namespace ai

Modified: trunk/src/ai/manager.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/ai/manager.cpp?rev=36440&r1=36439&r2=36440&view=diff
==============================================================================
--- trunk/src/ai/manager.cpp (original)
+++ trunk/src/ai/manager.cpp Sun Jun 28 15:01:41 2009
@@ -565,15 +565,6 @@
        return new_ai;
 }
 
-std::vector<std::string> manager::get_available_ais()
-{
-       std::vector<std::string> ais;
-       ais.push_back("default");
-       return ais;
-}
-
-
-
 
 // =======================================================================
 // REMOVE

Modified: trunk/src/ai/manager.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/ai/manager.hpp?rev=36440&r1=36439&r2=36440&view=diff
==============================================================================
--- trunk/src/ai/manager.hpp (original)
+++ trunk/src/ai/manager.hpp Sun Jun 28 15:01:41 2009
@@ -279,14 +279,6 @@
        static ai_ptr create_transient_ai( const std::string& 
ai_algorithm_type, default_ai_context *ai_context);
 
 
-       /**
-        * Returns a list of available AIs.
-        * @return the list of available AIs.
-        * @todo 1.7 get this list from a list of files in specified directory
-        */
-       static std::vector<std::string> get_available_ais();
-
-
        // 
=======================================================================
        // REMOVE
        // 
=======================================================================

Modified: trunk/src/game.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/game.cpp?rev=36440&r1=36439&r2=36440&view=diff
==============================================================================
--- trunk/src/game.cpp (original)
+++ trunk/src/game.cpp Sun Jun 28 15:01:41 2009
@@ -18,6 +18,7 @@
 #include "SDL_mixer.h"
 
 #include "about.hpp"
+#include "ai/configuration.hpp"
 #include "config.hpp"
 #include "config_cache.hpp"
 #include "construct_dialog.hpp"
@@ -604,6 +605,12 @@
        // make sure that multiplayer mode is set if command line parameter is 
selected
        if (multiplayer_mode_)
                cache_.add_define("MULTIPLAYER");
+
+       // make sure that 'debug mode' symbol is set if command line parameter 
is selected
+       if (game_config::debug) {
+               cache_.add_define("DEBUG_MODE");
+       }
+
        load_game_cfg(force);
 
        const config &cfg = game_config_.child("game_config");
@@ -616,6 +623,7 @@
        paths_manager_.set_paths(game_config_);
        ::init_textdomains(game_config_);
        about::set_about(game_config_);
+       ai::configuration::init(game_config_);
 
        return true;
 }

Modified: trunk/src/multiplayer_connect.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/multiplayer_connect.cpp?rev=36440&r1=36439&r2=36440&view=diff
==============================================================================
--- trunk/src/multiplayer_connect.cpp (original)
+++ trunk/src/multiplayer_connect.cpp Sun Jun 28 15:01:41 2009
@@ -20,7 +20,7 @@
 #include "global.hpp"
 
 
-#include "ai/manager.hpp"
+#include "ai/configuration.hpp"
 #include "dialogs.hpp"
 #include "foreach.hpp"
 #include "gettext.hpp"
@@ -459,7 +459,7 @@
                changed_ = true;
        }
        if (combo_ai_algorithm_.changed() && combo_ai_algorithm_.selected() >= 
0) {
-               ai_algorithm_ = 
parent_->ai_algorithms_[combo_ai_algorithm_.selected()];
+               ai_algorithm_ = 
parent_->ai_algorithms_[combo_ai_algorithm_.selected()]->id;
                changed_ = true;
        }
        if (combo_leader_.changed() && combo_leader_.selected() >= 0) {
@@ -563,14 +563,15 @@
        assert(parent_->ai_algorithms_.empty() == false);
 
        int sel = 0;
-       std::vector<std::string> ais = parent_->ai_algorithms_;
-       for (unsigned int i = 0; i < ais.size(); i++) {
-               if (ais[i] == ai_algorithm_) {
+       std::vector<ai::description*> &ais_list = parent_->ai_algorithms_;
+       std::vector<std::string> ais;
+       int i = 0;
+       foreach (const ai::description *desc,  ais_list){
+               ais.push_back(desc->description);
+               if (desc->id==ai_algorithm_){
                        sel = i;
                }
-               if (ais[i] == "default") {
-                       ais[i] = _("Default AI");
-               }
+               i++;
        }
        combo_ai_algorithm_.set_items(ais);
        combo_ai_algorithm_.set_selected(sel);
@@ -661,9 +662,7 @@
                        }
                        {
                                res["id"] = res["save_id"];
-                               config &ai = res.child_or_add("ai");
-                               if (ai_algorithm_ != "default")
-                                       ai["ai_algorithm"] = ai_algorithm_;
+                               
res.add_child("ai",ai::configuration::get_ai_config_for(ai_algorithm_));
                        }
                        description = N_("Computer player");
                        break;
@@ -1437,7 +1436,7 @@
        }
 
        // AI algorithms
-       ai_algorithms_ = ai::manager::get_available_ais();
+       ai_algorithms_ = ai::configuration::get_available_ais();
 
        // Factions
        config::child_itors sides = current_config()->child_range("side");

Modified: trunk/src/multiplayer_connect.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/multiplayer_connect.hpp?rev=36440&r1=36439&r2=36440&view=diff
==============================================================================
--- trunk/src/multiplayer_connect.hpp (original)
+++ trunk/src/multiplayer_connect.hpp Sun Jun 28 15:01:41 2009
@@ -27,6 +27,10 @@
 #include "widgets/combo_drag.hpp"
 
 #include <string>
+
+namespace ai {
+       class description;
+}
 
 namespace mp {
 
@@ -263,7 +267,7 @@
        std::vector<std::string> player_factions_;
        std::vector<std::string> player_teams_;
        std::vector<std::string> player_colours_;
-       std::vector<std::string> ai_algorithms_;
+       std::vector<ai::description*> ai_algorithms_;
 
        // team_name list and "Team" prefix
        std::vector<std::string> team_names_;


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to