f5a0fcf62e5e

cl-ggp: Update site.
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Sun, 29 Jan 2017 22:07:43 +0000
parents 19233527280d
children e5a300df7d49
branches/tags (none)
files cl-ggp/_dmedia/pygments-clean.css cl-ggp/changelog/index.html cl-ggp/index.html cl-ggp/installation/index.html cl-ggp/overview/index.html cl-ggp/reference-reasoner/index.html cl-ggp/reference/index.html

Changes

--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cl-ggp/_dmedia/pygments-clean.css	Sun Jan 29 22:07:43 2017 +0000
@@ -0,0 +1,61 @@
+/* @override http://localhost:8080/media/css/pygments-monokai-light.css */
+div.codehilite .hll { background-color: #49483e }
+/* div.codehilite .err { color: #fff; background-color: #f00 } /1* Error *1/ */
+div.codehilite .err { color: #111; } /* Error */
+div.codehilite .k { color: #111} /* Keyword */
+div.codehilite .l { color: #111 } /* Literal */
+div.codehilite .n { color: #111 } /* Name */
+div.codehilite .o { color: #111 } /* Operator */
+div.codehilite .p { color: #111 } /* Punctuation */
+div.codehilite .c  { color: #714678; font-style: italic; font-weight: bold; } /* Comment */
+div.codehilite .cm { color: #714678; font-style: italic; font-weight: bold; } /* Comment.Multiline */
+div.codehilite .cp { color: #714678; font-style: italic; font-weight: bold; } /* Comment.Preproc */
+div.codehilite .c1 { color: #714678; font-style: italic; font-weight: bold; } /* Comment.Single */
+div.codehilite .cs { color: #714678; font-style: italic; font-weight: bold; } /* Comment.Special */
+div.codehilite .ge { font-style: italic } /* Generic.Emph */
+div.codehilite .gs { font-weight: bold } /* Generic.Strong */
+div.codehilite .kc { color: #111 } /* Keyword.Constant */
+div.codehilite .kd { color: #111 } /* Keyword.Declaration */
+div.codehilite .kn { color: #111 } /* Keyword.Namespace */
+div.codehilite .kp { color: #111 } /* Keyword.Pseudo */
+div.codehilite .kr { color: #111 } /* Keyword.Reserved */
+div.codehilite .kt { color: #111 } /* Keyword.Type */
+div.codehilite .ld { color: #111 } /* Literal.Date */
+div.codehilite .m { color: #111 } /* Literal.Number */
+div.codehilite .s { color: #111; font-style: italic; } /* Literal.String */
+div.codehilite .na { color: #111 } /* Name.Attribute */
+div.codehilite .nb { color: #111 } /* Name.Builtin */
+div.codehilite .nc { color: #111 } /* Name.Class */
+div.codehilite .no { color: #111 } /* Name.Constant */
+div.codehilite .nd { color: #111 } /* Name.Decorator */
+div.codehilite .ni { color: #111 } /* Name.Entity */
+div.codehilite .ne { color: #111 } /* Name.Exception */
+div.codehilite .nf { color: #111} /* Name.Function */
+div.codehilite .nl { color: #111 } /* Name.Label */
+div.codehilite .nn { color: #111} /* Name.Namespace */
+div.codehilite .nx { color: #111 } /* Name.Other */
+div.codehilite .py { color: #111 } /* Name.Property */
+div.codehilite .nt { color: #111 } /* Name.Tag */
+div.codehilite .nv { color: #111 } /* Name.Variable */
+div.codehilite .ow { color: #111 } /* Operator.Word */
+div.codehilite .w { color: #111 } /* Text.Whitespace */
+div.codehilite .mf { color: #111 } /* Literal.Number.Float */
+div.codehilite .mh { color: #111 } /* Literal.Number.Hex */
+div.codehilite .mi { color: #111 } /* Literal.Number.Integer */
+div.codehilite .mo { color: #111 } /* Literal.Number.Oct */
+div.codehilite .sb { color: #111 } /* Literal.String.Backtick */
+div.codehilite .sc { color: #111 } /* Literal.String.Char */
+div.codehilite .sd { color: #111 } /* Literal.String.Doc */
+div.codehilite .s2 { color: #111 } /* Literal.String.Double */
+div.codehilite .se { color: #111 } /* Literal.String.Escape */
+div.codehilite .sh { color: #111 } /* Literal.String.Heredoc */
+div.codehilite .si { color: #111 } /* Literal.String.Interpol */
+div.codehilite .sx { color: #111 } /* Literal.String.Other */
+div.codehilite .sr { color: #111 } /* Literal.String.Regex */
+div.codehilite .s1 { color: #111 } /* Literal.String.Single */
+div.codehilite .ss { color: #111 } /* Literal.String.Symbol */
+div.codehilite .bp { color: #111 } /* Name.Builtin.Pseudo */
+div.codehilite .vc { color: #111 } /* Name.Variable.Class */
+div.codehilite .vg { color: #111 } /* Name.Variable.Global */
+div.codehilite .vi { color: #111 } /* Name.Variable.Instance */
+div.codehilite .il { color: #111 } /* Literal.Number.Integer.Long */
--- a/cl-ggp/changelog/index.html	Fri Jan 27 17:41:22 2017 +0000
+++ b/cl-ggp/changelog/index.html	Sun Jan 29 22:07:43 2017 +0000
@@ -3,7 +3,7 @@
     <head>
         <meta charset="utf-8"/>
         <title>Changelog / cl-ggp</title>
-        <link rel="stylesheet" href="../_dmedia/tango.css"/>
+        <link rel="stylesheet" href="../_dmedia/pygments-clean.css"/>
         <link rel="stylesheet/less" type="text/css" href="../_dmedia/style.less"/>
         <script src="../_dmedia/less.js" type="text/javascript">
         </script>
--- a/cl-ggp/index.html	Fri Jan 27 17:41:22 2017 +0000
+++ b/cl-ggp/index.html	Sun Jan 29 22:07:43 2017 +0000
@@ -3,7 +3,7 @@
     <head>
         <meta charset="utf-8" />
         <title>cl-ggp</title>
-        <link rel="stylesheet" href="./_dmedia/tango.css"/>
+        <link rel="stylesheet" href="./_dmedia/pygments-clean.css"/>
         <link rel="stylesheet/less" type="text/css" href="./_dmedia/style.less">
         <script src="./_dmedia/less.js" type="text/javascript">
         </script>
@@ -12,15 +12,19 @@
         <div class="wrap">
             <header><h1><a href="">cl-ggp</a></h1></header>
                 <div class="markdown">
-<p><code>cl-ggp</code> is a tiny framework for writing <a href="http://www.ggp.org/">GGP</a> players in Common Lisp.</p>
-<p>It handles the GGP protocol for you but <em>nothing else</em>.  In particular you'll
-need to bring your own logic system to parse the games.</p>
+<p><code>cl-ggp</code> is a tiny framework for writing <a href="http://www.ggp.org/">general game players</a> in Common
+Lisp.</p>
+<p>The <code>cl-ggp</code> system handles the GGP protocol for you and <em>nothing else</em>.  If you
+plan on doing your own GDL reasoning, this is all you need.</p>
+<p>The <code>cl-ggp.reasoner</code> system contains a simple Prolog-based reasoner using the
+<a href="https://sjl.bitbucket.io/temperance/">Temperance</a> logic programming library.  It's useful as a starting point for
+when writing players.</p>
 <ul>
 <li><strong>License:</strong> MIT/X11</li>
-<li><strong>Documentation:</strong> <a href="http://sjl.bitbucket.org/cl-ggp/">http://sjl.bitbucket.org/cl-ggp/</a></li>
-<li><strong>Code:</strong> <a href="http://bitbucket.org/sjl/cl-ggp/">http://bitbucket.org/sjl/cl-ggp/</a></li>
-<li><strong>Issues:</strong> <a href="http://bitbucket.org/sjl/cl-ggp/issues/">http://bitbucket.org/sjl/cl-ggp/issues/</a></li>
-</ul><h2>Table of Contents</h2><ol class="toc"><li><a href="installation/">Installation</a></li><li><a href="overview/">Overview</a></li><li><a href="reference/"> API Reference</a></li><li><a href="changelog/">Changelog</a></li></ol>
+<li><strong>Documentation:</strong> <a href="https://sjl.bitbucket.io/cl-ggp/">https://sjl.bitbucket.io/cl-ggp/</a></li>
+<li><strong>Mercurial:</strong> <a href="https://bitbucket.org/sjl/cl-ggp/">https://bitbucket.org/sjl/cl-ggp/</a></li>
+<li><strong>Git:</strong> <a href="https://github.com/sjl/cl-ggp/">https://github.com/sjl/cl-ggp/</a></li>
+</ul><h2>Table of Contents</h2><ol class="toc"><li><a href="installation/">Installation</a></li><li><a href="overview/">Overview</a></li><li><a href="reference/"> Main API Reference</a></li><li><a href="reference-reasoner/"> Reasoner API Reference</a></li><li><a href="changelog/">Changelog</a></li></ol>
                 </div>
             <footer><p><i>Made with Lisp and love by <a href="http://stevelosh.com/">Steve Losh</a> in Reykjavík, Iceland.</i></p>
 <script>
--- a/cl-ggp/installation/index.html	Fri Jan 27 17:41:22 2017 +0000
+++ b/cl-ggp/installation/index.html	Sun Jan 29 22:07:43 2017 +0000
@@ -3,7 +3,7 @@
     <head>
         <meta charset="utf-8"/>
         <title>Installation / cl-ggp</title>
-        <link rel="stylesheet" href="../_dmedia/tango.css"/>
+        <link rel="stylesheet" href="../_dmedia/pygments-clean.css"/>
         <link rel="stylesheet/less" type="text/css" href="../_dmedia/style.less"/>
         <script src="../_dmedia/less.js" type="text/javascript">
         </script>
--- a/cl-ggp/overview/index.html	Fri Jan 27 17:41:22 2017 +0000
+++ b/cl-ggp/overview/index.html	Sun Jan 29 22:07:43 2017 +0000
@@ -3,7 +3,7 @@
     <head>
         <meta charset="utf-8"/>
         <title>Overview / cl-ggp</title>
-        <link rel="stylesheet" href="../_dmedia/tango.css"/>
+        <link rel="stylesheet" href="../_dmedia/pygments-clean.css"/>
         <link rel="stylesheet/less" type="text/css" href="../_dmedia/style.less"/>
         <script src="../_dmedia/less.js" type="text/javascript">
         </script>
@@ -33,7 +33,7 @@
 <h2 id="basics">Basics</h2>
 <p>You can create your own player by extending the <code>ggp-player</code> class, creating an
 object, and calling <code>start-player</code> on it to fire it up:</p>
-<div class="codehilite"><pre><span class="p">(</span><span class="nb">defclass</span> <span class="nv">simple-player</span> <span class="p">(</span><span class="nv">ggp:ggp-player</span><span class="p">)</span>
+<div class="codehilite"><pre><span/><span class="p">(</span><span class="nb">defclass</span> <span class="nv">simple-player</span> <span class="p">(</span><span class="nv">ggp:ggp-player</span><span class="p">)</span>
   <span class="p">())</span>
 
 <span class="p">(</span><span class="nb">defvar</span> <span class="vg">*player*</span> <span class="p">(</span><span class="nb">make-instance</span> <span class="ss">'simple-player</span>
@@ -54,7 +54,7 @@
 <p>At a minimum you <strong>must</strong> implement <code>player-select-move</code>.  The others are
 optional and will default to doing nothing.</p>
 <h3 id="player-start-game">player-start-game</h3>
-<div class="codehilite"><pre><span class="p">(</span><span class="nb">defmethod</span> <span class="nv">player-start-game</span> <span class="p">((</span><span class="nv">player</span> <span class="nv">YOUR-PLAYER</span><span class="p">)</span> <span class="nv">rules</span> <span class="nv">role</span> <span class="nv">timeout</span><span class="p">)</span>
+<div class="codehilite"><pre><span/><span class="p">(</span><span class="nb">defmethod</span> <span class="nv">player-start-game</span> <span class="p">((</span><span class="nv">player</span> <span class="nv">YOUR-PLAYER</span><span class="p">)</span> <span class="nv">rules</span> <span class="nv">role</span> <span class="nv">timeout</span><span class="p">)</span>
   <span class="o">...</span><span class="p">)</span>
 </pre></div>
 
@@ -66,7 +66,7 @@
 <p><code>timeout</code> is the timestamp that the response to the server is due by, in
 internal-real time units (more on this later).</p>
 <h3 id="player-update-game">player-update-game</h3>
-<div class="codehilite"><pre><span class="p">(</span><span class="nb">defmethod</span> <span class="nv">player-update-game</span> <span class="p">((</span><span class="nv">player</span> <span class="nv">YOUR-PLAYER</span><span class="p">)</span> <span class="nv">moves</span><span class="p">)</span>
+<div class="codehilite"><pre><span/><span class="p">(</span><span class="nb">defmethod</span> <span class="nv">player-update-game</span> <span class="p">((</span><span class="nv">player</span> <span class="nv">YOUR-PLAYER</span><span class="p">)</span> <span class="nv">moves</span><span class="p">)</span>
   <span class="o">...</span><span class="p">)</span>
 </pre></div>
 
@@ -76,7 +76,7 @@
 <p><code>moves</code> will be an association list of <code>(role . move)</code> conses representing the
 moves made by each player last turn.</p>
 <h3 id="player-select-move">player-select-move</h3>
-<div class="codehilite"><pre><span class="p">(</span><span class="nb">defmethod</span> <span class="nv">player-select-move</span> <span class="p">((</span><span class="nv">player</span> <span class="nv">YOUR-PLAYER</span><span class="p">)</span> <span class="nv">timeout</span><span class="p">)</span>
+<div class="codehilite"><pre><span/><span class="p">(</span><span class="nb">defmethod</span> <span class="nv">player-select-move</span> <span class="p">((</span><span class="nv">player</span> <span class="nv">YOUR-PLAYER</span><span class="p">)</span> <span class="nv">timeout</span><span class="p">)</span>
   <span class="o">...</span><span class="p">)</span>
 </pre></div>
 
@@ -86,7 +86,7 @@
 <p><code>timeout</code> is the timestamp that the response to the server is due by, in
 internal-real time units (more on this later).</p>
 <h3 id="player-stop-game">player-stop-game</h3>
-<div class="codehilite"><pre><span class="p">(</span><span class="nb">defmethod</span> <span class="nv">player-stop-game</span> <span class="p">((</span><span class="nv">player</span> <span class="nv">YOUR-PLAYER</span><span class="p">))</span>
+<div class="codehilite"><pre><span/><span class="p">(</span><span class="nb">defmethod</span> <span class="nv">player-stop-game</span> <span class="p">((</span><span class="nv">player</span> <span class="nv">YOUR-PLAYER</span><span class="p">))</span>
   <span class="o">...</span><span class="p">)</span>
 </pre></div>
 
@@ -124,7 +124,7 @@
 <h2 id="symbols">Symbols</h2>
 <p>The other tricky part about <code>cl-ggp</code> is how it handles symbols.</p>
 <p>Game descriptions are written in GDL, a fragment of which might look like this:</p>
-<div class="codehilite"><pre>(role x)
+<div class="codehilite"><pre><span/>(role x)
 (role o)
 (init (control x))
 
@@ -157,7 +157,7 @@
 a player.</p>
 <p>First we'll define the player class and implement the required
 <code>player-select-move</code> method for it:</p>
-<div class="codehilite"><pre><span class="p">(</span><span class="nb">defclass</span> <span class="nv">simple-player</span> <span class="p">(</span><span class="nv">ggp:ggp-player</span><span class="p">)</span>
+<div class="codehilite"><pre><span/><span class="p">(</span><span class="nb">defclass</span> <span class="nv">simple-player</span> <span class="p">(</span><span class="nv">ggp:ggp-player</span><span class="p">)</span>
   <span class="p">())</span>
 
 <span class="p">(</span><span class="nb">defmethod</span> <span class="nv">ggp:player-select-move</span> <span class="p">((</span><span class="nv">player</span> <span class="nv">simple-player</span><span class="p">)</span> <span class="nv">timeout</span><span class="p">)</span>
@@ -172,7 +172,7 @@
 move we'll make it every time, otherwise the game server will reject it as
 invalid and just choose a random move for us.</p>
 <p>Now we can actually create a player:</p>
-<div class="codehilite"><pre><span class="p">(</span><span class="nb">defvar</span> <span class="vg">*player*</span>
+<div class="codehilite"><pre><span/><span class="p">(</span><span class="nb">defvar</span> <span class="vg">*player*</span>
   <span class="p">(</span><span class="nb">make-instance</span> <span class="ss">'simple-player</span>
                  <span class="ss">:name</span> <span class="s">"SimplePlayer"</span>
                  <span class="ss">:port</span> <span class="mi">5000</span><span class="p">))</span>
@@ -180,14 +180,14 @@
 
 
 <p>And fire it up:</p>
-<div class="codehilite"><pre><span class="p">(</span><span class="nv">ggp:start-player</span> <span class="vg">*player*</span><span class="p">)</span>
+<div class="codehilite"><pre><span/><span class="p">(</span><span class="nv">ggp:start-player</span> <span class="vg">*player*</span><span class="p">)</span>
 </pre></div>
 
 
 <p>Now we can play a few games with it.  We'll probably lose every time unless
 we're playing an unscrambled game of <a href="https://bitbucket.org/snippets/sjl/erRjL">Don't Press the Button</a>.</p>
 <p>Once we're done we can kill it to free up the port:</p>
-<div class="codehilite"><pre><span class="p">(</span><span class="nv">ggp:kill-player</span> <span class="vg">*player*</span><span class="p">)</span>
+<div class="codehilite"><pre><span/><span class="p">(</span><span class="nv">ggp:kill-player</span> <span class="vg">*player*</span><span class="p">)</span>
 </pre></div>
                 </div>
             <footer><p><i>Made with Lisp and love by <a href="http://stevelosh.com/">Steve Losh</a> in Reykjavík, Iceland.</i></p>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cl-ggp/reference-reasoner/index.html	Sun Jan 29 22:07:43 2017 +0000
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8"/>
+        <title> Reasoner API Reference / cl-ggp</title>
+        <link rel="stylesheet" href="../_dmedia/pygments-clean.css"/>
+        <link rel="stylesheet/less" type="text/css" href="../_dmedia/style.less"/>
+        <script src="../_dmedia/less.js" type="text/javascript">
+        </script>
+    </head>
+    <body class="content">
+        <div class="wrap">
+            <header><h1><a href="..">cl-ggp</a></h1></header>
+                <div class="markdown">
+<h1 id="reasoner-api-reference"><a href="">Reasoner API Reference</a></h1><p>cl-ggp includes a simple Prolog-based reasoner you can use as a starting point when writing general game players in the <code>cl-ggp.reasoner</code> system.</p>
+<div class="toc">
+<ul>
+<li><a href="#package-ggpreasoner">Package GGP.REASONER</a><ul>
+<li><a href="#goal-value-for-function">GOAL-VALUE-FOR (function)</a></li>
+<li><a href="#initial-state-function">INITIAL-STATE (function)</a></li>
+<li><a href="#legal-moves-for-function">LEGAL-MOVES-FOR (function)</a></li>
+<li><a href="#make-reasoner-function">MAKE-REASONER (function)</a></li>
+<li><a href="#next-state-function">NEXT-STATE (function)</a></li>
+<li><a href="#terminalp-function">TERMINALP (function)</a></li>
+</ul>
+</li>
+</ul></div>
+<h2 id="package-ggpreasoner">Package <code>GGP.REASONER</code></h2>
+<p>This package contains a simple GGP reasoner.  It can be useful as a starting point for writing general game players.</p>
+<h3 id="goal-value-for-function"><code>GOAL-VALUE-FOR</code> (function)</h3>
+<div class="codehilite"><pre><span/>(GOAL-VALUE-FOR REASONER STATE ROLE)
+</pre></div>
+
+
+<p>Return the goal value for <code>role</code> in <code>state</code>, or <code>nil</code> if none exists.</p>
+<p>Note that the GDL spec only requires that such values have meaning in terminal
+  states.  Game authors sometimes add goal values to nonterminal states, but
+  this is probably not something you should rely on.</p>
+<h3 id="initial-state-function"><code>INITIAL-STATE</code> (function)</h3>
+<div class="codehilite"><pre><span/>(INITIAL-STATE REASONER)
+</pre></div>
+
+
+<p>Return the initial state of <code>reasoner</code>.</p>
+<h3 id="legal-moves-for-function"><code>LEGAL-MOVES-FOR</code> (function)</h3>
+<div class="codehilite"><pre><span/>(LEGAL-MOVES-FOR REASONER STATE ROLE)
+</pre></div>
+
+
+<p>Return a list of legal moves for <code>role</code> in <code>state</code>.</p>
+<p><code>ggp:player-select-move</code> must return exactly one of the items in this list.</p>
+<h3 id="make-reasoner-function"><code>MAKE-REASONER</code> (function)</h3>
+<div class="codehilite"><pre><span/>(MAKE-REASONER RULES)
+</pre></div>
+
+
+<p>Create and return a reasoner for the given GDL <code>rules</code>.</p>
+<p><code>rules</code> should be a list of GDL rules with the symbols interned into the
+  appropriate packages.  <code>ggp:player-start-game</code> will give you this, or you can
+  use <code>ggp:read-gdl-from-file</code> to get them without a player if you want to just
+  poke at the reasoner.</p>
+<h3 id="next-state-function"><code>NEXT-STATE</code> (function)</h3>
+<div class="codehilite"><pre><span/>(NEXT-STATE REASONER STATE MOVES)
+</pre></div>
+
+
+<p>Compute and return the successor to <code>state</code>, assuming <code>moves</code> were made.</p>
+<p><code>moves</code> should be an alist of <code>(role . move)</code> pairs, which is what
+  <code>ggp:player-update-game</code> will give you.</p>
+<h3 id="terminalp-function"><code>TERMINALP</code> (function)</h3>
+<div class="codehilite"><pre><span/>(TERMINALP REASONER STATE)
+</pre></div>
+
+
+<p>Return whether <code>state</code> is terminal.</p>
+                </div>
+            <footer><p><i>Made with Lisp and love by <a href="http://stevelosh.com/">Steve Losh</a> in Reykjavík, Iceland.</i></p>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-15328874-3', 'auto');
+  ga('send', 'pageview');
+
+</script></footer>
+        </div>
+    </body>
+</html>
\ No newline at end of file
--- a/cl-ggp/reference/index.html	Fri Jan 27 17:41:22 2017 +0000
+++ b/cl-ggp/reference/index.html	Sun Jan 29 22:07:43 2017 +0000
@@ -2,8 +2,8 @@
 <html>
     <head>
         <meta charset="utf-8"/>
-        <title> API Reference / cl-ggp</title>
-        <link rel="stylesheet" href="../_dmedia/tango.css"/>
+        <title> Main API Reference / cl-ggp</title>
+        <link rel="stylesheet" href="../_dmedia/pygments-clean.css"/>
         <link rel="stylesheet/less" type="text/css" href="../_dmedia/style.less"/>
         <script src="../_dmedia/less.js" type="text/javascript">
         </script>
@@ -12,7 +12,7 @@
         <div class="wrap">
             <header><h1><a href="..">cl-ggp</a></h1></header>
                 <div class="markdown">
-<h1 id="api-reference"><a href="">API Reference</a></h1><p>The following is a list of all user-facing parts of <code>cl-ggp</code>.</p>
+<h1 id="main-api-reference"><a href="">Main API Reference</a></h1><p>The following is a list of all user-facing parts of <code>cl-ggp</code>.</p>
 <p>If there are backwards-incompatible changes to anything listed here, they will
 be noted in the changelog and the author will feel bad.</p>
 <p>Anything not listed here is subject to change at any time with no warning, so
@@ -20,23 +20,14 @@
 <div class="toc">
 <ul>
 <li><a href="#package-ggp">Package GGP</a><ul>
-<li><a href="#ggp-player-class">GGP-PLAYER (class)</a><ul>
-<li><a href="#slot-name">Slot NAME</a></li>
-<li><a href="#slot-port">Slot PORT</a></li>
-<li><a href="#slot-match-roles">Slot MATCH-ROLES</a></li>
-<li><a href="#slot-start-clock">Slot START-CLOCK</a></li>
-<li><a href="#slot-play-clock">Slot PLAY-CLOCK</a></li>
-<li><a href="#slot-message-start">Slot MESSAGE-START</a></li>
-<li><a href="#slot-current-match">Slot CURRENT-MATCH</a></li>
-<li><a href="#slot-server">Slot SERVER</a></li>
-</ul>
-</li>
+<li><a href="#ggp-player-class">GGP-PLAYER (class)</a></li>
 <li><a href="#kill-player-function">KILL-PLAYER (function)</a></li>
 <li><a href="#player-select-move-generic-function">PLAYER-SELECT-MOVE (generic function)</a></li>
 <li><a href="#player-start-game-generic-function">PLAYER-START-GAME (generic function)</a></li>
 <li><a href="#player-stop-game-generic-function">PLAYER-STOP-GAME (generic function)</a></li>
 <li><a href="#player-update-game-generic-function">PLAYER-UPDATE-GAME (generic function)</a></li>
 <li><a href="#player-update-game-ii-generic-function">PLAYER-UPDATE-GAME-II (generic function)</a></li>
+<li><a href="#read-gdl-from-file-function">READ-GDL-FROM-FILE (function)</a></li>
 <li><a href="#start-player-function">START-PLAYER (function)</a></li>
 </ul>
 </li>
@@ -46,66 +37,8 @@
 <p>The main GGP package.</p>
 <h3 id="ggp-player-class"><code>GGP-PLAYER</code> (class)</h3>
 <p>The base class for a GGP player.  Custom players should extend this.</p>
-<h4 id="slot-name">Slot <code>NAME</code></h4>
-<ul>
-<li>Allocation: <code>:INSTANCE</code></li>
-<li>Type: <code>STRING</code></li>
-<li>Initarg: <code>:NAME</code></li>
-<li>Initform: <code>"CL-GGP"</code></li>
-<li>Reader: <code>PLAYER-NAME</code></li>
-</ul>
-<p>The name of the player.</p>
-<h4 id="slot-port">Slot <code>PORT</code></h4>
-<ul>
-<li>Allocation: <code>:INSTANCE</code></li>
-<li>Type: <code>(INTEGER 0)</code></li>
-<li>Initarg: <code>:PORT</code></li>
-<li>Initform: <code>9999</code></li>
-<li>Reader: <code>PLAYER-PORT</code></li>
-</ul>
-<p>The port the HTTP server should listen on.</p>
-<h4 id="slot-match-roles">Slot <code>MATCH-ROLES</code></h4>
-<ul>
-<li>Allocation: <code>:INSTANCE</code></li>
-<li>Type: <code>(OR NULL LIST)</code></li>
-<li>Initform: <code>NIL</code></li>
-<li>Reader: <code>PLAYER-MATCH-ROLES</code></li>
-</ul>
-<p>A list of the roles for the current match.  Feel free to read and use this if you like.  <strong>Do not modify this.</strong></p>
-<h4 id="slot-start-clock">Slot <code>START-CLOCK</code></h4>
-<ul>
-<li>Allocation: <code>:INSTANCE</code></li>
-<li>Type: <code>(OR NULL (INTEGER 1))</code></li>
-<li>Initform: <code>NIL</code></li>
-</ul>
-<p>The start clock for the current game.  <strong>Do not touch this.</strong>  Use the <code>timeout</code> value passed to your methods instead.</p>
-<h4 id="slot-play-clock">Slot <code>PLAY-CLOCK</code></h4>
-<ul>
-<li>Allocation: <code>:INSTANCE</code></li>
-<li>Type: <code>(OR NULL (INTEGER 1))</code></li>
-<li>Initform: <code>NIL</code></li>
-</ul>
-<p>The play clock for the current game.  <strong>Do not touch this.</strong>  Use the <code>timeout</code> value passed to your methods instead.</p>
-<h4 id="slot-message-start">Slot <code>MESSAGE-START</code></h4>
-<ul>
-<li>Allocation: <code>:INSTANCE</code></li>
-<li>Type: <code>(OR NULL (INTEGER 0))</code></li>
-<li>Initform: <code>NIL</code></li>
-</ul>
-<p>The (internal-real) timestamp of when the current GGP message was received.  <strong>Do not touch this.</strong>  Use the <code>timeout</code> value passed to your methods instead.</p>
-<h4 id="slot-current-match">Slot <code>CURRENT-MATCH</code></h4>
-<ul>
-<li>Allocation: <code>:INSTANCE</code></li>
-<li>Initform: <code>NIL</code></li>
-</ul>
-<p>The ID of the current match the player is playing, or <code>nil</code> if it is waiting.  <strong>Do not touch this.</strong></p>
-<h4 id="slot-server">Slot <code>SERVER</code></h4>
-<ul>
-<li>Allocation: <code>:INSTANCE</code></li>
-</ul>
-<p>The Clack server object of the player.  <strong>Do not touch this.</strong>  Use <code>start-player</code> and <code>kill-player</code> to start/stop the server safely.</p>
 <h3 id="kill-player-function"><code>KILL-PLAYER</code> (function)</h3>
-<div class="codehilite"><pre>(KILL-PLAYER PLAYER)
+<div class="codehilite"><pre><span/>(KILL-PLAYER PLAYER)
 </pre></div>
 
 
@@ -113,7 +46,7 @@
 <p>This will <strong>not</strong> be done gently.  No cleanup will be performed if the player
   is in the middle of a game.  Be careful.</p>
 <h3 id="player-select-move-generic-function"><code>PLAYER-SELECT-MOVE</code> (generic function)</h3>
-<div class="codehilite"><pre>(PLAYER-SELECT-MOVE PLAYER TIMEOUT)
+<div class="codehilite"><pre><span/>(PLAYER-SELECT-MOVE PLAYER TIMEOUT)
 </pre></div>
 
 
@@ -126,7 +59,7 @@
   internal-real time units.  Basically: when <code>(get-internal-real-time)</code> returns
   this number, your message better have reached the server.</p>
 <h3 id="player-start-game-generic-function"><code>PLAYER-START-GAME</code> (generic function)</h3>
-<div class="codehilite"><pre>(PLAYER-START-GAME PLAYER RULES ROLE TIMEOUT)
+<div class="codehilite"><pre><span/>(PLAYER-START-GAME PLAYER RULES ROLE TIMEOUT)
 </pre></div>
 
 
@@ -138,7 +71,7 @@
   internal-real time units.  Basically: when <code>(get-internal-real-time)</code> returns
   this number, your message better have reached the server.</p>
 <h3 id="player-stop-game-generic-function"><code>PLAYER-STOP-GAME</code> (generic function)</h3>
-<div class="codehilite"><pre>(PLAYER-STOP-GAME PLAYER)
+<div class="codehilite"><pre><span/>(PLAYER-STOP-GAME PLAYER)
 </pre></div>
 
 
@@ -146,7 +79,7 @@
 <p>This is a good place to do any teardown stuff your player might need, or maybe
   to suggest a GC to your Lisp implementation.</p>
 <h3 id="player-update-game-generic-function"><code>PLAYER-UPDATE-GAME</code> (generic function)</h3>
-<div class="codehilite"><pre>(PLAYER-UPDATE-GAME PLAYER MOVES)
+<div class="codehilite"><pre><span/>(PLAYER-UPDATE-GAME PLAYER MOVES)
 </pre></div>
 
 
@@ -154,15 +87,21 @@
 <p><code>moves</code> will be a list of <code>(role . move)</code> conses representing moves made by
   each player last turn.</p>
 <h3 id="player-update-game-ii-generic-function"><code>PLAYER-UPDATE-GAME-II</code> (generic function)</h3>
-<div class="codehilite"><pre>(PLAYER-UPDATE-GAME-II PLAYER MOVE PERCEPTS)
+<div class="codehilite"><pre><span/>(PLAYER-UPDATE-GAME-II PLAYER MOVE PERCEPTS)
 </pre></div>
 
 
 <p>Called after all players have made their moves in a GDL-II game.</p>
 <p><code>move</code> will be the move you played last turn.</p>
 <p><code>percepts</code> are all the percepts you see for the round.</p>
+<h3 id="read-gdl-from-file-function"><code>READ-GDL-FROM-FILE</code> (function)</h3>
+<div class="codehilite"><pre><span/>(READ-GDL-FROM-FILE FILENAME)
+</pre></div>
+
+
+<p>Read GDL from <code>filename</code></p>
 <h3 id="start-player-function"><code>START-PLAYER</code> (function)</h3>
-<div class="codehilite"><pre>(START-PLAYER PLAYER &amp;KEY (SERVER :HUNCHENTOOT) (USE-THREAD T))
+<div class="codehilite"><pre><span/>(START-PLAYER PLAYER &amp;KEY (SERVER :HUNCHENTOOT) (USE-THREAD T))
 </pre></div>