mirror of https://github.com/dirtbags/tanks.git
Clean up docs. I hope this doesn't break the web site.
This commit is contained in:
parent
ffc7d07214
commit
a2c4164a65
|
@ -10,5 +10,13 @@ Requests
|
||||||
========
|
========
|
||||||
|
|
||||||
* Merge devdsp fixes (https://github.com/devdsp/tanks/commits/master)
|
* Merge devdsp fixes (https://github.com/devdsp/tanks/commits/master)
|
||||||
|
|
||||||
|
Done
|
||||||
|
====
|
||||||
|
|
||||||
* Fix leaderboard
|
* Fix leaderboard
|
||||||
|
|
||||||
|
Won't Fix
|
||||||
|
=======
|
||||||
|
|
||||||
* Read sensors from "sensors" and not "sensor[0-9]"
|
* Read sensors from "sensors" and not "sensor[0-9]"
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
defaults:
|
|
||||||
-
|
|
||||||
scope:
|
|
||||||
path: ""
|
|
||||||
values:
|
|
||||||
layout: "default"
|
|
|
@ -1,29 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="{{ site.lang | default: "en-US" }}">
|
|
||||||
<head>
|
|
||||||
<meta charset='utf-8'>
|
|
||||||
<meta name="viewport" content="width=device-width">
|
|
||||||
<link rel="stylesheet" href="{{ '/assets/css/dirtbags.css?v=' | append: site.github.build_revision | relative_url }}">
|
|
||||||
<link rel="icon" type="image/png" href="{{ '/assets/images/icon.png' | relative_url }}">
|
|
||||||
{% if page.scripts %}{% for js_file in page.scripts %}
|
|
||||||
<script src="{{ js_file }}"></script>
|
|
||||||
{% endfor %}{% endif %}
|
|
||||||
<title>{{ site.title | default: site.github.repository_name }} by {{ site.github.owner_name }}</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h1 id="title">{{ page.title | default: site.title }}</h1>
|
|
||||||
|
|
||||||
{{ content }}
|
|
||||||
|
|
||||||
<nav>
|
|
||||||
<ul>
|
|
||||||
<li><a href="{{ '/' | relative_url }}">Home</a></li>
|
|
||||||
<li><a href="{{ '/running' | relative_url }}">Running</a></li>
|
|
||||||
<li><a href="{{ '/history' | relative_url }}">History</a></li>
|
|
||||||
<li><a href="{{ '/thanks' | relative_url }}">Thanks</a></li>
|
|
||||||
<li><a href="https://github.com/dirtbags/tanks" title="Tanks on Github">Source</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,36 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en-US">
|
|
||||||
<head>
|
|
||||||
<meta charset='utf-8'>
|
|
||||||
<meta name="viewport" content="width=device-width">
|
|
||||||
<link rel="stylesheet" href="/assets/css/dirtbags.css?v=">
|
|
||||||
<link rel="icon" type="image/png" href="/assets/images/icon.png">
|
|
||||||
|
|
||||||
<title> by </title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h1 id="title">To-Do List</h1>
|
|
||||||
|
|
||||||
<h1 id="bugs">BUGS</h1>
|
|
||||||
|
|
||||||
<h1 id="requests">Requests</h1>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Merge devdsp fixes (https://github.com/devdsp/tanks/commits/master)</li>
|
|
||||||
<li>Fix leaderboard</li>
|
|
||||||
<li>Read sensors from “sensors” and not “sensor[0-9]”</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
|
|
||||||
<nav>
|
|
||||||
<ul>
|
|
||||||
<li><a href="/">Home</a></li>
|
|
||||||
<li><a href="/running">Running</a></li>
|
|
||||||
<li><a href="/history">History</a></li>
|
|
||||||
<li><a href="/thanks">Thanks</a></li>
|
|
||||||
<li><a href="https://github.com/dirtbags/tanks" title="Tanks on Github">Source</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,151 +0,0 @@
|
||||||
/**** document ****/
|
|
||||||
|
|
||||||
html {
|
|
||||||
background: #eed url(/assets/images/grunge.png) repeat-x;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: sans-serif;
|
|
||||||
color: #112;
|
|
||||||
padding: 10px;
|
|
||||||
max-width: 700px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**** heading ****/
|
|
||||||
|
|
||||||
#title {
|
|
||||||
text-transform: lowercase;
|
|
||||||
font-size: 1.6em;
|
|
||||||
padding: 3px;
|
|
||||||
margin: 0 0 1em 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#title:before {
|
|
||||||
color: #999;
|
|
||||||
letter-spacing: -0.1em;
|
|
||||||
content: "Dirtbags: ";
|
|
||||||
}
|
|
||||||
|
|
||||||
/*** left side bar ***/
|
|
||||||
|
|
||||||
nav h2 {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav ul {
|
|
||||||
list-style: none;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav li {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav li a {
|
|
||||||
text-transform: lowercase;
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav li + li:before {
|
|
||||||
content: " | ";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**** body ****/
|
|
||||||
|
|
||||||
a img {
|
|
||||||
border: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: #2a4;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
color: #ddc;
|
|
||||||
background: #2a4;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
h1, h2, h3 {
|
|
||||||
color: #464;
|
|
||||||
letter-spacing: -0.05em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.readme {
|
|
||||||
background-color: #ccc;
|
|
||||||
margin: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre {
|
|
||||||
background-color: #ccc;
|
|
||||||
border: solid #888 2px;
|
|
||||||
padding: 0.25em;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
th {
|
|
||||||
vertical-align: top;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
vertical-align: top;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
line-height: 1.4em;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr {
|
|
||||||
border: 1px solid #444;
|
|
||||||
}
|
|
||||||
|
|
||||||
dt {
|
|
||||||
white-space: pre;
|
|
||||||
background-color: #333;
|
|
||||||
padding: 5px;
|
|
||||||
border: 2px solid green;
|
|
||||||
border-bottom: none;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
dd {
|
|
||||||
border: 2px solid green;
|
|
||||||
margin: 0px;
|
|
||||||
padding: 5px;
|
|
||||||
background-color: #282828;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**** special cases ****/
|
|
||||||
|
|
||||||
.wide {
|
|
||||||
max-width: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.figure {
|
|
||||||
margin: 0.5em 1em;
|
|
||||||
float: right;
|
|
||||||
font-size: small;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scoreboard {
|
|
||||||
background: #222;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scoreboard td {
|
|
||||||
height: 400px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#battlefield {
|
|
||||||
border: 2px solid green;
|
|
||||||
}
|
|
||||||
|
|
||||||
.solved {
|
|
||||||
text-decoration: line-through;
|
|
||||||
}
|
|
Binary file not shown.
Before Width: | Height: | Size: 6.6 KiB |
|
@ -1,5 +0,0 @@
|
||||||
default_ = [[300, 150, 50],[["#a08080",[[50, 0.00, 0.14, 1],[30, 0.00, 0.87, 0],[50, 0.00, 0.17, 0],[100, 5.50, 1.75, 1],[100, 0.79, 1.75, 1],[60, 3.14, 3.14, 0],]], ["#808080",[[50, 0.00, 0.12, 1],[30, 0.00, 1.57, 0],]],],[[[75,75,3.86,0.96,2,0], [225,75,4.26,0.49,0,0],], [[73,73,3.86,0.65,2,0], [223,72,4.26,0.68,0,0],], [[69,70,3.86,0.33,2,0], [222,70,4.24,0.87,0,0],], [[65,66,3.86,0.02,2,0], [221,67,4.23,1.06,0,0],], [[61,62,3.86,-0.00,2,0], [220,65,4.22,1.27,0,0],], [[56,59,3.86,0.00,2,0], [218,63,4.20,1.48,0,0],], [[52,55,3.86,-0.00,2,0], [217,60,4.19,1.68,0,0],], [[48,51,3.86,-0.00,2,0], [215,58,4.18,1.88,0,0],], [[44,48,3.86,0.00,2,0], [214,55,4.16,2.09,0,0],], [[39,44,3.86,-0.00,2,0], [213,53,4.15,2.30,0,0],], [[35,41,3.77,0.00,2,0], [211,51,4.13,2.51,0,0],], [[31,38,3.68,-0.00,2,0], [209,48,4.12,2.72,0,0],], [[26,36,3.60,-0.00,2,0], [208,46,4.11,2.93,0,0],], [[21,34,3.51,0.00,2,0], [206,44,4.09,3.14,0,0],], [[16,33,3.43,-0.00,2,0], [205,42,4.08,3.35,0,0],], [[11,32,3.34,-0.00,2,0], [203,39,4.06,3.56,0,0],], [[6,31,3.25,0.00,2,8], [201,37,4.05,3.77,0,0],], [[2,31,3.11,-0.31,2,16], [200,35,4.04,3.98,0,0],], [[299,31,3.25,0.00,2,24], [198,33,4.02,4.19,0,0],], [[293,29,3.39,-0.00,2,8], [196,31,4.01,4.40,0,0],], [[289,28,3.39,-0.31,2,24], [194,29,4.00,4.59,0,0],], [[283,27,3.39,-0.31,2,24], [192,27,3.98,4.80,0,0],], [[276,25,3.39,-0.31,2,24], [190,25,3.97,4.99,0,0],], [[269,23,3.39,-0.30,2,24], [189,23,3.95,5.18,0,0],], [[262,21,3.39,-0.28,2,24], [187,21,3.94,5.39,0,0],], [[255,20,3.39,-0.26,2,24], [185,19,3.93,5.59,0,0],], [[249,18,3.39,-0.24,2,24], [183,17,3.91,5.78,0,0],], [[242,16,3.39,-0.23,2,24], [181,15,3.90,5.99,0,0],], [[235,14,3.39,-0.21,3,25], 0,],]];
|
|
||||||
|
|
||||||
antlion = [[300, 150, 50],[["#808080",[[50, 0.00, 0.00, 1],[70, 0.00, 0.87, 0],]], ["#ff8844",[[50, 0.00, 0.09, 1],[100, 4.68, 3.09, 1],[100, 1.61, 3.11, 1],[60, 0.00, 2.09, 0],[60, 2.09, 2.09, 0],[60, 4.19, 2.09, 0],[100, 0.00, 0.09, 1],]],],[[[75,75,5.78,2.71,0,0], [225,75,3.28,1.95,0,0],], [[77,73,5.78,3.02,0,0], [225,75,3.28,2.06,0,0],], [[81,71,5.78,3.14,0,0], [225,75,3.28,2.16,0,0],], [[87,68,5.78,3.14,0,0], [225,75,3.28,2.25,0,0],], [[93,64,5.78,3.14,0,0], [225,75,3.28,2.34,0,0],], [[99,61,5.78,3.14,0,0], [225,75,3.28,2.44,0,0],], [[105,57,5.78,3.14,0,0], [225,75,3.28,2.53,0,0],], [[112,54,5.78,3.14,0,0], [225,75,3.28,2.62,0,0],], [[118,51,5.78,3.14,0,0], [225,75,3.28,2.71,0,0],], [[124,47,5.78,3.14,0,0], [225,75,3.28,2.79,0,2],], [[130,44,5.78,3.14,0,0], [225,75,3.28,2.48,0,2],], [[136,40,5.78,3.14,0,0], [225,75,3.28,2.16,0,2],], [[142,37,5.78,3.14,0,0], [225,75,3.28,1.85,0,2],], [[148,34,5.78,3.14,0,0], [225,75,3.28,1.54,0,2],], [[154,30,5.78,3.14,0,0], [225,75,3.28,1.22,0,2],], [[160,28,5.90,3.14,0,0], [225,75,3.28,0.91,0,2],], [[167,25,5.90,3.14,0,0], [225,75,3.28,0.59,0,70],], [[173,23,5.90,3.14,0,0], [225,75,3.28,0.28,0,4],], [[180,20,5.90,3.14,0,0], [225,75,3.28,0.59,0,68],], [[186,17,5.90,3.14,0,0], [225,75,3.28,0.28,0,4],], [[193,15,5.90,3.14,0,0], [225,75,3.28,0.59,0,4],], [[199,12,5.90,3.14,0,0], [225,75,3.28,0.91,0,92],], [[206,10,5.90,3.14,0,0], [222,74,3.24,0.59,0,20],], [[212,7,5.90,3.14,0,0], [218,74,3.15,0.91,0,20],], [[218,4,5.78,3.14,0,0], [212,75,2.96,1.22,0,4],], [[224,1,5.78,3.14,0,0], [208,77,2.77,1.54,0,2],], [[230,147,5.78,3.14,0,0], [207,78,2.65,1.22,0,2],], [[236,144,5.78,3.14,0,0], [207,78,2.65,0.91,0,2],], [[242,140,5.78,3.14,0,0], [207,78,2.65,0.59,0,2],], [[248,137,5.78,3.14,0,0], [207,78,2.65,0.28,0,2],], [[254,134,5.78,3.14,0,0], [207,78,2.65,-0.03,0,2],], [[260,130,5.78,3.14,0,0], [207,78,2.65,-0.35,0,2],], [[267,127,5.78,3.14,0,0], [207,78,2.65,-0.66,0,2],], [[273,123,5.78,3.14,0,0], [207,78,2.65,-0.98,0,2],], [[279,120,5.78,3.14,0,0], [207,78,2.65,-1.29,0,2],], [[285,117,5.78,3.14,0,0], [207,78,2.65,-1.61,0,2],], [[291,113,5.78,3.14,0,0], [207,78,2.65,-1.92,0,2],], [[297,110,5.78,3.14,0,0], [207,78,2.65,-2.23,0,66],], [[3,106,5.78,3.14,0,0], [207,78,2.65,-1.92,0,2],], [[9,103,5.78,3.14,0,0], [207,78,2.65,-2.23,0,2],], [[16,100,5.78,3.14,0,0], [207,78,2.65,-2.55,0,0],], [[22,96,5.78,3.14,0,0], [207,78,2.65,-2.44,0,0],], [[28,93,5.78,3.14,0,0], [207,78,2.65,-2.32,0,0],], [[34,90,5.78,3.14,0,0], [207,78,2.65,-2.20,0,0],], [[40,86,5.78,3.14,0,0], [207,78,2.65,-2.08,0,0],], [[46,84,5.90,3.14,0,0], [207,78,2.65,-1.95,0,0],], [[52,81,5.90,3.14,0,0], [207,78,2.65,-1.85,0,0],], [[59,79,5.90,3.14,0,0], [207,78,2.65,-1.75,0,0],], [[65,76,5.90,3.14,0,0], [207,78,2.65,-1.64,0,0],], [[72,73,5.90,3.14,0,0], [207,78,2.65,-1.54,0,0],], [[78,71,5.90,3.14,0,0], [207,78,2.65,-1.43,0,0],], [[85,68,5.90,3.14,0,0], [207,78,2.65,-1.33,0,0],], [[91,66,5.90,3.14,0,0], [207,78,2.65,-1.20,0,0],], [[98,63,5.90,3.14,0,0], [207,78,2.65,-1.08,0,0],], [[104,60,5.90,3.14,0,0], [207,78,2.65,-0.96,0,4],], [[111,58,5.90,3.14,0,0], [207,78,2.65,-0.65,0,4],], [[117,56,6.03,3.14,0,0], [207,78,2.65,-0.33,0,4],], [[124,54,6.03,3.14,0,0], [207,78,2.65,-0.02,0,4],], [[130,53,6.03,3.14,0,0], [207,78,2.65,0.30,0,4],], [[137,51,6.03,3.14,0,0], [207,78,2.65,0.61,0,4],], [[144,49,6.03,3.14,0,0], [207,78,2.65,0.93,0,70],], [[151,47,6.03,3.14,0,0], [207,78,2.65,0.61,0,28],], [[157,45,6.03,3.14,0,0], [205,79,2.65,0.93,0,28],], [0, [201,81,2.56,1.24,1,85],],]];
|
|
||||||
|
|
||||||
shortround = [[300, 300, 50],[["#80f0c0",[[50, 0.00, 0.17, 1],[35, 0.00, 1.57, 0],[100, 0.52, 1.03, 0],[100, 5.76, 1.03, 0],[70, 3.14, 3.14, 0],[100, 1.57, 1.03, 0],[100, 4.71, 1.03, 0],[100, 0.00, 0.09, 1],[55, 0.87, 1.55, 0],[55, 5.41, 1.55, 0],]], ["#ff8844",[[50, 0.00, 0.09, 1],[100, 4.68, 3.09, 1],[100, 1.61, 3.11, 1],[60, 0.00, 2.09, 0],[60, 2.09, 2.09, 0],[60, 4.19, 2.09, 0],[100, 0.00, 0.09, 1],]], ["#ff0033",[[50, 0.00, 0.17, 1],[100, 1.57, 2.62, 1],[100, 4.71, 2.62, 1],]], ["#a08080",[[50, 0.00, 0.14, 1],[30, 0.00, 0.87, 0],[50, 0.00, 0.17, 0],[100, 5.50, 1.75, 1],[100, 0.79, 1.75, 1],[60, 3.14, 3.14, 0],]],],[[[75,75,0.87,0.02,2,0], [225,75,0.24,1.41,0,0], [75,225,5.64,2.15,0,0], [225,225,0.35,-0.00,2,0],], [[76,76,0.87,-0.00,2,0], [225,75,0.24,1.50,0,0], [75,225,5.64,1.83,0,0], [227,225,0.35,0.00,2,0],], [[79,80,0.87,0.00,2,0], [225,75,0.24,1.61,0,0], [75,225,5.64,1.52,0,0], [231,227,0.35,-0.00,2,0],], [[83,85,0.87,-0.00,2,0], [225,75,0.24,1.71,0,0], [75,225,5.64,1.20,0,0], [237,229,0.35,-0.00,2,0],], [[87,90,0.87,-0.00,2,0], [225,75,0.24,1.82,0,0], [75,225,5.64,0.89,0,0], [242,231,0.35,0.00,2,0],], [[91,95,0.87,0.00,2,0], [225,75,0.24,1.92,0,0], [75,225,5.64,0.58,0,0], [247,233,0.35,-0.00,2,0],], [[95,100,0.96,-0.00,2,0], [225,75,0.24,2.02,0,0], [75,225,5.64,0.26,0,0], [252,235,0.35,0.00,2,0],], [[98,105,1.05,-0.00,2,0], [225,75,0.24,2.11,0,0], [75,225,5.64,0.00,0,0], [258,237,0.35,-0.00,2,0],], [[101,111,1.13,0.00,2,0], [225,75,0.24,2.20,0,0], [75,225,5.64,-0.00,0,0], [263,239,0.35,-0.00,2,0],], [[103,116,1.13,-0.00,2,0], [225,75,0.24,2.29,0,0], [75,225,5.64,0.00,0,4], [268,240,0.35,0.00,2,8],], [[105,122,1.22,0.00,2,4], [225,75,0.24,2.37,0,0], [75,225,5.64,-0.31,0,4], [272,242,0.28,-0.31,2,24],], [[106,127,1.38,-0.00,2,4], [225,75,0.24,2.46,0,0], [75,225,5.64,-0.63,0,4], [278,243,0.22,-0.30,2,24],], [[106,131,1.63,-0.00,2,4], [225,75,0.24,2.55,0,0], [75,225,5.64,-0.94,0,6], [285,244,0.22,-0.28,2,24],], [[105,134,1.93,0.00,2,140], [225,75,0.24,2.65,0,0], [75,225,5.64,-1.26,0,6], [292,246,0.22,-0.26,2,8],], [[102,138,2.22,-0.00,2,8], [225,75,0.24,2.74,0,0], [75,225,5.64,-1.57,0,6], [296,247,0.22,-0.58,2,24],], [[99,141,2.32,-0.00,2,8], [225,75,0.24,2.83,0,0], [75,225,5.64,-1.88,0,6], [3,248,0.22,-0.58,2,24],], [[97,144,2.15,0.00,2,8], [225,75,0.24,2.91,0,0], [75,225,5.64,-2.20,0,6], [10,250,0.22,-0.56,2,24],], [[96,148,1.88,-0.00,2,140], [225,75,0.24,3.00,0,0], [75,225,5.64,-2.51,0,6], [17,251,0.22,-0.54,2,24],], [[95,153,1.64,-0.00,2,4], [225,75,0.24,3.09,0,0], [75,225,5.64,-2.83,0,6], [24,253,0.22,-0.54,2,24],], [[95,158,1.64,0.00,2,4], [225,75,0.24,3.18,0,0], [75,225,5.64,-3.14,1,3], 0,], [[94,162,1.82,-0.00,2,140], [225,75,0.24,3.26,0,0], [75,225,5.64,-2.83,0,2], 0,], [[92,168,1.97,0.00,2,652], [225,75,0.24,3.37,0,0], [75,225,5.64,-2.51,0,2], 0,], [[89,175,1.97,-0.00,3,653], [225,75,0.24,3.46,0,0], 0, 0,], [[86,181,1.97,-0.00,0,0], [225,75,0.24,3.54,0,0], 0, 0,], [[84,187,1.97,0.00,0,0], [225,75,0.24,3.63,0,0], 0, 0,], [[81,193,1.97,-0.00,0,0], [225,75,0.24,3.72,0,0], 0, 0,], [[78,198,2.05,-0.00,0,0], [225,75,0.24,3.80,0,0], 0, 0,], [[76,204,2.05,0.00,0,0], [225,75,0.24,3.89,0,0], 0, 0,], [[73,209,2.05,-0.00,0,0], [225,75,0.24,3.98,0,0], 0, 0,], [[70,215,2.05,0.00,0,0], [225,75,0.24,4.08,0,0], 0, 0,], [[67,220,2.05,-0.00,0,0], [225,75,0.24,4.19,0,0], 0, 0,], [[64,226,2.05,-0.00,0,0], [225,75,0.24,4.29,0,0], 0, 0,], [[61,231,2.14,0.00,0,0], [225,75,0.24,4.40,0,0], 0, 0,], [[57,237,2.14,-0.00,0,0], [225,75,0.24,4.49,0,0], 0, 0,], [[54,242,2.14,-0.00,0,0], [225,75,0.24,4.57,0,0], 0, 0,], [[50,247,2.14,0.00,0,0], [225,75,0.24,4.66,0,0], 0, 0,], [[47,252,2.14,-0.00,0,0], [225,75,0.24,4.75,0,0], 0, 0,], [[44,258,2.14,-0.00,0,0], [225,75,0.24,4.83,0,0], 0, 0,], [[40,263,2.14,0.00,0,0], [225,75,0.24,4.92,0,0], 0, 0,], [[37,268,2.14,-0.00,0,0], [225,75,0.24,5.01,0,0], 0, 0,], [[33,274,2.14,0.00,0,0], [225,75,0.24,5.10,0,0], 0, 0,], [[30,279,2.23,-0.00,0,0], [225,75,0.24,5.20,0,0], 0, 0,], [[26,284,2.23,-0.00,2,0], [225,75,0.24,5.31,0,0], 0, 0,], [[22,289,2.23,0.00,2,0], [225,75,0.24,5.39,0,0], 0, 0,], [[18,294,2.23,-0.00,2,0], [225,75,0.24,5.48,0,0], 0, 0,], [[14,299,2.23,-0.00,2,0], [225,75,0.24,5.57,0,0], 0, 0,], [[10,3,2.31,0.00,2,0], [225,75,0.24,5.65,0,0], 0, 0,], [[6,8,2.31,-0.00,2,4], [225,75,0.24,5.74,0,2], 0, 0,], [[2,11,2.42,-0.00,2,140], [225,75,0.24,5.43,0,66], 0, 0,], [[297,15,2.46,0.00,2,140], [225,75,0.24,5.74,0,2], 0, 0,], [[291,20,2.46,-0.00,2,140], [225,75,0.24,5.43,0,66], 0, 0,], [[286,24,2.46,0.00,2,140], [225,75,0.24,5.74,0,2], 0, 0,], [[280,29,2.46,-0.00,2,140], [225,75,0.24,5.43,0,66], 0, 0,], [[275,33,2.46,-0.00,2,140], [225,75,0.24,5.74,0,10], 0, 0,], [[270,37,2.46,0.00,2,908], [222,74,0.24,5.43,0,78], 0, 0,], [[264,42,2.46,-0.00,3,397], 0, 0, 0,],]];
|
|
|
@ -1,310 +0,0 @@
|
||||||
function dbg(o) {
|
|
||||||
e = document.getElementById("debug");
|
|
||||||
e.innerHTML = o;
|
|
||||||
}
|
|
||||||
|
|
||||||
function torgba(color, alpha) {
|
|
||||||
var r = parseInt(color.substring(1,3), 16);
|
|
||||||
var g = parseInt(color.substring(3,5), 16);
|
|
||||||
var b = parseInt(color.substring(5,7), 16);
|
|
||||||
|
|
||||||
return "rgba(" + r + "," + g + "," + b + "," + alpha + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
function Tank(ctx, width, height, color, sensors) {
|
|
||||||
var craterStroke = torgba(color, 0.5);
|
|
||||||
var craterFill = torgba(color, 0.2);
|
|
||||||
var sensorStroke = torgba(color, 0.4);
|
|
||||||
var maxlen = 0;
|
|
||||||
|
|
||||||
this.x = 0;
|
|
||||||
this.y = 0;
|
|
||||||
this.rotation = 0;
|
|
||||||
this.turret = 0;
|
|
||||||
|
|
||||||
this.dead = 0;
|
|
||||||
|
|
||||||
// Do all the yucky math up front
|
|
||||||
this.sensors = new Array();
|
|
||||||
for (i in sensors) {
|
|
||||||
var s = sensors[i];
|
|
||||||
|
|
||||||
if (! s) {
|
|
||||||
this.sensors[i] = [0,0,0,0];
|
|
||||||
} else {
|
|
||||||
// r, angle, width, turret
|
|
||||||
this.sensors[i] = new Array();
|
|
||||||
this.sensors[i][0] = s[0];
|
|
||||||
this.sensors[i][1] = s[1] - s[2]/2;
|
|
||||||
this.sensors[i][2] = s[1] + s[2]/2;
|
|
||||||
this.sensors[i][3] = s[3]?1:0;
|
|
||||||
if (s[0] > maxlen) {
|
|
||||||
maxlen = s[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set up our state, for later interleaved draw requests
|
|
||||||
this.set_state = function(x, y, rotation, turret, flags, sensor_state) {
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
this.rotation = rotation;
|
|
||||||
this.turret = turret;
|
|
||||||
if (flags & 1) {
|
|
||||||
this.fire = 5;
|
|
||||||
}
|
|
||||||
this.led = flags & 2;
|
|
||||||
this.dead = flags & 4;
|
|
||||||
this.sensor_state = sensor_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.draw_crater = function() {
|
|
||||||
if (!this.dead) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var points = 7;
|
|
||||||
var angle = Math.PI / points;
|
|
||||||
|
|
||||||
ctx.save();
|
|
||||||
ctx.translate(this.x, this.y);
|
|
||||||
ctx.rotate(this.rotation);
|
|
||||||
|
|
||||||
if (this.fire == 5) {
|
|
||||||
ctx.save();
|
|
||||||
ctx.rotate(this.turret);
|
|
||||||
// one frame of cannon fire
|
|
||||||
this.draw_cannon();
|
|
||||||
this.fire = 0;
|
|
||||||
ctx.restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.lineWidth = 2;
|
|
||||||
ctx.strokeStyle = craterStroke;
|
|
||||||
ctx.fillStyle = craterFill;
|
|
||||||
ctx.beginPath();
|
|
||||||
ctx.moveTo(12, 0);
|
|
||||||
for (i = 0; i < points; i += 1) {
|
|
||||||
ctx.rotate(angle);
|
|
||||||
ctx.lineTo(6, 0);
|
|
||||||
ctx.rotate(angle);
|
|
||||||
ctx.lineTo(12, 0);
|
|
||||||
}
|
|
||||||
ctx.closePath()
|
|
||||||
ctx.stroke();
|
|
||||||
ctx.fill();
|
|
||||||
|
|
||||||
ctx.restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.draw_sensors = function() {
|
|
||||||
if (this.dead) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ctx.save();
|
|
||||||
ctx.translate(this.x, this.y);
|
|
||||||
ctx.rotate(this.rotation);
|
|
||||||
|
|
||||||
ctx.lineWidth = 1;
|
|
||||||
for (i in this.sensors) {
|
|
||||||
var s = this.sensors[i];
|
|
||||||
var adj = this.turret * s[3];
|
|
||||||
|
|
||||||
if (this.sensor_state & (1 << i)) {
|
|
||||||
// Sensor is triggered
|
|
||||||
ctx.strokeStyle = "#000";
|
|
||||||
} else {
|
|
||||||
ctx.strokeStyle = sensorStroke;
|
|
||||||
}
|
|
||||||
ctx.beginPath();
|
|
||||||
ctx.moveTo(0, 0);
|
|
||||||
ctx.arc(0, 0, s[0], s[1] + adj, s[2] + adj, false);
|
|
||||||
ctx.closePath();
|
|
||||||
ctx.stroke();
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.draw_tank = function() {
|
|
||||||
if (this.dead) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ctx.save();
|
|
||||||
ctx.translate(this.x, this.y);
|
|
||||||
ctx.rotate(this.rotation);
|
|
||||||
|
|
||||||
ctx.fillStyle = color;
|
|
||||||
ctx.fillRect(-5, -4, 10, 8);
|
|
||||||
ctx.fillStyle = "#777";
|
|
||||||
ctx.fillRect(-7, -9, 15, 5);
|
|
||||||
ctx.fillRect(-7, 4, 15, 5);
|
|
||||||
ctx.rotate(this.turret);
|
|
||||||
if (this.fire) {
|
|
||||||
this.draw_cannon();
|
|
||||||
this.fire -= 1;
|
|
||||||
} else {
|
|
||||||
if (this.led) {
|
|
||||||
ctx.fillStyle = "#f00";
|
|
||||||
} else {
|
|
||||||
ctx.fillStyle = "#000";
|
|
||||||
}
|
|
||||||
ctx.fillRect(0, -1, 10, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.draw_cannon = function() {
|
|
||||||
ctx.fillStyle = ("rgba(255,255,64," + this.fire/5 + ")");
|
|
||||||
ctx.fillRect(0, -1, 45, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.draw_wrap_sensors = function() {
|
|
||||||
var orig_x = this.x;
|
|
||||||
var orig_y = this.y;
|
|
||||||
for (x = this.x - width; x < width + maxlen; x += width) {
|
|
||||||
for (y = this.y - height; y < height + maxlen; y += height) {
|
|
||||||
if ((-maxlen < x) && (x < width + maxlen) &&
|
|
||||||
(-maxlen < y) && (y < height + maxlen)) {
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
this.draw_sensors();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.x = orig_x;
|
|
||||||
this.y = orig_y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var loop_id;
|
|
||||||
var updateFunc = null;
|
|
||||||
function togglePlayback() {
|
|
||||||
if ($("#playing").prop("checked")) {
|
|
||||||
loop_id = setInterval(updateFunc, 66);
|
|
||||||
} else {
|
|
||||||
clearInterval(loop_id);
|
|
||||||
loop_id = null;
|
|
||||||
}
|
|
||||||
$("#pauselabel").toggleClass("ui-icon-play ui-icon-pause");
|
|
||||||
}
|
|
||||||
|
|
||||||
function start(id, game) {
|
|
||||||
var canvas = document.getElementById(id);
|
|
||||||
var ctx = canvas.getContext('2d');
|
|
||||||
|
|
||||||
canvas.width = game[0][0];
|
|
||||||
canvas.height = game[0][1];
|
|
||||||
// game[2] is tank descriptions
|
|
||||||
var turns = game[2];
|
|
||||||
|
|
||||||
// Set up tanks
|
|
||||||
var tanks = new Array();
|
|
||||||
for (i in game[1]) {
|
|
||||||
var desc = game[1][i];
|
|
||||||
tanks[i] = new Tank(ctx, game[0][0], game[0][1], desc[0], desc[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
var frame = 0;
|
|
||||||
var lastframe = 0;
|
|
||||||
var fps = document.getElementById('fps');
|
|
||||||
|
|
||||||
function update_fps() {
|
|
||||||
fps.innerHTML = (frame - lastframe);
|
|
||||||
lastframe = frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
function drawFrame(idx) {
|
|
||||||
canvas.width = canvas.width;
|
|
||||||
turn = turns[idx];
|
|
||||||
|
|
||||||
// Update and draw craters first
|
|
||||||
for (i in turn) {
|
|
||||||
t = turn[i];
|
|
||||||
if (!t) {
|
|
||||||
// old data, force-kill it
|
|
||||||
tanks[i].fire = 0;
|
|
||||||
tanks[i].dead = 5;
|
|
||||||
} else {
|
|
||||||
tanks[i].set_state(t[0], t[1], t[2], t[3], t[4], t[5]);
|
|
||||||
}
|
|
||||||
tanks[i].draw_crater();
|
|
||||||
}
|
|
||||||
// Then sensors
|
|
||||||
for (i in turn) {
|
|
||||||
tanks[i].draw_wrap_sensors();
|
|
||||||
}
|
|
||||||
// Then tanks
|
|
||||||
for (i in turn) {
|
|
||||||
tanks[i].draw_tank()
|
|
||||||
}
|
|
||||||
|
|
||||||
document.getElementById('frameid').innerHTML = idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
function update() {
|
|
||||||
var idx = frame % (turns.length + 20);
|
|
||||||
var turn;
|
|
||||||
|
|
||||||
frame += 1;
|
|
||||||
if (idx >= turns.length) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
drawFrame(idx);
|
|
||||||
|
|
||||||
$('#seekslider').slider('value', idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
function seekToFrame(newidx) {
|
|
||||||
var idx = frame % (turns.length + 20);
|
|
||||||
if (idx !== newidx) {
|
|
||||||
frame = newidx;
|
|
||||||
drawFrame(newidx);
|
|
||||||
}
|
|
||||||
// make sure we're paused
|
|
||||||
if ($("#playing").prop("checked")) {
|
|
||||||
$("#playing").prop("checked", false);
|
|
||||||
togglePlayback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
updateFunc = update;
|
|
||||||
loop_id = setInterval(update, 66);
|
|
||||||
//loop_id = setInterval(update, 400);
|
|
||||||
if (fps) {
|
|
||||||
setInterval(update_fps, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (id === "battlefield") {
|
|
||||||
$("#game_box").append('<p><input type="checkbox" checked id="playing" onclick="togglePlayback();"><label for="playing"><span class="ui-icon ui-icon-pause" id="pauselabel"></class></label> <span id="frameid">0</span> <span id="seekslider" style="width: 75%; float: right;"></span></p>');
|
|
||||||
$('#playing').button();
|
|
||||||
var slider = $('#seekslider');
|
|
||||||
slider.slider({ max: turns.length-1, slide: function(event, ui) { seekToFrame(ui.value); } });
|
|
||||||
|
|
||||||
var spacing = 100 / turns.length;
|
|
||||||
var deaths = [];
|
|
||||||
for (i in turns[0]) {
|
|
||||||
deaths.push(false);
|
|
||||||
}
|
|
||||||
var percent = 0;
|
|
||||||
for (var f = 0; f < turns.length; f++) {
|
|
||||||
var turn = turns[f];
|
|
||||||
if (percent < (spacing * f)) {
|
|
||||||
percent = spacing * f;
|
|
||||||
}
|
|
||||||
for (var i = 0; i < turn.length; i++) {
|
|
||||||
if (deaths[i]) { continue; }
|
|
||||||
if (!turn[i] || (turn[i][4] & 4)) {
|
|
||||||
deaths[i] = true;
|
|
||||||
// http://stackoverflow.com/questions/8648963/add-tick-marks-to-jquery-slider
|
|
||||||
$('<span class="ui-slider-tick-mark"></span>').css('left', percent + '%').css('background-color', game[1][i][0]).appendTo(slider);
|
|
||||||
percent++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,117 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en-US">
|
|
||||||
<head>
|
|
||||||
<meta charset='utf-8'>
|
|
||||||
<meta name="viewport" content="width=device-width">
|
|
||||||
<link rel="stylesheet" href="/assets/css/dirtbags.css?v=">
|
|
||||||
<link rel="icon" type="image/png" href="/assets/images/icon.png">
|
|
||||||
|
|
||||||
<script src="assets/js/tanks.js"></script>
|
|
||||||
|
|
||||||
<script src="assets/js/figures.js"></script>
|
|
||||||
|
|
||||||
<title> by </title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h1 id="title">History</h1>
|
|
||||||
|
|
||||||
<p>This is a port of the “Tanks” program written by Paul Ferrell
|
|
||||||
<a href="mailto:pflarr@clanspum.net">pflarr@clanspum.net</a> in 2009-2010. Paul created the entire game based
|
|
||||||
off a brief description I provided him of
|
|
||||||
<a href="http://tpoindex.github.io/crobots">Crobots</a>
|
|
||||||
and a vague desire to
|
|
||||||
“make something fun for high school kids to learn some programming.” We
|
|
||||||
ran Paul’s Tanks as part of a 100-attendee computer security contest in
|
|
||||||
February of 2010 and by all accounts it was a huge success. It even
|
|
||||||
made the nightly news.</p>
|
|
||||||
|
|
||||||
<p>Paul’s version was written in Python and provided a custom language
|
|
||||||
called “Bullet”, which looked like this:</p>
|
|
||||||
|
|
||||||
<div class="highlighter-rouge"><pre class="highlight"><code>>addsensor(50, 0, 5, 1); # 0
|
|
||||||
>addsensor(100, 90, 150, 1); # 1
|
|
||||||
>addsensor(100, 270, 150, 1); # 2
|
|
||||||
>addsensor(100, 0, 359, 0); # 3
|
|
||||||
|
|
||||||
# Default movement if nothing is detected
|
|
||||||
: move(70, 70) . turretccw();
|
|
||||||
random(2, 3): move(40, 70) . turretccw();
|
|
||||||
random(1, 3): move(70, 40) . turretccw();
|
|
||||||
|
|
||||||
# We found something!!
|
|
||||||
sense(3): move(0, 0);
|
|
||||||
sense(1): turretcw();
|
|
||||||
sense(2): turretccw();
|
|
||||||
sense(0): fire();
|
|
||||||
</code></pre>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<table class="figure">
|
|
||||||
<caption>"Chashtank" cleans up.</caption>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<canvas id="shortround"></canvas>
|
|
||||||
<script type="application/javascript">
|
|
||||||
start("shortround", shortround);
|
|
||||||
</script>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>Nick Moffitt played with this original version and convinced me (Neale)
|
|
||||||
that something like Forth would be a better language. I added some code
|
|
||||||
to accept a scaled-down version of PostScript. The IRC channel we
|
|
||||||
frequent collectively agreed to give this new language the derisive name
|
|
||||||
“Forf”, which should ideally be followed by punching someone after it is
|
|
||||||
spoken aloud. I wrote a Python implementation of Forf, which was slow,
|
|
||||||
and then Adam Glasgall wrote a C implementation, which was quick.</p>
|
|
||||||
|
|
||||||
<p>I decided to take Tanks to Def Con in July 2010, and just for bragging
|
|
||||||
rights, to have it run on an Asus WL-500gU. This is a $50 device with a
|
|
||||||
240 MHz MIPS CPU, 16MB RAM, and a 4MB flash disk, along with an
|
|
||||||
802.11b/g radio, 4-port 10/100 switch, and an additional 10/100 “uplink”
|
|
||||||
port; it’s sold as a home wireless router. I had originally intended to
|
|
||||||
run it off a lantern battery just for fun, but eventually thought better
|
|
||||||
of it: doing so would be wasteful for no good reason.</p>
|
|
||||||
|
|
||||||
<p>Aaron McPhall <a href="mailto:amcphall@mcphall.org">amcphall@mcphall.org</a>, my summer intern at the time, got
|
|
||||||
OpenWRT and Python onto the box and benchmarked it at about 60 seconds
|
|
||||||
for a 16-tank game, after he had profiled the code and optimized a lot
|
|
||||||
of the math. That wasn’t bad, it meant we could run a reasonably-sized
|
|
||||||
game at one turn per minute, which we knew from past experience was
|
|
||||||
about the right rate. But it required a USB thumb drive to hold Python,
|
|
||||||
and when we used the Python Forf implementation, the run-time shot up to
|
|
||||||
several minutes. I began this C port while Adam Glasgall, another fool
|
|
||||||
on the previously-mentioned IRC channel, started work on a C version of
|
|
||||||
a Forf interpreter.</p>
|
|
||||||
|
|
||||||
<p>This C version with Forf runs about 6 times faster than the Python
|
|
||||||
version with Bullet, on the WL-500gU. A 1GHz Intel Atom runs a 16-tank
|
|
||||||
game in about 0.2 seconds.</p>
|
|
||||||
|
|
||||||
<h2 id="whats-so-great-about-forf">What’s so great about Forf?</h2>
|
|
||||||
|
|
||||||
<p>Nothing’s great about Forf. It’s a crummy language that only does
|
|
||||||
integer math. For this application it’s a good choice, for the
|
|
||||||
following reasons:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>No library dependencies, not even malloc</li>
|
|
||||||
<li>Runs in fixed size memory</li>
|
|
||||||
<li>Not Turing-complete, I think (impossible to make endless loops)</li>
|
|
||||||
<li>Lends itself to genetic algorithms</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
|
|
||||||
<nav>
|
|
||||||
<ul>
|
|
||||||
<li><a href="/">Home</a></li>
|
|
||||||
<li><a href="/running">Running</a></li>
|
|
||||||
<li><a href="/history">History</a></li>
|
|
||||||
<li><a href="/thanks">Thanks</a></li>
|
|
||||||
<li><a href="https://github.com/dirtbags/tanks" title="Tanks on Github">Source</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,70 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en-US">
|
|
||||||
<head>
|
|
||||||
<meta charset='utf-8'>
|
|
||||||
<meta name="viewport" content="width=device-width">
|
|
||||||
<link rel="stylesheet" href="/assets/css/dirtbags.css?v=">
|
|
||||||
<link rel="icon" type="image/png" href="/assets/images/icon.png">
|
|
||||||
|
|
||||||
<script src="assets/js/tanks.js"></script>
|
|
||||||
|
|
||||||
<script src="assets/js/figures.js"></script>
|
|
||||||
|
|
||||||
<title> by </title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h1 id="title">Tanks</h1>
|
|
||||||
|
|
||||||
<table class="figure">
|
|
||||||
<caption>"Ant Lion" nails "Rabbit With Gun".</caption>
|
|
||||||
<tr><td>
|
|
||||||
<canvas id="antlion"></canvas>
|
|
||||||
<script type="application/javascript">
|
|
||||||
start("antlion", antlion);
|
|
||||||
</script>
|
|
||||||
</td></tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>Dirtbags Tanks is a game in which you pit your coding abilities
|
|
||||||
against other hackers. You write a program for your tank, set it out
|
|
||||||
on the battlefield, and watch how your program fares against tanks
|
|
||||||
written by other players. Dirtbags Tanks is frequently a component of
|
|
||||||
<a href="/ctf/">Dirtbags Capture The Flag</a>.</p>
|
|
||||||
|
|
||||||
<p>Each tank has a turret-mounted laser, two treads, up to ten sensors,
|
|
||||||
and a diagnostic LED. Sensors are used to detect when other tanks are
|
|
||||||
inside a given arc. In the examples on this page, “triggered” sensors
|
|
||||||
turn black. Most tanks will take some action if a sensor is
|
|
||||||
triggered, such as changing speed of the treads, turning the turret,
|
|
||||||
or firing.</p>
|
|
||||||
|
|
||||||
<p>Tanks are programmed in Forf, a stack-based language similar to
|
|
||||||
PostScript.</p>
|
|
||||||
|
|
||||||
<h2 id="other-versions">Other Versions</h2>
|
|
||||||
|
|
||||||
<p>Everybody loves tanks!
|
|
||||||
If you’ve made a port or done something fun with it,
|
|
||||||
please let me know and I’ll link it here!</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://github.com/Arctem/nmt_python_labs/tree/master/labs/project">Class Lab</a> at New Mexico Tech, by Russell White</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2 id="author">Author</h2>
|
|
||||||
|
|
||||||
<p>Neale Pickett <a href="mailto:neale@woozle.org">neale@woozle.org</a></p>
|
|
||||||
|
|
||||||
|
|
||||||
<nav>
|
|
||||||
<ul>
|
|
||||||
<li><a href="/">Home</a></li>
|
|
||||||
<li><a href="/running">Running</a></li>
|
|
||||||
<li><a href="/history">History</a></li>
|
|
||||||
<li><a href="/thanks">Thanks</a></li>
|
|
||||||
<li><a href="https://github.com/dirtbags/tanks" title="Tanks on Github">Source</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,89 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en-US">
|
|
||||||
<head>
|
|
||||||
<meta charset='utf-8'>
|
|
||||||
<meta name="viewport" content="width=device-width">
|
|
||||||
<link rel="stylesheet" href="/assets/css/dirtbags.css?v=">
|
|
||||||
<link rel="icon" type="image/png" href="/assets/images/icon.png">
|
|
||||||
|
|
||||||
<title> by </title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h1 id="title">Running Tanks</h1>
|
|
||||||
|
|
||||||
<p>Unfortunately, it’s kind of a mess right now.
|
|
||||||
I know there are a few forks of this code,
|
|
||||||
and I would love it if someone proposed a merge to clearly illustrate how to run tanks.</p>
|
|
||||||
|
|
||||||
<p>When I spin up a new tanks game,
|
|
||||||
typically I run something like:</p>
|
|
||||||
|
|
||||||
<div class="highlighter-rouge"><pre class="highlight"><code>while sleep 60; do ./round.sh */; done
|
|
||||||
</code></pre>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<p>This assumes all your tanks directories are in the same place as <code class="highlighter-rouge">round.sh</code>.</p>
|
|
||||||
|
|
||||||
<h2 id="included-programs">Included programs</h2>
|
|
||||||
|
|
||||||
<p>I tried to stick with the Unix philosophy of one program per task. I
|
|
||||||
also tried to avoid doing any string processing in C. The result is a
|
|
||||||
hodgepodge of C, Bourne shell, and awk, but at least each piece is
|
|
||||||
fairly simple to audit.</p>
|
|
||||||
|
|
||||||
<h3 id="roundsh-tank1-tank2-">round.sh tank1 tank2 …</h3>
|
|
||||||
|
|
||||||
<p>Runs a single round, awards points with rank.awk, and creates a new
|
|
||||||
summary.html with summary.awk. This is the main interface that you want
|
|
||||||
to run from cron or whatever.</p>
|
|
||||||
|
|
||||||
<h3 id="forftanks-tank1-tank2-">forftanks tank1 tank2 …</h3>
|
|
||||||
|
|
||||||
<p>A program to run a round of tanks and output a JSON description of the
|
|
||||||
game. This is what tanks.js uses to render a game graphically.
|
|
||||||
The object printed contains:</p>
|
|
||||||
|
|
||||||
<div class="highlighter-rouge"><pre class="highlight"><code>[[game-width, game-height],
|
|
||||||
[[tank1-color,
|
|
||||||
[[sensor1range, sensor1angle, sensor1width, sensor1turret],
|
|
||||||
...]],
|
|
||||||
...],
|
|
||||||
[[
|
|
||||||
[tank1x, tank1y, tank1angle, tank1sensangle,
|
|
||||||
tank1flags, tank1sensors],
|
|
||||||
...],
|
|
||||||
...]]
|
|
||||||
</code></pre>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<p>If file descriptor 3 is open for writes, it also outputs the results of
|
|
||||||
the round to fd3.</p>
|
|
||||||
|
|
||||||
<h3 id="rankawk">rank.awk</h3>
|
|
||||||
|
|
||||||
<p>Processes the fd3 output of forftanks to award points and output an
|
|
||||||
HTML results table.</p>
|
|
||||||
|
|
||||||
<h3 id="summaryawk-tank1-tank2">summary.awk tank1 tank2</h3>
|
|
||||||
|
|
||||||
<p>Creates summary.html, linking to all rounds and showing overall
|
|
||||||
standing.</p>
|
|
||||||
|
|
||||||
<h3 id="designercgi">designer.cgi</h3>
|
|
||||||
|
|
||||||
<p>Accepts form input and writes a tank.</p>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<nav>
|
|
||||||
<ul>
|
|
||||||
<li><a href="/">Home</a></li>
|
|
||||||
<li><a href="/running">Running</a></li>
|
|
||||||
<li><a href="/history">History</a></li>
|
|
||||||
<li><a href="/thanks">Thanks</a></li>
|
|
||||||
<li><a href="https://github.com/dirtbags/tanks" title="Tanks on Github">Source</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,260 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="765"
|
|
||||||
height="990"
|
|
||||||
id="svg2"
|
|
||||||
sodipodi:version="0.32"
|
|
||||||
inkscape:version="0.46"
|
|
||||||
version="1.0"
|
|
||||||
sodipodi:docname="standie.svg"
|
|
||||||
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
|
||||||
<defs
|
|
||||||
id="defs4">
|
|
||||||
<inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 526.18109 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
|
||||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
|
||||||
id="perspective10" />
|
|
||||||
<inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 526.18109 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
|
||||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
|
||||||
id="perspective2447" />
|
|
||||||
<inkscape:perspective
|
|
||||||
id="perspective2547"
|
|
||||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
|
||||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_x="0 : 526.18109 : 1"
|
|
||||||
sodipodi:type="inkscape:persp3d" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
gridtolerance="10000"
|
|
||||||
guidetolerance="10"
|
|
||||||
objecttolerance="10"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="0.66"
|
|
||||||
inkscape:cx="545.71983"
|
|
||||||
inkscape:cy="606.66523"
|
|
||||||
inkscape:document-units="in"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="true"
|
|
||||||
units="in"
|
|
||||||
inkscape:window-width="1276"
|
|
||||||
inkscape:window-height="1006"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="14"
|
|
||||||
inkscape:snap-global="false"
|
|
||||||
borderlayer="false" />
|
|
||||||
<metadata
|
|
||||||
id="metadata7">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1">
|
|
||||||
<g
|
|
||||||
id="layer4"
|
|
||||||
inkscape:label="dirtbags"
|
|
||||||
style="display:none"
|
|
||||||
transform="translate(-308.19052,44.944851)">
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-size:48px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L Bold Condensed"
|
|
||||||
x="527.22546"
|
|
||||||
y="731.11957"
|
|
||||||
id="text3300"
|
|
||||||
sodipodi:linespacing="125%"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan3302"
|
|
||||||
x="527.22546"
|
|
||||||
y="731.11957">dirtbags</tspan></text>
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="layer2"
|
|
||||||
inkscape:label="dirtbags.net"
|
|
||||||
style="display:none"
|
|
||||||
transform="translate(-308.19052,44.944851)">
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L Bold Condensed"
|
|
||||||
x="502.14645"
|
|
||||||
y="731.11957"
|
|
||||||
id="text3308"
|
|
||||||
sodipodi:linespacing="125%"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan3310"
|
|
||||||
x="502.14645"
|
|
||||||
y="731.11957">dirtbags.net</tspan></text>
|
|
||||||
</g>
|
|
||||||
<text
|
|
||||||
sodipodi:linespacing="125%"
|
|
||||||
id="text3272"
|
|
||||||
y="894.32263"
|
|
||||||
x="-229.31424"
|
|
||||||
style="font-size:85.50655365px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L Bold Condensed"
|
|
||||||
xml:space="preserve"><tspan
|
|
||||||
y="894.32263"
|
|
||||||
x="-229.31424"
|
|
||||||
id="tspan3274"
|
|
||||||
sodipodi:role="line" /></text>
|
|
||||||
<g
|
|
||||||
id="g2483"
|
|
||||||
transform="matrix(0,-0.9774231,0.9774231,0,5.9709151,978.27037)">
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.5999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="M 175.19167,183.03312 C 99.732022,183.03312 46.463603,265.66131 52.800357,320.35092 C 56.865847,355.43825 78.008194,360.81414 108.70365,417.08914 C 127.30007,451.18262 141.94307,497.65872 117.64249,511.72748 C 93.341942,525.79621 17.896271,564.16873 17.896269,564.16873 L 17.896269,750.91978 L 392.6186,750.91978 C 392.6186,750.91978 396.45354,739.40818 393.89557,715.10762 C 424.77669,716.7579 446.85739,717.6412 479.59505,712.52528 C 525.15994,694.07825 549.93255,679.66041 579.36966,665.22032 C 586.02066,657.5848 597.25139,603.81939 594.6934,580.79784 C 592.17395,558.1228 589.67671,519.32181 578.60346,487.60674 C 578.60523,486.65238 578.5653,485.68637 578.48995,484.71226 C 583.03605,468.05828 584.61872,460.10456 589.58549,443.96246 C 594.70139,427.33576 572.97676,427.32494 578.09266,414.53519 C 583.20858,401.74542 587.02555,410.70345 590.86247,374.89208 C 594.69938,339.08072 580.35658,335.54421 571.67941,322.45083 C 574.54639,311.52442 575.86661,304.97431 559.88904,292.04414 C 552.92295,286.40669 548.09722,283.23692 539.28179,282.73132 C 530.46634,282.22572 518.44848,282.02247 501.82178,280.74349 C 501.9203,280.60593 501.34649,295.16383 501.62962,295.38537 C 501.1379,295.38537 487.00022,274.21015 478.1259,282.12587 C 469.65353,289.68309 487.57316,316.17003 487.57314,315.57621 C 488.13876,315.72398 469.66967,313.89615 468.07386,322.45083 C 466.51084,330.82968 480.49172,333.77589 480.29557,333.97202 C 480.09941,333.38092 467.36345,331.92166 467.8047,342.01817 C 468.28027,352.90038 486.49802,353.60792 486.49804,353.94234 C 477.80286,375.68026 447.51329,446.91776 427.1538,495.09836 C 433.54868,509.16711 491.11623,514.3098 491.11623,514.3098 C 491.11623,514.3098 497.22176,550.95675 482.14901,565.44571 C 461.68536,568.61206 387.11856,559.84576 337.62337,534.76983 C 295.41712,525.81701 274.43981,533.20189 250.64693,528.35656 C 253.43342,502.78719 254.50625,488.71347 254.50625,488.71347 C 254.50625,488.71347 287.76445,483.59435 287.76445,436.27222 C 287.76445,388.95005 308.06176,384.92301 303.08819,359.53996 C 299.0538,338.95007 291.52311,325.95944 307.88395,308.0919 C 320.28738,288.85396 322.27084,259.76896 304.36519,239.30532 C 279.3244,210.68728 250.65133,183.03312 175.19167,183.03312 z M 508.59665,289.73179 C 508.36976,289.94299 516.73247,290.58463 526.13383,291.20742 C 527.15504,298.08777 538.00646,307.78883 544.52232,313.05793 C 543.96514,314.31291 543.39235,315.51947 542.81967,316.7186 L 509.36363,316.1227 C 509.53671,315.72022 508.17637,290.23076 508.59665,289.73179 z M 494.19558,356.2409 C 497.51201,357.87917 503.76241,358.7111 508.5399,359.994 C 502.33706,361.58094 496.89765,361.52792 496.25252,366.66347 C 495.34942,373.85254 510.37662,378.54561 523.65042,382.39909 C 520.09348,383.65623 513.58741,386.65836 513.3008,390.16719 C 512.41608,400.99858 534.84172,405.61532 554.77383,409.55616 C 557.35604,425.88768 560.88468,447.29929 563.79052,464.11035 C 512.71042,459.63287 481.41158,456.69828 449.60023,464.99004 C 463.08015,433.05142 479.50059,390.97818 494.19558,356.2409 z"
|
|
||||||
id="path3227"
|
|
||||||
sodipodi:nodetypes="csssccccccsccssscsscczczczcccccccsscscccccccccscscccc" />
|
|
||||||
<g
|
|
||||||
transform="matrix(2.1376639,0,0,2.1376639,-775.68918,-222.16264)"
|
|
||||||
style="display:inline"
|
|
||||||
inkscape:label="dirtbags rot"
|
|
||||||
id="layer3">
|
|
||||||
<text
|
|
||||||
transform="matrix(0.387016,-0.922073,0.922073,0.387016,0,0)"
|
|
||||||
sodipodi:linespacing="125%"
|
|
||||||
id="text3166"
|
|
||||||
y="615.24457"
|
|
||||||
x="-90.885483"
|
|
||||||
style="font-size:34.41987228px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L Bold Condensed"
|
|
||||||
xml:space="preserve"><tspan
|
|
||||||
y="615.24457"
|
|
||||||
x="-90.885483"
|
|
||||||
id="tspan3168"
|
|
||||||
sodipodi:role="line">dirtbags</tspan></text>
|
|
||||||
</g>
|
|
||||||
<rect
|
|
||||||
transform="matrix(-0.7070466,-0.707167,0.707167,-0.7070466,0,0)"
|
|
||||||
y="373.30301"
|
|
||||||
x="-700.88867"
|
|
||||||
height="95.298477"
|
|
||||||
width="6.1200857"
|
|
||||||
id="rect3375"
|
|
||||||
style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ba2b2b;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
|
||||||
<path
|
|
||||||
transform="matrix(-0.8460474,-0.2204554,0.2204554,-0.8460474,1056.4658,666.60214)"
|
|
||||||
sodipodi:end="3.144758"
|
|
||||||
sodipodi:start="0"
|
|
||||||
d="M 522,526 A 140,140 0 1 1 242.0007,525.55685 L 382,526 z"
|
|
||||||
sodipodi:ry="140"
|
|
||||||
sodipodi:rx="140"
|
|
||||||
sodipodi:cy="526"
|
|
||||||
sodipodi:cx="382"
|
|
||||||
id="path2593"
|
|
||||||
style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2bb6ba;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
sodipodi:type="arc" />
|
|
||||||
<path
|
|
||||||
transform="matrix(-0.8460474,-0.2204554,0.2204554,-0.8460474,1056.4658,666.60214)"
|
|
||||||
sodipodi:type="arc"
|
|
||||||
style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2bb6ba;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
id="path2595"
|
|
||||||
sodipodi:cx="382"
|
|
||||||
sodipodi:cy="526"
|
|
||||||
sodipodi:rx="149"
|
|
||||||
sodipodi:ry="149"
|
|
||||||
d="M 414.70023,380.63255 A 149,149 0 0 1 492.14396,425.65406 L 382,526 z"
|
|
||||||
sodipodi:start="4.9336547"
|
|
||||||
sodipodi:end="5.5443022" />
|
|
||||||
<path
|
|
||||||
transform="matrix(-0.8460474,-0.2204554,0.2204554,-0.8460474,1056.4658,666.60214)"
|
|
||||||
sodipodi:end="4.9362896"
|
|
||||||
sodipodi:start="4.1338205"
|
|
||||||
d="M 248.57447,321.7119 A 244,244 0 0 1 436.17643,288.09053 L 382,526 z"
|
|
||||||
sodipodi:ry="244"
|
|
||||||
sodipodi:rx="244"
|
|
||||||
sodipodi:cy="526"
|
|
||||||
sodipodi:cx="382"
|
|
||||||
id="path2597"
|
|
||||||
style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2bb6ba;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
sodipodi:type="arc" />
|
|
||||||
<path
|
|
||||||
transform="matrix(-0.8460474,-0.2204554,0.2204554,-0.8460474,1056.4658,666.60214)"
|
|
||||||
sodipodi:type="arc"
|
|
||||||
style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2bb6ba;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
id="path2599"
|
|
||||||
sodipodi:cx="382"
|
|
||||||
sodipodi:cy="526"
|
|
||||||
sodipodi:rx="244"
|
|
||||||
sodipodi:ry="244"
|
|
||||||
d="M 562.30536,361.60421 A 244,244 0 0 1 625.94232,520.69476 L 382,526 z"
|
|
||||||
sodipodi:start="5.5439091"
|
|
||||||
sodipodi:end="6.2614408" />
|
|
||||||
<rect
|
|
||||||
transform="matrix(-0.9676424,-0.2523255,0.2523255,-0.9676424,0,0)"
|
|
||||||
y="57.387951"
|
|
||||||
x="-879.38464"
|
|
||||||
height="55.677361"
|
|
||||||
width="44.228729"
|
|
||||||
id="rect2383"
|
|
||||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#2bb6ba;stroke-width:0.96922117px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
|
||||||
<rect
|
|
||||||
transform="matrix(-0.9676424,-0.2523255,0.2523255,-0.9676424,0,0)"
|
|
||||||
y="40.170197"
|
|
||||||
x="-835.15601"
|
|
||||||
height="84.308083"
|
|
||||||
width="27.064905"
|
|
||||||
id="rect2385"
|
|
||||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.96357071px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
|
||||||
<rect
|
|
||||||
transform="matrix(-0.9676424,-0.2523255,0.2523255,-0.9676424,0,0)"
|
|
||||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.96357071px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
id="rect2387"
|
|
||||||
width="27.064905"
|
|
||||||
height="84.308083"
|
|
||||||
x="-906.44958"
|
|
||||||
y="40.170197" />
|
|
||||||
<rect
|
|
||||||
inkscape:transform-center-y="-20.587678"
|
|
||||||
inkscape:transform-center-x="-11.779977"
|
|
||||||
transform="matrix(-0.7129456,-0.7012194,0.7012194,-0.7129456,0,0)"
|
|
||||||
y="446.83466"
|
|
||||||
x="-708.03717"
|
|
||||||
height="57.243172"
|
|
||||||
width="11.448635"
|
|
||||||
id="rect3159"
|
|
||||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
|
||||||
<path
|
|
||||||
transform="matrix(-0.8068409,-0.3367557,0.3367557,-0.8068409,964.03209,766.69774)"
|
|
||||||
d="M 475,391 L 480.97412,428.65667 L 518.98424,425.66578 L 493.26788,453.81509 L 519.30517,481.66781 L 481.26326,479.11275 L 475.72111,516.83541 L 454,485.5 L 421.05176,504.68667 L 432.00788,468.16711 L 396.46425,454.36983 L 431.84742,440.1661 L 420.47347,403.7745 L 453.63944,422.58229 L 475,391 z"
|
|
||||||
inkscape:randomized="0"
|
|
||||||
inkscape:rounded="0"
|
|
||||||
inkscape:flatsided="false"
|
|
||||||
sodipodi:arg2="-0.90332843"
|
|
||||||
sodipodi:arg1="-1.3521274"
|
|
||||||
sodipodi:r2="32.268406"
|
|
||||||
sodipodi:r1="64.536812"
|
|
||||||
sodipodi:cy="454"
|
|
||||||
sodipodi:cx="461"
|
|
||||||
sodipodi:sides="7"
|
|
||||||
id="path2591"
|
|
||||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#494b0e;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
sodipodi:type="star" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 14 KiB |
|
@ -1,37 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en-US">
|
|
||||||
<head>
|
|
||||||
<meta charset='utf-8'>
|
|
||||||
<meta name="viewport" content="width=device-width">
|
|
||||||
<link rel="stylesheet" href="/assets/css/dirtbags.css?v=">
|
|
||||||
<link rel="icon" type="image/png" href="/assets/images/icon.png">
|
|
||||||
|
|
||||||
<title> by </title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h1 id="title">thanks</h1>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Tom Poindexter: Inspiration (Author of CRobots)</li>
|
|
||||||
<li>Paul Ferrell: Initial implementation</li>
|
|
||||||
<li>Aaron McPhall: Math optimizations</li>
|
|
||||||
<li>Nick Moffitt: Suggestion to use FORTH-like language</li>
|
|
||||||
<li>Anna Glasgall: C Forf prototype</li>
|
|
||||||
<li>Adam Thomas: Various patches</li>
|
|
||||||
<li>Various Australians: Creation of some mind-blowing tanks</li>
|
|
||||||
<li>Alyssa Milburn: JS Tanks, Tank Debugger, many more other helpful contributions</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
|
|
||||||
<nav>
|
|
||||||
<ul>
|
|
||||||
<li><a href="/">Home</a></li>
|
|
||||||
<li><a href="/running">Running</a></li>
|
|
||||||
<li><a href="/history">History</a></li>
|
|
||||||
<li><a href="/thanks">Thanks</a></li>
|
|
||||||
<li><a href="https://github.com/dirtbags/tanks" title="Tanks on Github">Source</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
1897
docs/_site/token.svg
1897
docs/_site/token.svg
File diff suppressed because it is too large
Load Diff
Before Width: | Height: | Size: 118 KiB |
|
@ -1,151 +0,0 @@
|
||||||
/**** document ****/
|
|
||||||
|
|
||||||
html {
|
|
||||||
background: #eed url(/assets/images/grunge.png) repeat-x;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: sans-serif;
|
|
||||||
color: #112;
|
|
||||||
padding: 10px;
|
|
||||||
max-width: 700px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**** heading ****/
|
|
||||||
|
|
||||||
#title {
|
|
||||||
text-transform: lowercase;
|
|
||||||
font-size: 1.6em;
|
|
||||||
padding: 3px;
|
|
||||||
margin: 0 0 1em 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#title:before {
|
|
||||||
color: #999;
|
|
||||||
letter-spacing: -0.1em;
|
|
||||||
content: "Dirtbags: ";
|
|
||||||
}
|
|
||||||
|
|
||||||
/*** left side bar ***/
|
|
||||||
|
|
||||||
nav h2 {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav ul {
|
|
||||||
list-style: none;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav li {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav li a {
|
|
||||||
text-transform: lowercase;
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav li + li:before {
|
|
||||||
content: " | ";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**** body ****/
|
|
||||||
|
|
||||||
a img {
|
|
||||||
border: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: #2a4;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
color: #ddc;
|
|
||||||
background: #2a4;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
h1, h2, h3 {
|
|
||||||
color: #464;
|
|
||||||
letter-spacing: -0.05em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.readme {
|
|
||||||
background-color: #ccc;
|
|
||||||
margin: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre {
|
|
||||||
background-color: #ccc;
|
|
||||||
border: solid #888 2px;
|
|
||||||
padding: 0.25em;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
th {
|
|
||||||
vertical-align: top;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
vertical-align: top;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
line-height: 1.4em;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr {
|
|
||||||
border: 1px solid #444;
|
|
||||||
}
|
|
||||||
|
|
||||||
dt {
|
|
||||||
white-space: pre;
|
|
||||||
background-color: #333;
|
|
||||||
padding: 5px;
|
|
||||||
border: 2px solid green;
|
|
||||||
border-bottom: none;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
dd {
|
|
||||||
border: 2px solid green;
|
|
||||||
margin: 0px;
|
|
||||||
padding: 5px;
|
|
||||||
background-color: #282828;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**** special cases ****/
|
|
||||||
|
|
||||||
.wide {
|
|
||||||
max-width: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.figure {
|
|
||||||
margin: 0.5em 1em;
|
|
||||||
float: right;
|
|
||||||
font-size: small;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scoreboard {
|
|
||||||
background: #222;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scoreboard td {
|
|
||||||
height: 400px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#battlefield {
|
|
||||||
border: 2px solid green;
|
|
||||||
}
|
|
||||||
|
|
||||||
.solved {
|
|
||||||
text-decoration: line-through;
|
|
||||||
}
|
|
Binary file not shown.
Before Width: | Height: | Size: 6.6 KiB |
|
@ -1,5 +0,0 @@
|
||||||
default_ = [[300, 150, 50],[["#a08080",[[50, 0.00, 0.14, 1],[30, 0.00, 0.87, 0],[50, 0.00, 0.17, 0],[100, 5.50, 1.75, 1],[100, 0.79, 1.75, 1],[60, 3.14, 3.14, 0],]], ["#808080",[[50, 0.00, 0.12, 1],[30, 0.00, 1.57, 0],]],],[[[75,75,3.86,0.96,2,0], [225,75,4.26,0.49,0,0],], [[73,73,3.86,0.65,2,0], [223,72,4.26,0.68,0,0],], [[69,70,3.86,0.33,2,0], [222,70,4.24,0.87,0,0],], [[65,66,3.86,0.02,2,0], [221,67,4.23,1.06,0,0],], [[61,62,3.86,-0.00,2,0], [220,65,4.22,1.27,0,0],], [[56,59,3.86,0.00,2,0], [218,63,4.20,1.48,0,0],], [[52,55,3.86,-0.00,2,0], [217,60,4.19,1.68,0,0],], [[48,51,3.86,-0.00,2,0], [215,58,4.18,1.88,0,0],], [[44,48,3.86,0.00,2,0], [214,55,4.16,2.09,0,0],], [[39,44,3.86,-0.00,2,0], [213,53,4.15,2.30,0,0],], [[35,41,3.77,0.00,2,0], [211,51,4.13,2.51,0,0],], [[31,38,3.68,-0.00,2,0], [209,48,4.12,2.72,0,0],], [[26,36,3.60,-0.00,2,0], [208,46,4.11,2.93,0,0],], [[21,34,3.51,0.00,2,0], [206,44,4.09,3.14,0,0],], [[16,33,3.43,-0.00,2,0], [205,42,4.08,3.35,0,0],], [[11,32,3.34,-0.00,2,0], [203,39,4.06,3.56,0,0],], [[6,31,3.25,0.00,2,8], [201,37,4.05,3.77,0,0],], [[2,31,3.11,-0.31,2,16], [200,35,4.04,3.98,0,0],], [[299,31,3.25,0.00,2,24], [198,33,4.02,4.19,0,0],], [[293,29,3.39,-0.00,2,8], [196,31,4.01,4.40,0,0],], [[289,28,3.39,-0.31,2,24], [194,29,4.00,4.59,0,0],], [[283,27,3.39,-0.31,2,24], [192,27,3.98,4.80,0,0],], [[276,25,3.39,-0.31,2,24], [190,25,3.97,4.99,0,0],], [[269,23,3.39,-0.30,2,24], [189,23,3.95,5.18,0,0],], [[262,21,3.39,-0.28,2,24], [187,21,3.94,5.39,0,0],], [[255,20,3.39,-0.26,2,24], [185,19,3.93,5.59,0,0],], [[249,18,3.39,-0.24,2,24], [183,17,3.91,5.78,0,0],], [[242,16,3.39,-0.23,2,24], [181,15,3.90,5.99,0,0],], [[235,14,3.39,-0.21,3,25], 0,],]];
|
|
||||||
|
|
||||||
antlion = [[300, 150, 50],[["#808080",[[50, 0.00, 0.00, 1],[70, 0.00, 0.87, 0],]], ["#ff8844",[[50, 0.00, 0.09, 1],[100, 4.68, 3.09, 1],[100, 1.61, 3.11, 1],[60, 0.00, 2.09, 0],[60, 2.09, 2.09, 0],[60, 4.19, 2.09, 0],[100, 0.00, 0.09, 1],]],],[[[75,75,5.78,2.71,0,0], [225,75,3.28,1.95,0,0],], [[77,73,5.78,3.02,0,0], [225,75,3.28,2.06,0,0],], [[81,71,5.78,3.14,0,0], [225,75,3.28,2.16,0,0],], [[87,68,5.78,3.14,0,0], [225,75,3.28,2.25,0,0],], [[93,64,5.78,3.14,0,0], [225,75,3.28,2.34,0,0],], [[99,61,5.78,3.14,0,0], [225,75,3.28,2.44,0,0],], [[105,57,5.78,3.14,0,0], [225,75,3.28,2.53,0,0],], [[112,54,5.78,3.14,0,0], [225,75,3.28,2.62,0,0],], [[118,51,5.78,3.14,0,0], [225,75,3.28,2.71,0,0],], [[124,47,5.78,3.14,0,0], [225,75,3.28,2.79,0,2],], [[130,44,5.78,3.14,0,0], [225,75,3.28,2.48,0,2],], [[136,40,5.78,3.14,0,0], [225,75,3.28,2.16,0,2],], [[142,37,5.78,3.14,0,0], [225,75,3.28,1.85,0,2],], [[148,34,5.78,3.14,0,0], [225,75,3.28,1.54,0,2],], [[154,30,5.78,3.14,0,0], [225,75,3.28,1.22,0,2],], [[160,28,5.90,3.14,0,0], [225,75,3.28,0.91,0,2],], [[167,25,5.90,3.14,0,0], [225,75,3.28,0.59,0,70],], [[173,23,5.90,3.14,0,0], [225,75,3.28,0.28,0,4],], [[180,20,5.90,3.14,0,0], [225,75,3.28,0.59,0,68],], [[186,17,5.90,3.14,0,0], [225,75,3.28,0.28,0,4],], [[193,15,5.90,3.14,0,0], [225,75,3.28,0.59,0,4],], [[199,12,5.90,3.14,0,0], [225,75,3.28,0.91,0,92],], [[206,10,5.90,3.14,0,0], [222,74,3.24,0.59,0,20],], [[212,7,5.90,3.14,0,0], [218,74,3.15,0.91,0,20],], [[218,4,5.78,3.14,0,0], [212,75,2.96,1.22,0,4],], [[224,1,5.78,3.14,0,0], [208,77,2.77,1.54,0,2],], [[230,147,5.78,3.14,0,0], [207,78,2.65,1.22,0,2],], [[236,144,5.78,3.14,0,0], [207,78,2.65,0.91,0,2],], [[242,140,5.78,3.14,0,0], [207,78,2.65,0.59,0,2],], [[248,137,5.78,3.14,0,0], [207,78,2.65,0.28,0,2],], [[254,134,5.78,3.14,0,0], [207,78,2.65,-0.03,0,2],], [[260,130,5.78,3.14,0,0], [207,78,2.65,-0.35,0,2],], [[267,127,5.78,3.14,0,0], [207,78,2.65,-0.66,0,2],], [[273,123,5.78,3.14,0,0], [207,78,2.65,-0.98,0,2],], [[279,120,5.78,3.14,0,0], [207,78,2.65,-1.29,0,2],], [[285,117,5.78,3.14,0,0], [207,78,2.65,-1.61,0,2],], [[291,113,5.78,3.14,0,0], [207,78,2.65,-1.92,0,2],], [[297,110,5.78,3.14,0,0], [207,78,2.65,-2.23,0,66],], [[3,106,5.78,3.14,0,0], [207,78,2.65,-1.92,0,2],], [[9,103,5.78,3.14,0,0], [207,78,2.65,-2.23,0,2],], [[16,100,5.78,3.14,0,0], [207,78,2.65,-2.55,0,0],], [[22,96,5.78,3.14,0,0], [207,78,2.65,-2.44,0,0],], [[28,93,5.78,3.14,0,0], [207,78,2.65,-2.32,0,0],], [[34,90,5.78,3.14,0,0], [207,78,2.65,-2.20,0,0],], [[40,86,5.78,3.14,0,0], [207,78,2.65,-2.08,0,0],], [[46,84,5.90,3.14,0,0], [207,78,2.65,-1.95,0,0],], [[52,81,5.90,3.14,0,0], [207,78,2.65,-1.85,0,0],], [[59,79,5.90,3.14,0,0], [207,78,2.65,-1.75,0,0],], [[65,76,5.90,3.14,0,0], [207,78,2.65,-1.64,0,0],], [[72,73,5.90,3.14,0,0], [207,78,2.65,-1.54,0,0],], [[78,71,5.90,3.14,0,0], [207,78,2.65,-1.43,0,0],], [[85,68,5.90,3.14,0,0], [207,78,2.65,-1.33,0,0],], [[91,66,5.90,3.14,0,0], [207,78,2.65,-1.20,0,0],], [[98,63,5.90,3.14,0,0], [207,78,2.65,-1.08,0,0],], [[104,60,5.90,3.14,0,0], [207,78,2.65,-0.96,0,4],], [[111,58,5.90,3.14,0,0], [207,78,2.65,-0.65,0,4],], [[117,56,6.03,3.14,0,0], [207,78,2.65,-0.33,0,4],], [[124,54,6.03,3.14,0,0], [207,78,2.65,-0.02,0,4],], [[130,53,6.03,3.14,0,0], [207,78,2.65,0.30,0,4],], [[137,51,6.03,3.14,0,0], [207,78,2.65,0.61,0,4],], [[144,49,6.03,3.14,0,0], [207,78,2.65,0.93,0,70],], [[151,47,6.03,3.14,0,0], [207,78,2.65,0.61,0,28],], [[157,45,6.03,3.14,0,0], [205,79,2.65,0.93,0,28],], [0, [201,81,2.56,1.24,1,85],],]];
|
|
||||||
|
|
||||||
shortround = [[300, 300, 50],[["#80f0c0",[[50, 0.00, 0.17, 1],[35, 0.00, 1.57, 0],[100, 0.52, 1.03, 0],[100, 5.76, 1.03, 0],[70, 3.14, 3.14, 0],[100, 1.57, 1.03, 0],[100, 4.71, 1.03, 0],[100, 0.00, 0.09, 1],[55, 0.87, 1.55, 0],[55, 5.41, 1.55, 0],]], ["#ff8844",[[50, 0.00, 0.09, 1],[100, 4.68, 3.09, 1],[100, 1.61, 3.11, 1],[60, 0.00, 2.09, 0],[60, 2.09, 2.09, 0],[60, 4.19, 2.09, 0],[100, 0.00, 0.09, 1],]], ["#ff0033",[[50, 0.00, 0.17, 1],[100, 1.57, 2.62, 1],[100, 4.71, 2.62, 1],]], ["#a08080",[[50, 0.00, 0.14, 1],[30, 0.00, 0.87, 0],[50, 0.00, 0.17, 0],[100, 5.50, 1.75, 1],[100, 0.79, 1.75, 1],[60, 3.14, 3.14, 0],]],],[[[75,75,0.87,0.02,2,0], [225,75,0.24,1.41,0,0], [75,225,5.64,2.15,0,0], [225,225,0.35,-0.00,2,0],], [[76,76,0.87,-0.00,2,0], [225,75,0.24,1.50,0,0], [75,225,5.64,1.83,0,0], [227,225,0.35,0.00,2,0],], [[79,80,0.87,0.00,2,0], [225,75,0.24,1.61,0,0], [75,225,5.64,1.52,0,0], [231,227,0.35,-0.00,2,0],], [[83,85,0.87,-0.00,2,0], [225,75,0.24,1.71,0,0], [75,225,5.64,1.20,0,0], [237,229,0.35,-0.00,2,0],], [[87,90,0.87,-0.00,2,0], [225,75,0.24,1.82,0,0], [75,225,5.64,0.89,0,0], [242,231,0.35,0.00,2,0],], [[91,95,0.87,0.00,2,0], [225,75,0.24,1.92,0,0], [75,225,5.64,0.58,0,0], [247,233,0.35,-0.00,2,0],], [[95,100,0.96,-0.00,2,0], [225,75,0.24,2.02,0,0], [75,225,5.64,0.26,0,0], [252,235,0.35,0.00,2,0],], [[98,105,1.05,-0.00,2,0], [225,75,0.24,2.11,0,0], [75,225,5.64,0.00,0,0], [258,237,0.35,-0.00,2,0],], [[101,111,1.13,0.00,2,0], [225,75,0.24,2.20,0,0], [75,225,5.64,-0.00,0,0], [263,239,0.35,-0.00,2,0],], [[103,116,1.13,-0.00,2,0], [225,75,0.24,2.29,0,0], [75,225,5.64,0.00,0,4], [268,240,0.35,0.00,2,8],], [[105,122,1.22,0.00,2,4], [225,75,0.24,2.37,0,0], [75,225,5.64,-0.31,0,4], [272,242,0.28,-0.31,2,24],], [[106,127,1.38,-0.00,2,4], [225,75,0.24,2.46,0,0], [75,225,5.64,-0.63,0,4], [278,243,0.22,-0.30,2,24],], [[106,131,1.63,-0.00,2,4], [225,75,0.24,2.55,0,0], [75,225,5.64,-0.94,0,6], [285,244,0.22,-0.28,2,24],], [[105,134,1.93,0.00,2,140], [225,75,0.24,2.65,0,0], [75,225,5.64,-1.26,0,6], [292,246,0.22,-0.26,2,8],], [[102,138,2.22,-0.00,2,8], [225,75,0.24,2.74,0,0], [75,225,5.64,-1.57,0,6], [296,247,0.22,-0.58,2,24],], [[99,141,2.32,-0.00,2,8], [225,75,0.24,2.83,0,0], [75,225,5.64,-1.88,0,6], [3,248,0.22,-0.58,2,24],], [[97,144,2.15,0.00,2,8], [225,75,0.24,2.91,0,0], [75,225,5.64,-2.20,0,6], [10,250,0.22,-0.56,2,24],], [[96,148,1.88,-0.00,2,140], [225,75,0.24,3.00,0,0], [75,225,5.64,-2.51,0,6], [17,251,0.22,-0.54,2,24],], [[95,153,1.64,-0.00,2,4], [225,75,0.24,3.09,0,0], [75,225,5.64,-2.83,0,6], [24,253,0.22,-0.54,2,24],], [[95,158,1.64,0.00,2,4], [225,75,0.24,3.18,0,0], [75,225,5.64,-3.14,1,3], 0,], [[94,162,1.82,-0.00,2,140], [225,75,0.24,3.26,0,0], [75,225,5.64,-2.83,0,2], 0,], [[92,168,1.97,0.00,2,652], [225,75,0.24,3.37,0,0], [75,225,5.64,-2.51,0,2], 0,], [[89,175,1.97,-0.00,3,653], [225,75,0.24,3.46,0,0], 0, 0,], [[86,181,1.97,-0.00,0,0], [225,75,0.24,3.54,0,0], 0, 0,], [[84,187,1.97,0.00,0,0], [225,75,0.24,3.63,0,0], 0, 0,], [[81,193,1.97,-0.00,0,0], [225,75,0.24,3.72,0,0], 0, 0,], [[78,198,2.05,-0.00,0,0], [225,75,0.24,3.80,0,0], 0, 0,], [[76,204,2.05,0.00,0,0], [225,75,0.24,3.89,0,0], 0, 0,], [[73,209,2.05,-0.00,0,0], [225,75,0.24,3.98,0,0], 0, 0,], [[70,215,2.05,0.00,0,0], [225,75,0.24,4.08,0,0], 0, 0,], [[67,220,2.05,-0.00,0,0], [225,75,0.24,4.19,0,0], 0, 0,], [[64,226,2.05,-0.00,0,0], [225,75,0.24,4.29,0,0], 0, 0,], [[61,231,2.14,0.00,0,0], [225,75,0.24,4.40,0,0], 0, 0,], [[57,237,2.14,-0.00,0,0], [225,75,0.24,4.49,0,0], 0, 0,], [[54,242,2.14,-0.00,0,0], [225,75,0.24,4.57,0,0], 0, 0,], [[50,247,2.14,0.00,0,0], [225,75,0.24,4.66,0,0], 0, 0,], [[47,252,2.14,-0.00,0,0], [225,75,0.24,4.75,0,0], 0, 0,], [[44,258,2.14,-0.00,0,0], [225,75,0.24,4.83,0,0], 0, 0,], [[40,263,2.14,0.00,0,0], [225,75,0.24,4.92,0,0], 0, 0,], [[37,268,2.14,-0.00,0,0], [225,75,0.24,5.01,0,0], 0, 0,], [[33,274,2.14,0.00,0,0], [225,75,0.24,5.10,0,0], 0, 0,], [[30,279,2.23,-0.00,0,0], [225,75,0.24,5.20,0,0], 0, 0,], [[26,284,2.23,-0.00,2,0], [225,75,0.24,5.31,0,0], 0, 0,], [[22,289,2.23,0.00,2,0], [225,75,0.24,5.39,0,0], 0, 0,], [[18,294,2.23,-0.00,2,0], [225,75,0.24,5.48,0,0], 0, 0,], [[14,299,2.23,-0.00,2,0], [225,75,0.24,5.57,0,0], 0, 0,], [[10,3,2.31,0.00,2,0], [225,75,0.24,5.65,0,0], 0, 0,], [[6,8,2.31,-0.00,2,4], [225,75,0.24,5.74,0,2], 0, 0,], [[2,11,2.42,-0.00,2,140], [225,75,0.24,5.43,0,66], 0, 0,], [[297,15,2.46,0.00,2,140], [225,75,0.24,5.74,0,2], 0, 0,], [[291,20,2.46,-0.00,2,140], [225,75,0.24,5.43,0,66], 0, 0,], [[286,24,2.46,0.00,2,140], [225,75,0.24,5.74,0,2], 0, 0,], [[280,29,2.46,-0.00,2,140], [225,75,0.24,5.43,0,66], 0, 0,], [[275,33,2.46,-0.00,2,140], [225,75,0.24,5.74,0,10], 0, 0,], [[270,37,2.46,0.00,2,908], [222,74,0.24,5.43,0,78], 0, 0,], [[264,42,2.46,-0.00,3,397], 0, 0, 0,],]];
|
|
|
@ -1,310 +0,0 @@
|
||||||
function dbg(o) {
|
|
||||||
e = document.getElementById("debug");
|
|
||||||
e.innerHTML = o;
|
|
||||||
}
|
|
||||||
|
|
||||||
function torgba(color, alpha) {
|
|
||||||
var r = parseInt(color.substring(1,3), 16);
|
|
||||||
var g = parseInt(color.substring(3,5), 16);
|
|
||||||
var b = parseInt(color.substring(5,7), 16);
|
|
||||||
|
|
||||||
return "rgba(" + r + "," + g + "," + b + "," + alpha + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
function Tank(ctx, width, height, color, sensors) {
|
|
||||||
var craterStroke = torgba(color, 0.5);
|
|
||||||
var craterFill = torgba(color, 0.2);
|
|
||||||
var sensorStroke = torgba(color, 0.4);
|
|
||||||
var maxlen = 0;
|
|
||||||
|
|
||||||
this.x = 0;
|
|
||||||
this.y = 0;
|
|
||||||
this.rotation = 0;
|
|
||||||
this.turret = 0;
|
|
||||||
|
|
||||||
this.dead = 0;
|
|
||||||
|
|
||||||
// Do all the yucky math up front
|
|
||||||
this.sensors = new Array();
|
|
||||||
for (i in sensors) {
|
|
||||||
var s = sensors[i];
|
|
||||||
|
|
||||||
if (! s) {
|
|
||||||
this.sensors[i] = [0,0,0,0];
|
|
||||||
} else {
|
|
||||||
// r, angle, width, turret
|
|
||||||
this.sensors[i] = new Array();
|
|
||||||
this.sensors[i][0] = s[0];
|
|
||||||
this.sensors[i][1] = s[1] - s[2]/2;
|
|
||||||
this.sensors[i][2] = s[1] + s[2]/2;
|
|
||||||
this.sensors[i][3] = s[3]?1:0;
|
|
||||||
if (s[0] > maxlen) {
|
|
||||||
maxlen = s[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set up our state, for later interleaved draw requests
|
|
||||||
this.set_state = function(x, y, rotation, turret, flags, sensor_state) {
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
this.rotation = rotation;
|
|
||||||
this.turret = turret;
|
|
||||||
if (flags & 1) {
|
|
||||||
this.fire = 5;
|
|
||||||
}
|
|
||||||
this.led = flags & 2;
|
|
||||||
this.dead = flags & 4;
|
|
||||||
this.sensor_state = sensor_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.draw_crater = function() {
|
|
||||||
if (!this.dead) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var points = 7;
|
|
||||||
var angle = Math.PI / points;
|
|
||||||
|
|
||||||
ctx.save();
|
|
||||||
ctx.translate(this.x, this.y);
|
|
||||||
ctx.rotate(this.rotation);
|
|
||||||
|
|
||||||
if (this.fire == 5) {
|
|
||||||
ctx.save();
|
|
||||||
ctx.rotate(this.turret);
|
|
||||||
// one frame of cannon fire
|
|
||||||
this.draw_cannon();
|
|
||||||
this.fire = 0;
|
|
||||||
ctx.restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.lineWidth = 2;
|
|
||||||
ctx.strokeStyle = craterStroke;
|
|
||||||
ctx.fillStyle = craterFill;
|
|
||||||
ctx.beginPath();
|
|
||||||
ctx.moveTo(12, 0);
|
|
||||||
for (i = 0; i < points; i += 1) {
|
|
||||||
ctx.rotate(angle);
|
|
||||||
ctx.lineTo(6, 0);
|
|
||||||
ctx.rotate(angle);
|
|
||||||
ctx.lineTo(12, 0);
|
|
||||||
}
|
|
||||||
ctx.closePath()
|
|
||||||
ctx.stroke();
|
|
||||||
ctx.fill();
|
|
||||||
|
|
||||||
ctx.restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.draw_sensors = function() {
|
|
||||||
if (this.dead) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ctx.save();
|
|
||||||
ctx.translate(this.x, this.y);
|
|
||||||
ctx.rotate(this.rotation);
|
|
||||||
|
|
||||||
ctx.lineWidth = 1;
|
|
||||||
for (i in this.sensors) {
|
|
||||||
var s = this.sensors[i];
|
|
||||||
var adj = this.turret * s[3];
|
|
||||||
|
|
||||||
if (this.sensor_state & (1 << i)) {
|
|
||||||
// Sensor is triggered
|
|
||||||
ctx.strokeStyle = "#000";
|
|
||||||
} else {
|
|
||||||
ctx.strokeStyle = sensorStroke;
|
|
||||||
}
|
|
||||||
ctx.beginPath();
|
|
||||||
ctx.moveTo(0, 0);
|
|
||||||
ctx.arc(0, 0, s[0], s[1] + adj, s[2] + adj, false);
|
|
||||||
ctx.closePath();
|
|
||||||
ctx.stroke();
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.draw_tank = function() {
|
|
||||||
if (this.dead) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ctx.save();
|
|
||||||
ctx.translate(this.x, this.y);
|
|
||||||
ctx.rotate(this.rotation);
|
|
||||||
|
|
||||||
ctx.fillStyle = color;
|
|
||||||
ctx.fillRect(-5, -4, 10, 8);
|
|
||||||
ctx.fillStyle = "#777";
|
|
||||||
ctx.fillRect(-7, -9, 15, 5);
|
|
||||||
ctx.fillRect(-7, 4, 15, 5);
|
|
||||||
ctx.rotate(this.turret);
|
|
||||||
if (this.fire) {
|
|
||||||
this.draw_cannon();
|
|
||||||
this.fire -= 1;
|
|
||||||
} else {
|
|
||||||
if (this.led) {
|
|
||||||
ctx.fillStyle = "#f00";
|
|
||||||
} else {
|
|
||||||
ctx.fillStyle = "#000";
|
|
||||||
}
|
|
||||||
ctx.fillRect(0, -1, 10, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.draw_cannon = function() {
|
|
||||||
ctx.fillStyle = ("rgba(255,255,64," + this.fire/5 + ")");
|
|
||||||
ctx.fillRect(0, -1, 45, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.draw_wrap_sensors = function() {
|
|
||||||
var orig_x = this.x;
|
|
||||||
var orig_y = this.y;
|
|
||||||
for (x = this.x - width; x < width + maxlen; x += width) {
|
|
||||||
for (y = this.y - height; y < height + maxlen; y += height) {
|
|
||||||
if ((-maxlen < x) && (x < width + maxlen) &&
|
|
||||||
(-maxlen < y) && (y < height + maxlen)) {
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
this.draw_sensors();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.x = orig_x;
|
|
||||||
this.y = orig_y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var loop_id;
|
|
||||||
var updateFunc = null;
|
|
||||||
function togglePlayback() {
|
|
||||||
if ($("#playing").prop("checked")) {
|
|
||||||
loop_id = setInterval(updateFunc, 66);
|
|
||||||
} else {
|
|
||||||
clearInterval(loop_id);
|
|
||||||
loop_id = null;
|
|
||||||
}
|
|
||||||
$("#pauselabel").toggleClass("ui-icon-play ui-icon-pause");
|
|
||||||
}
|
|
||||||
|
|
||||||
function start(id, game) {
|
|
||||||
var canvas = document.getElementById(id);
|
|
||||||
var ctx = canvas.getContext('2d');
|
|
||||||
|
|
||||||
canvas.width = game[0][0];
|
|
||||||
canvas.height = game[0][1];
|
|
||||||
// game[2] is tank descriptions
|
|
||||||
var turns = game[2];
|
|
||||||
|
|
||||||
// Set up tanks
|
|
||||||
var tanks = new Array();
|
|
||||||
for (i in game[1]) {
|
|
||||||
var desc = game[1][i];
|
|
||||||
tanks[i] = new Tank(ctx, game[0][0], game[0][1], desc[0], desc[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
var frame = 0;
|
|
||||||
var lastframe = 0;
|
|
||||||
var fps = document.getElementById('fps');
|
|
||||||
|
|
||||||
function update_fps() {
|
|
||||||
fps.innerHTML = (frame - lastframe);
|
|
||||||
lastframe = frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
function drawFrame(idx) {
|
|
||||||
canvas.width = canvas.width;
|
|
||||||
turn = turns[idx];
|
|
||||||
|
|
||||||
// Update and draw craters first
|
|
||||||
for (i in turn) {
|
|
||||||
t = turn[i];
|
|
||||||
if (!t) {
|
|
||||||
// old data, force-kill it
|
|
||||||
tanks[i].fire = 0;
|
|
||||||
tanks[i].dead = 5;
|
|
||||||
} else {
|
|
||||||
tanks[i].set_state(t[0], t[1], t[2], t[3], t[4], t[5]);
|
|
||||||
}
|
|
||||||
tanks[i].draw_crater();
|
|
||||||
}
|
|
||||||
// Then sensors
|
|
||||||
for (i in turn) {
|
|
||||||
tanks[i].draw_wrap_sensors();
|
|
||||||
}
|
|
||||||
// Then tanks
|
|
||||||
for (i in turn) {
|
|
||||||
tanks[i].draw_tank()
|
|
||||||
}
|
|
||||||
|
|
||||||
document.getElementById('frameid').innerHTML = idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
function update() {
|
|
||||||
var idx = frame % (turns.length + 20);
|
|
||||||
var turn;
|
|
||||||
|
|
||||||
frame += 1;
|
|
||||||
if (idx >= turns.length) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
drawFrame(idx);
|
|
||||||
|
|
||||||
$('#seekslider').slider('value', idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
function seekToFrame(newidx) {
|
|
||||||
var idx = frame % (turns.length + 20);
|
|
||||||
if (idx !== newidx) {
|
|
||||||
frame = newidx;
|
|
||||||
drawFrame(newidx);
|
|
||||||
}
|
|
||||||
// make sure we're paused
|
|
||||||
if ($("#playing").prop("checked")) {
|
|
||||||
$("#playing").prop("checked", false);
|
|
||||||
togglePlayback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
updateFunc = update;
|
|
||||||
loop_id = setInterval(update, 66);
|
|
||||||
//loop_id = setInterval(update, 400);
|
|
||||||
if (fps) {
|
|
||||||
setInterval(update_fps, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (id === "battlefield") {
|
|
||||||
$("#game_box").append('<p><input type="checkbox" checked id="playing" onclick="togglePlayback();"><label for="playing"><span class="ui-icon ui-icon-pause" id="pauselabel"></class></label> <span id="frameid">0</span> <span id="seekslider" style="width: 75%; float: right;"></span></p>');
|
|
||||||
$('#playing').button();
|
|
||||||
var slider = $('#seekslider');
|
|
||||||
slider.slider({ max: turns.length-1, slide: function(event, ui) { seekToFrame(ui.value); } });
|
|
||||||
|
|
||||||
var spacing = 100 / turns.length;
|
|
||||||
var deaths = [];
|
|
||||||
for (i in turns[0]) {
|
|
||||||
deaths.push(false);
|
|
||||||
}
|
|
||||||
var percent = 0;
|
|
||||||
for (var f = 0; f < turns.length; f++) {
|
|
||||||
var turn = turns[f];
|
|
||||||
if (percent < (spacing * f)) {
|
|
||||||
percent = spacing * f;
|
|
||||||
}
|
|
||||||
for (var i = 0; i < turn.length; i++) {
|
|
||||||
if (deaths[i]) { continue; }
|
|
||||||
if (!turn[i] || (turn[i][4] & 4)) {
|
|
||||||
deaths[i] = true;
|
|
||||||
// http://stackoverflow.com/questions/8648963/add-tick-marks-to-jquery-slider
|
|
||||||
$('<span class="ui-slider-tick-mark"></span>').css('left', percent + '%').css('background-color', game[1][i][0]).appendTo(slider);
|
|
||||||
percent++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Forf Manual</title>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<link rel="stylesheet" href="style.css" type="text/css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
syscmd(markdown forf.txt)
|
|
||||||
include(nav.html.inc)
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
|
@ -1,9 +1,4 @@
|
||||||
---
|
# History
|
||||||
title: History
|
|
||||||
scripts:
|
|
||||||
- assets/js/tanks.js
|
|
||||||
- assets/js/figures.js
|
|
||||||
---
|
|
||||||
|
|
||||||
This is a port of the "Tanks" program written by Paul Ferrell
|
This is a port of the "Tanks" program written by Paul Ferrell
|
||||||
<pflarr@clanspum.net> in 2009-2010. Paul created the entire game based
|
<pflarr@clanspum.net> in 2009-2010. Paul created the entire game based
|
||||||
|
@ -34,18 +29,6 @@ called "Bullet", which looked like this:
|
||||||
sense(2): turretccw();
|
sense(2): turretccw();
|
||||||
sense(0): fire();
|
sense(0): fire();
|
||||||
|
|
||||||
<table class="figure">
|
|
||||||
<caption>"Chashtank" cleans up.</caption>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<canvas id="shortround"></canvas>
|
|
||||||
<script type="application/javascript">
|
|
||||||
start("shortround", shortround);
|
|
||||||
</script>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
Nick Moffitt played with this original version and convinced me (Neale)
|
Nick Moffitt played with this original version and convinced me (Neale)
|
||||||
that something like Forth would be a better language. I added some code
|
that something like Forth would be a better language. I added some code
|
||||||
to accept a scaled-down version of PostScript. The IRC channel we
|
to accept a scaled-down version of PostScript. The IRC channel we
|
||||||
|
|
|
@ -1,147 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Tanks Introduction</title>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<link rel="stylesheet" href="style.css" type="text/css">
|
|
||||||
<script type="application/javascript" src="tanks.js"></script>
|
|
||||||
<script type="application/javascript" src="figures.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>Tanks Introduction</h1>
|
|
||||||
|
|
||||||
<table class="figure">
|
|
||||||
<caption>"ChashTank" dominates this short round.</caption>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<canvas id="shortround"></canvas>
|
|
||||||
<script type="text/javascript">
|
|
||||||
start("shortround", shortround);
|
|
||||||
</script>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Tanks is a game in which you pit your coding abilities against
|
|
||||||
other hackers. You write a program for your tank, set it out on
|
|
||||||
the battlefield, and watch how it fares against other tanks while
|
|
||||||
running your program.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Each tank has a turret-mounted laser, two treads, up to ten
|
|
||||||
sensors, and a diagnostic LED. Sensors are used to detect when
|
|
||||||
other tanks are inside a given arc. In the examples on this page,
|
|
||||||
"triggered" sensors turn black. Most tanks will take some action
|
|
||||||
if a sensor is triggered, such as changing speed of the treads,
|
|
||||||
turning the turret, or firing.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Tanks are programmed in Forf, a stack-based language similar to
|
|
||||||
PostScript. Please read the <a href="forf.html">Forf manual</a>
|
|
||||||
to learn more about forf, and the <a href="procs.html">Tanks
|
|
||||||
procedure reference</a> for a description of Tanks extensions.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>Quick Start for the Impatient</h2>
|
|
||||||
|
|
||||||
<table class="figure left">
|
|
||||||
<caption>"Crashmaster" pwns the lame default tank provided in this
|
|
||||||
section.</caption>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<canvas id="default"></canvas>
|
|
||||||
<script type="text/javascript">
|
|
||||||
start("default", default_);
|
|
||||||
</script>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
To get started, head over to the <a href="debugger.html">Tank
|
|
||||||
Debugger</a> and enter the following example tank. This tank will
|
|
||||||
move around, turn the turret, and fire if there's something in
|
|
||||||
front of it.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre style="clear: both;">
|
|
||||||
Sensor 0: 50 0 7 ☑
|
|
||||||
Sensor 1: 30 0 90 ☐
|
|
||||||
|
|
||||||
get-turret 12 + set-turret! ( Rotate turret )
|
|
||||||
37 40 set-speed! ( Go in circles )
|
|
||||||
0 sensor? { fire! } if ( Fire if turret sensor triggered )
|
|
||||||
1 sensor? { -50 50 set-speed! } if ( Turn if collision sensor triggered )
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Obviously, this tank could be improved. Studying the examples on
|
|
||||||
this page should give you ideas about how to make a better tank.
|
|
||||||
Don't forget the <a href="forf.html">Forf manual</a> and the
|
|
||||||
<a href="procs.html">Tank procedure reference</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>Tank Specifications</h2>
|
|
||||||
|
|
||||||
<table class="figure">
|
|
||||||
<caption>"Ant Lion" nails "Rabbit With Gun".</caption>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<canvas id="antlion"></canvas>
|
|
||||||
<script type="text/javascript">
|
|
||||||
start("antlion", antlion);
|
|
||||||
</script>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Your PF-255 autonomous tank is built to the exacting
|
|
||||||
specifications sent to our factory in New Khavistan. All
|
|
||||||
distances are in meters, angles in degrees.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl style="clear: both;">
|
|
||||||
<dt>Tank size</dt>
|
|
||||||
<dd>
|
|
||||||
The targettable area of the tank—the part which can be hit by a
|
|
||||||
cannon—is a circle about 7½ meters in radius.
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt>Speed</dt>
|
|
||||||
<dd>
|
|
||||||
Each tread can have a speed between -100 and 100. This is in
|
|
||||||
percentage of total speed for that tread, where total speed is
|
|
||||||
roughly 7 meters per turn.
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt>Sensors</dt>
|
|
||||||
<dd>
|
|
||||||
Each sensor has a maximum range of 100 meters. Of course, you
|
|
||||||
don't have to use the full range. Sensors may be attached to
|
|
||||||
the turret (they turn along with the turret), or left fixed to
|
|
||||||
the tank.
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt>Turret</dt>
|
|
||||||
<dd>
|
|
||||||
Turret angle can be set between -359° and 359°, with 0° directly
|
|
||||||
in front of the tank. Be aware that it takes time for the
|
|
||||||
turret to swing around: the turret can swing about 45° per turn.
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt>Cannon range and recharging</dt>
|
|
||||||
<dd>
|
|
||||||
When the cannon is fired, it obliterates everything for 50
|
|
||||||
meters in front of it. It takes around 20 turns for your cannon
|
|
||||||
to recharge after it's been fired, so only shoot when you feel
|
|
||||||
like you're going to hit something.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
Good luck blowing everybody up!
|
|
||||||
include(nav.html.inc)
|
|
||||||
</html>
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
# Tanks Introduction
|
||||||
|
|
||||||
|
Tanks is a game in which you pit your coding abilities against
|
||||||
|
other hackers. You write a program for your tank, set it out on
|
||||||
|
the battlefield, and watch how it fares against other tanks while
|
||||||
|
running your program.
|
||||||
|
|
||||||
|
Each tank has a turret-mounted laser, two treads, up to ten
|
||||||
|
sensors, and a diagnostic LED. Sensors are used to detect when
|
||||||
|
other tanks are inside a given arc. In the examples on this page,
|
||||||
|
"triggered" sensors turn black. Most tanks will take some action
|
||||||
|
if a sensor is triggered, such as changing speed of the treads,
|
||||||
|
turning the turret, or firing.
|
||||||
|
|
||||||
|
Tanks are programmed in Forf, a stack-based language similar to
|
||||||
|
PostScript. Please read the [Forf manual](forf.md) to learn more
|
||||||
|
about forf, and the [Tanks procedure reference](procs.html) for a
|
||||||
|
description of Tanks extensions.
|
||||||
|
|
||||||
|
## Quick Start for the Impatient
|
||||||
|
|
||||||
|
To get started, head over to the designer for your game,
|
||||||
|
and use the following example tank. This tank will
|
||||||
|
move around, turn the turret, and fire if there's something in
|
||||||
|
front of it.
|
||||||
|
|
||||||
|
Sensor 0: 50 0 7 ☑
|
||||||
|
Sensor 1: 30 0 90 ☐
|
||||||
|
|
||||||
|
get-turret 12 + set-turret! ( Rotate turret )
|
||||||
|
37 40 set-speed! ( Go in circles )
|
||||||
|
0 sensor? { fire! } if ( Fire if turret sensor triggered )
|
||||||
|
1 sensor? { -50 50 set-speed! } if ( Turn if collision sensor triggered )
|
||||||
|
|
||||||
|
Obviously, this tank could be improved.
|
||||||
|
Watch other tanks in your game to get ideas about how to improve yours.
|
||||||
|
Don't forget the [Forf manual](forf.md) and the
|
||||||
|
[Tank procedure reference](procs.html).
|
||||||
|
|
||||||
|
## Tank Specifications
|
||||||
|
|
||||||
|
Your PF-255 autonomous tank is built to the exacting
|
||||||
|
specifications sent to our factory in New Khavistan. All
|
||||||
|
distances are in meters, angles in degrees.
|
||||||
|
|
||||||
|
|
||||||
|
Tank size
|
||||||
|
: The targettable area of the tank—the part which can be hit by a cannon—is a circle about 7½ meters in radius.
|
||||||
|
|
||||||
|
Speed
|
||||||
|
: Each tread can have a speed between -100 and 100. This is in
|
||||||
|
percentage of total speed for that tread, where total speed is
|
||||||
|
roughly 7 meters per turn.
|
||||||
|
|
||||||
|
Sensors
|
||||||
|
: Each sensor has a maximum range of 100 meters. Of course, you
|
||||||
|
don't have to use the full range. Sensors may be attached to
|
||||||
|
the turret (they turn along with the turret), or left fixed to
|
||||||
|
the tank.
|
||||||
|
|
||||||
|
Turret
|
||||||
|
: Turret angle can be set between -359° and 359°, with 0° directly
|
||||||
|
in front of the tank. Be aware that it takes time for the
|
||||||
|
turret to swing around: the turret can swing about 45° per turn.
|
||||||
|
|
||||||
|
Cannon range and recharging
|
||||||
|
: When the cannon is fired, it obliterates everything for 50
|
||||||
|
meters in front of it. It takes around 20 turns for your cannon
|
||||||
|
to recharge after it's been fired, so only shoot when you feel
|
||||||
|
like you're going to hit something.
|
||||||
|
|
||||||
|
Good luck blowing everybody up!
|
|
@ -1,10 +0,0 @@
|
||||||
<nav>
|
|
||||||
<h2>Resources</h2>
|
|
||||||
<ul>
|
|
||||||
<li><a href="summary.html">Summary</a></li>
|
|
||||||
<li><a href="intro.html">Introduction</a></li>
|
|
||||||
<li><a href="forf.html">Forf manual</a></li>
|
|
||||||
<li><a href="procs.html">Tanks procedures</a></li>
|
|
||||||
<li><a href="debugger.html">Tanks debugger</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
|
@ -1,74 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Tanks Procedure Reference</title>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<link rel="stylesheet" href="style.css" type="text/css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>Tanks Procedure Reference</h1>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Each tank's program is run once per turn. The data and command
|
|
||||||
stacks are reset at the beginning of each turn, but memory is not,
|
|
||||||
so you can carry data over in memory registers if you want. See
|
|
||||||
the <a href="forf.html">Forf manual</a> for more information about
|
|
||||||
the base language.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
For tank specifications (sensor range, maximum speeds, etc.), see
|
|
||||||
the <a href="intro.html">introduction</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<h2>Limits</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Forf Tanks has a data stack size of 200, and a command stack size
|
|
||||||
of 500. This means your program cannot have more than 200 data
|
|
||||||
items, or 500 instructions, including 2 instructions for each
|
|
||||||
substack.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Forf Tanks provides 10 memory registers (0-9) which persist across
|
|
||||||
invocations of your tank's program.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<h2>Additional Procedures</h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt>fire-ready?</dt>
|
|
||||||
<dd>Returns 1 if the tank can fire, 0 if not.</dd>
|
|
||||||
|
|
||||||
<dt>fire!</dt>
|
|
||||||
<dd>Fires the cannon.</dd>
|
|
||||||
|
|
||||||
<dt>l r set-speed!</dt>
|
|
||||||
<dd>Sets the speed of the left and right treads (range: -100 to
|
|
||||||
100).</dd>
|
|
||||||
|
|
||||||
<dt>get-turret</dt>
|
|
||||||
<dd>Returns the current angle of the turret.</dd>
|
|
||||||
|
|
||||||
<dt>a set-turret!</dt>
|
|
||||||
<dd>Set the turret to a degrees.</dd>
|
|
||||||
|
|
||||||
<dt>n sensor?</dt>
|
|
||||||
<dd>Returns 1 if sensor n is triggered, 0 if not.</dd>
|
|
||||||
|
|
||||||
<dt>s set-led!</dt>
|
|
||||||
<dd>Turns off the LED if s is 0, on for any other value.</dd>
|
|
||||||
|
|
||||||
<dt>n random</dt>
|
|
||||||
<dd>Returns a random number in the range [0, n). That is, between
|
|
||||||
0 and n-1, inclusive.</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
include(nav.html.inc)
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
# Tanks Procedure Reference
|
||||||
|
|
||||||
|
Each tank's program is run once per turn. The data and command
|
||||||
|
stacks are reset at the beginning of each turn, but memory is not,
|
||||||
|
so you can carry data over in memory registers if you want. See
|
||||||
|
the [Forf manual](forf.md) for more information about
|
||||||
|
the base language.
|
||||||
|
|
||||||
|
For tank specifications (sensor range, maximum speeds, etc.), see
|
||||||
|
the [introduction](intro.html).
|
||||||
|
|
||||||
|
## Limits
|
||||||
|
|
||||||
|
Forf Tanks has a data stack size of 200, and a command stack size
|
||||||
|
of 500. This means your program cannot have more than 200 data
|
||||||
|
items, or 500 instructions, including 2 instructions for each
|
||||||
|
substack.
|
||||||
|
|
||||||
|
Forf Tanks provides 10 memory registers (0-9) which persist across
|
||||||
|
invocations of your tank's program.
|
||||||
|
|
||||||
|
|
||||||
|
## Additional Procedures
|
||||||
|
|
||||||
|
fire-ready?
|
||||||
|
: Returns 1 if the tank can fire, 0 if not.
|
||||||
|
|
||||||
|
fire!
|
||||||
|
: Fires the cannon.
|
||||||
|
|
||||||
|
l r set-speed!
|
||||||
|
: Sets the speed of the left and right treads (range: -100 to 100).
|
||||||
|
|
||||||
|
get-turret
|
||||||
|
: Returns the current angle of the turret, in degrees.
|
||||||
|
|
||||||
|
a set-turret!
|
||||||
|
: Begin moving the turret to a degrees.
|
||||||
|
|
||||||
|
n sensor?
|
||||||
|
: Returns 1 if sensor n is triggered, 0 if not.
|
||||||
|
|
||||||
|
s set-led!
|
||||||
|
: Turns off the LED if s is 0, on for any other value.
|
||||||
|
|
||||||
|
n random
|
||||||
|
: Returns a random number in the range [0, n). That is, between 0 and n-1, inclusive.
|
|
@ -1,73 +0,0 @@
|
||||||
---
|
|
||||||
title: Running Tanks
|
|
||||||
---
|
|
||||||
|
|
||||||
Unfortunately, it's kind of a mess right now.
|
|
||||||
I know there are a few forks of this code,
|
|
||||||
and I would love it if someone proposed a merge to clearly illustrate how to run tanks.
|
|
||||||
|
|
||||||
When I spin up a new tanks game,
|
|
||||||
typically I run something like:
|
|
||||||
|
|
||||||
while sleep 60; do ./run-tanks */; done
|
|
||||||
|
|
||||||
This assumes all your tanks directories are in the same place as `run-tanks`.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Included programs
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
I tried to stick with the Unix philosophy of one program per task. I
|
|
||||||
also tried to avoid doing any string processing in C. The result is a
|
|
||||||
hodgepodge of C, Bourne shell, and awk, but at least each piece is
|
|
||||||
fairly simple to audit.
|
|
||||||
|
|
||||||
|
|
||||||
### run-tanks tank1 tank2 ...
|
|
||||||
|
|
||||||
Runs a single round, awards points with rank.awk, and creates a new
|
|
||||||
summary.html with summary.awk. This is the main interface that you want
|
|
||||||
to run from cron or whatever.
|
|
||||||
|
|
||||||
|
|
||||||
### forftanks tank1 tank2 ...
|
|
||||||
|
|
||||||
A program to run a round of tanks and output a JSON description of the
|
|
||||||
game. This is what tanks.js uses to render a game graphically.
|
|
||||||
The object printed contains:
|
|
||||||
|
|
||||||
[[game-width, game-height],
|
|
||||||
[[tank1-color,
|
|
||||||
[[sensor1range, sensor1angle, sensor1width, sensor1turret],
|
|
||||||
...]],
|
|
||||||
...],
|
|
||||||
[[
|
|
||||||
[tank1x, tank1y, tank1angle, tank1sensangle,
|
|
||||||
tank1flags, tank1sensors],
|
|
||||||
...],
|
|
||||||
...]]
|
|
||||||
|
|
||||||
If file descriptor 3 is open for writes, it also outputs the results of
|
|
||||||
the round to fd3.
|
|
||||||
|
|
||||||
|
|
||||||
### rank.awk
|
|
||||||
|
|
||||||
Processes the fd3 output of forftanks to award points and output an
|
|
||||||
HTML results table.
|
|
||||||
|
|
||||||
|
|
||||||
### summary.awk tank1 tank2
|
|
||||||
|
|
||||||
Creates summary.html, linking to all rounds and showing overall
|
|
||||||
standing.
|
|
||||||
|
|
||||||
|
|
||||||
### designer.cgi
|
|
||||||
|
|
||||||
Accepts form input and writes a tank.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue