# HG changeset patch # User Steve Losh <steve@stevelosh.com> # Date 1485727663 0 # Node ID f5a0fcf62e5ef911a3cae981420b176478d5afcb # Parent 19233527280de43ed4b884a48a9b495cc86d1614 cl-ggp: Update site. diff -r 19233527280d -r f5a0fcf62e5e cl-ggp/_dmedia/pygments-clean.css --- /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 */ diff -r 19233527280d -r f5a0fcf62e5e cl-ggp/changelog/index.html --- 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> diff -r 19233527280d -r f5a0fcf62e5e cl-ggp/index.html --- 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> diff -r 19233527280d -r f5a0fcf62e5e cl-ggp/installation/index.html --- 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> diff -r 19233527280d -r f5a0fcf62e5e cl-ggp/overview/index.html --- 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> diff -r 19233527280d -r f5a0fcf62e5e cl-ggp/reference-reasoner/index.html --- /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 diff -r 19233527280d -r f5a0fcf62e5e cl-ggp/reference/index.html --- 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 &KEY (SERVER :HUNCHENTOOT) (USE-THREAD T)) +<div class="codehilite"><pre><span/>(START-PLAYER PLAYER &KEY (SERVER :HUNCHENTOOT) (USE-THREAD T)) </pre></div>