[gnome-games/glchess-vala] Connect engine difficulty settings



commit fdb771981ab54f39a162790e15fc55dde29b616a
Author: Robert Ancell <robert ancell canonical com>
Date:   Mon Jan 10 08:36:38 2011 +1100

    Connect engine difficulty settings

 glchess/src/ai-profile.vala        |   16 ++++++++++++++++
 glchess/src/chess-engine-cecp.vala |    6 +++++-
 glchess/src/chess-engine-uci.vala  |    9 ++++++---
 glchess/src/glchess.vala           |   23 +++++++++++++++++++----
 4 files changed, 46 insertions(+), 8 deletions(-)
---
diff --git a/glchess/src/ai-profile.vala b/glchess/src/ai-profile.vala
index f9ed93b..728ba4c 100644
--- a/glchess/src/ai-profile.vala
+++ b/glchess/src/ai-profile.vala
@@ -29,6 +29,9 @@ public List<AIProfile> load_ai_profiles (string filename)
            profile.binary = file.get_value (name, "binary");
            if (file.has_key (name, "args"))
                profile.args = file.get_value (name, "args");
+           profile.easy_options = load_options (file, name, "easy");
+           profile.normal_options = load_options (file, name, "normal");
+           profile.hard_options = load_options (file, name, "hard");
        }
        catch (KeyFileError e)
        {
@@ -42,6 +45,19 @@ public List<AIProfile> load_ai_profiles (string filename)
    return profiles;
 }
 
+private string[] load_options (KeyFile file, string name, string difficulty) throws KeyFileError
+{
+    int count = 0;
+    while (file.has_key (name, "option-%s-%d".printf (difficulty, count)))
+        count++;
+
+    string[] options = new string[count];
+    for (var i = 0; i < count; i++)
+        options[i] = file.get_value (name, "option-%s-%d".printf (difficulty, i));
+
+    return options;
+}
+
 public class AIProfile
 {
     public string name;
diff --git a/glchess/src/chess-engine-cecp.vala b/glchess/src/chess-engine-cecp.vala
index 340ae03..15d30e3 100644
--- a/glchess/src/chess-engine-cecp.vala
+++ b/glchess/src/chess-engine-cecp.vala
@@ -2,15 +2,19 @@ public class ChessEngineCECP : ChessEngine
 {
     private char[] buffer;
     private bool moving = false;
+    private string[] options;
 
-    public ChessEngineCECP ()
+    public ChessEngineCECP (string[] options)
     {
+        this.options = options;
         starting.connect (start_cb);
     }
     
     private void start_cb ()
     {
         write_line ("xboard");
+        foreach (var o in options)
+            write_line (o);
         ready = true;
     }
 
diff --git a/glchess/src/chess-engine-uci.vala b/glchess/src/chess-engine-uci.vala
index 58bc836..ebadcc2 100644
--- a/glchess/src/chess-engine-uci.vala
+++ b/glchess/src/chess-engine-uci.vala
@@ -2,9 +2,11 @@ public class ChessEngineUCI : ChessEngine
 {
     private char[] buffer;
     private string position_command;
+    private string[] options;
     
-    public ChessEngineUCI ()
+    public ChessEngineUCI (string[] options)
     {
+        this.options = options;
         buffer = new char[0];
         position_command = "position startpos";
         starting.connect (start_cb);
@@ -66,7 +68,7 @@ public class ChessEngineUCI : ChessEngine
                 case "uciok":
                     if (tokens.length != 1)
                         warning ("Unexpected arguments on uciok: %s", line);
-                        
+
                     configure ();
                     break;
 
@@ -102,7 +104,8 @@ public class ChessEngineUCI : ChessEngine
 
     private void configure ()
     {
-        //write_line ("setoption ...");
+        foreach (var o in options)
+            write_line ("setoption %s".printf (o));
         write_line ("isready");
     }
 }
diff --git a/glchess/src/glchess.vala b/glchess/src/glchess.vala
index a061fe4..e34aa72 100644
--- a/glchess/src/glchess.vala
+++ b/glchess/src/glchess.vala
@@ -232,7 +232,7 @@ public class Application
         save_as_menu.sensitive = false;
         update_history_panel ();
 
-        opponent_engine = get_engine (settings.get_string ("opponent"));
+        opponent_engine = get_engine (settings.get_string ("opponent"), settings.get_string ("difficulty"));
         opponent = null;
         if (opponent_engine != null)
         {
@@ -260,7 +260,7 @@ public class Application
         black_time_label.queue_draw ();
     }
 
-    private ChessEngine? get_engine (string name)
+    private ChessEngine? get_engine (string name, string difficulty)
     {
         ChessEngine engine;
         AIProfile? profile = null;
@@ -284,10 +284,25 @@ public class Application
             profile = ai_profiles.data;
         }
 
+        string[] options;
+        switch (difficulty)
+        {
+        case "easy":
+            options = profile.easy_options;
+            break;
+        default:
+        case "normal":
+            options = profile.normal_options;
+            break;
+        case "hard":
+            options = profile.hard_options;
+            break;
+        }
+
         if (profile.protocol == "cecp")
-            engine = new ChessEngineCECP ();
+            engine = new ChessEngineCECP (options);
         else if (profile.protocol == "uci")
-            engine = new ChessEngineUCI ();
+            engine = new ChessEngineUCI (options);
         else
         {
             warning ("Unknown AI protocol %s", profile.protocol);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]