4D tic-tac-toe (real)
BIN
assets/images/tictactoe4.png.original
Normal file
After Width: | Height: | Size: 1.6 MiB |
@ -21,7 +21,7 @@ const metricDisplayInfo = {
|
|||||||
commentsPosted: { name: "Comments posted", units: "comment" },
|
commentsPosted: { name: "Comments posted", units: "comment" },
|
||||||
greatestInfipage: { name: "Largest infipage visited" },
|
greatestInfipage: { name: "Largest infipage visited" },
|
||||||
heavpootLocations: { name: "Heavpoot's Game states", units: "state" },
|
heavpootLocations: { name: "Heavpoot's Game states", units: "state" },
|
||||||
heavpootDeaths: { name: "Heavpoot's Game deaths", units: "death" }
|
heavpootDeaths: { name: "Heavpoot's Game deaths", units: "death" },
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const opponent of ["ai1", "ai2"]) {
|
for (const opponent of ["ai1", "ai2"]) {
|
||||||
@ -30,6 +30,10 @@ for (const opponent of ["ai1", "ai2"]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const result of ["Wins", "Losses", "Draws"]) {
|
||||||
|
metricDisplayInfo[`ttt4${result}`] = { name: `${result} in 4D Tic-Tac-Toe`, units: "game" }
|
||||||
|
}
|
||||||
|
|
||||||
const displayMetric = metric => {
|
const displayMetric = metric => {
|
||||||
let name = metric[0]
|
let name = metric[0]
|
||||||
let value = metric[1]
|
let value = metric[1]
|
||||||
|
@ -360,6 +360,8 @@ slug: tictactoe
|
|||||||
function render() {
|
function render() {
|
||||||
var html = ""
|
var html = ""
|
||||||
for (var l = 0; l < size; l++) {
|
for (var l = 0; l < size; l++) {
|
||||||
|
if (l == 2) html += `</div>`
|
||||||
|
if (l == 0 || l == 2) html += `<div class="ctr">`
|
||||||
html += '<div class="layer">'
|
html += '<div class="layer">'
|
||||||
for (var r = 0; r < size; r++) {
|
for (var r = 0; r < size; r++) {
|
||||||
html += '<div class="row">'
|
html += '<div class="row">'
|
||||||
@ -373,6 +375,7 @@ slug: tictactoe
|
|||||||
}
|
}
|
||||||
html += '</div>'
|
html += '</div>'
|
||||||
}
|
}
|
||||||
|
if (l == 3) html += `</div>`
|
||||||
html += '</div>'
|
html += '</div>'
|
||||||
}
|
}
|
||||||
screen.innerHTML = html
|
screen.innerHTML = html
|
||||||
|
2
experiments/tictactoe4d/app.css
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
.layer{margin:1em;border:1px solid #666;display:inline-block}.cell{display:flex;flex-direction:column}.slot{width:2rem;height:2rem;display:inline-block;border:1px solid #aaa;font-size:.5em}.slot-1{background:#00f}.slot-2{background:red}.board,.row{display:flex}.highlight{width:50%;height:50%;top:25%;left:25%;position:relative}.abspos-indicator{height:100%;background-size:cover}
|
||||||
|
/*# sourceMappingURL=app.css.map */
|
7
experiments/tictactoe4d/app.css.map
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"sources": ["../app.css"],
|
||||||
|
"sourcesContent": [".layer {\n margin: 1em;\n border: 1px solid #666;\n display: inline-block;\n}\n.cell {\n display: flex;\n flex-direction: column;\n}\n.slot {\n width: 2rem;\n height: 2rem;\n display: inline-block;\n border: 1px solid #aaa;\n font-size: 0.5em;\n}\n.slot-1 {\n background: blue;\n}\n.slot-2 {\n background: red;\n}\n.board {\n display: flex;\n}\n.row {\n display: flex;\n}\n.highlight {\n width: 50%;\n height: 50%;\n top: 25%;\n left: 25%;\n position: relative;\n}\n.abspos-indicator {\n height: 100%;\n background-size: cover;\n}"],
|
||||||
|
"mappings": "AAAA,CAAC,MAAD,OACY,IACR,OAAQ,IAAI,MAAM,KAClB,QAAS,YACb,CACA,CAAC,KACG,QAAS,KACT,eAAgB,MACpB,CACA,CAAC,KACG,MAAO,KACP,OAAQ,KACR,QAAS,aACT,OAAQ,IAAI,MAAM,KAClB,UAAW,IACf,CACA,CAAC,OACG,WAAY,IAChB,CACA,CAAC,OACG,WAAY,GAChB,CACA,CAAC,MAGD,CAAC,IAFG,QAAS,IACb,CAIA,CAAC,UACG,MAAO,IACP,OAAQ,IACR,IAAK,IACL,KAAM,IACN,SAAU,QACd,CACA,CAAC,iBACG,OAAQ,KACR,gBAAiB,KACrB",
|
||||||
|
"names": []
|
||||||
|
}
|
3
experiments/tictactoe4d/app.js
Normal file
7
experiments/tictactoe4d/app.js.map
Normal file
4
experiments/tictactoe4d/assets/horiz0.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect x="25%" width="12.5%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect x="75%" width="12.5%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 232 B |
4
experiments/tictactoe4d/assets/horiz1.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect x="25%" width="25%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect x="75%" width="25%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 228 B |
4
experiments/tictactoe4d/assets/horiz2.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="25%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect x="50%" width="25%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 220 B |
4
experiments/tictactoe4d/assets/horiz3.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="37.5%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect x="50%" width="37.5%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 224 B |
4
experiments/tictactoe4d/assets/vert0.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect y="25%" height="12.5%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect y="75%" height="12.5%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 232 B |
4
experiments/tictactoe4d/assets/vert1.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect y="25%" height="25%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect y="75%" height="25%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 228 B |
4
experiments/tictactoe4d/assets/vert2.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect height="25%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect y="50%" height="25%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 220 B |
4
experiments/tictactoe4d/assets/vert3.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect height="37.5%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect y="50%" height="37.5%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 224 B |
2
experiments/tictactoe4d/dist/app.css
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
.layer{margin:1em;border:1px solid #666;display:inline-block}.cell{display:flex;flex-direction:column}.slot{width:2rem;height:2rem;display:inline-block;border:1px solid #aaa;font-size:.5em}.slot-1{background:#00f}.slot-2{background:red}.board,.row{display:flex}.highlight{width:50%;height:50%;top:25%;left:25%;position:relative}.abspos-indicator{height:100%;background-size:cover}
|
||||||
|
/*# sourceMappingURL=app.css.map */
|
7
experiments/tictactoe4d/dist/app.css.map
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"sources": ["../app.css"],
|
||||||
|
"sourcesContent": [".layer {\n margin: 1em;\n border: 1px solid #666;\n display: inline-block;\n}\n.cell {\n display: flex;\n flex-direction: column;\n}\n.slot {\n width: 2rem;\n height: 2rem;\n display: inline-block;\n border: 1px solid #aaa;\n font-size: 0.5em;\n}\n.slot-1 {\n background: blue;\n}\n.slot-2 {\n background: red;\n}\n.board {\n display: flex;\n}\n.row {\n display: flex;\n}\n.highlight {\n width: 50%;\n height: 50%;\n top: 25%;\n left: 25%;\n position: relative;\n}\n.abspos-indicator {\n height: 100%;\n background-size: cover;\n}"],
|
||||||
|
"mappings": "AAAA,CAAC,MAAD,OACY,IACR,OAAQ,IAAI,MAAM,KAClB,QAAS,YACb,CACA,CAAC,KACG,QAAS,KACT,eAAgB,MACpB,CACA,CAAC,KACG,MAAO,KACP,OAAQ,KACR,QAAS,aACT,OAAQ,IAAI,MAAM,KAClB,UAAW,IACf,CACA,CAAC,OACG,WAAY,IAChB,CACA,CAAC,OACG,WAAY,GAChB,CACA,CAAC,MAGD,CAAC,IAFG,QAAS,IACb,CAIA,CAAC,UACG,MAAO,IACP,OAAQ,IACR,IAAK,IACL,KAAM,IACN,SAAU,QACd,CACA,CAAC,iBACG,OAAQ,KACR,gBAAiB,KACrB",
|
||||||
|
"names": []
|
||||||
|
}
|
3
experiments/tictactoe4d/dist/app.js
vendored
Normal file
7
experiments/tictactoe4d/dist/app.js.map
vendored
Normal file
4
experiments/tictactoe4d/dist/assets/horiz0.svg
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect x="25%" width="12.5%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect x="75%" width="12.5%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 232 B |
4
experiments/tictactoe4d/dist/assets/horiz1.svg
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect x="25%" width="25%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect x="75%" width="25%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 228 B |
4
experiments/tictactoe4d/dist/assets/horiz2.svg
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="25%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect x="50%" width="25%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 220 B |
4
experiments/tictactoe4d/dist/assets/horiz3.svg
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="37.5%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect x="50%" width="37.5%" height="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 224 B |
4
experiments/tictactoe4d/dist/assets/vert0.svg
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect y="25%" height="12.5%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect y="75%" height="12.5%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 232 B |
4
experiments/tictactoe4d/dist/assets/vert1.svg
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect y="25%" height="25%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect y="75%" height="25%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 228 B |
4
experiments/tictactoe4d/dist/assets/vert2.svg
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect height="25%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect y="50%" height="25%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 220 B |
4
experiments/tictactoe4d/dist/assets/vert3.svg
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg version="1.1" width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect height="37.5%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
<rect y="50%" height="37.5%" width="100%" fill="rgb(0 0 0 / 10%)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 224 B |
12
experiments/tictactoe4d/dist/index.html
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<title>4D Tic-Tac-Toe</title>
|
||||||
|
<link rel="stylesheet" href="app.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script src="app.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
BIN
experiments/tictactoe4d/dist/tic_tac_toe_4d_bg.wasm
vendored
Normal file
41
experiments/tictactoe4d/dist/webworker_glue.css
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/* app.css */
|
||||||
|
.layer {
|
||||||
|
margin: 1em;
|
||||||
|
border: 1px solid #666;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.cell {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
.slot {
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
display: inline-block;
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
font-size: 0.5em;
|
||||||
|
}
|
||||||
|
.slot-1 {
|
||||||
|
background: blue;
|
||||||
|
}
|
||||||
|
.slot-2 {
|
||||||
|
background: red;
|
||||||
|
}
|
||||||
|
.board {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.row {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.highlight {
|
||||||
|
width: 50%;
|
||||||
|
height: 50%;
|
||||||
|
top: 25%;
|
||||||
|
left: 25%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.abspos-indicator {
|
||||||
|
height: 100%;
|
||||||
|
background-size: cover;
|
||||||
|
}
|
||||||
|
/*# sourceMappingURL=webworker_glue.css.map */
|
7
experiments/tictactoe4d/dist/webworker_glue.css.map
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"sources": ["../app.css"],
|
||||||
|
"sourcesContent": [".layer {\n margin: 1em;\n border: 1px solid #666;\n display: inline-block;\n}\n.cell {\n display: flex;\n flex-direction: column;\n}\n.slot {\n width: 2rem;\n height: 2rem;\n display: inline-block;\n border: 1px solid #aaa;\n font-size: 0.5em;\n}\n.slot-1 {\n background: blue;\n}\n.slot-2 {\n background: red;\n}\n.board {\n display: flex;\n}\n.row {\n display: flex;\n}\n.highlight {\n width: 50%;\n height: 50%;\n top: 25%;\n left: 25%;\n position: relative;\n}\n.abspos-indicator {\n height: 100%;\n background-size: cover;\n}"],
|
||||||
|
"mappings": ";AAAA,CAAC;AACG,UAAQ;AACR,UAAQ,IAAI,MAAM;AAClB,WAAS;AACb;AACA,CAAC;AACG,WAAS;AACT,kBAAgB;AACpB;AACA,CAAC;AACG,SAAO;AACP,UAAQ;AACR,WAAS;AACT,UAAQ,IAAI,MAAM;AAClB,aAAW;AACf;AACA,CAAC;AACG,cAAY;AAChB;AACA,CAAC;AACG,cAAY;AAChB;AACA,CAAC;AACG,WAAS;AACb;AACA,CAAC;AACG,WAAS;AACb;AACA,CAAC;AACG,SAAO;AACP,UAAQ;AACR,OAAK;AACL,QAAM;AACN,YAAU;AACd;AACA,CAAC;AACG,UAAQ;AACR,mBAAiB;AACrB;",
|
||||||
|
"names": []
|
||||||
|
}
|
3
experiments/tictactoe4d/dist/webworker_glue.js
vendored
Normal file
7
experiments/tictactoe4d/dist/webworker_glue.js.map
vendored
Normal file
8
experiments/tictactoe4d/index.html
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
title: Tic-Tac-Toe (4⁴)
|
||||||
|
description: More dimensions. More confusion. Somewhat worse performance. 4D Tic-Tac-Toe.
|
||||||
|
slug: tictactoe4
|
||||||
|
---
|
||||||
|
<link rel="stylesheet" href="app.css">
|
||||||
|
<div id="app"></div>
|
||||||
|
<script src="app.js"></script>
|
BIN
experiments/tictactoe4d/tic_tac_toe_4d_bg.wasm
Normal file
41
experiments/tictactoe4d/webworker_glue.css
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/* app.css */
|
||||||
|
.layer {
|
||||||
|
margin: 1em;
|
||||||
|
border: 1px solid #666;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.cell {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
.slot {
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
display: inline-block;
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
font-size: 0.5em;
|
||||||
|
}
|
||||||
|
.slot-1 {
|
||||||
|
background: blue;
|
||||||
|
}
|
||||||
|
.slot-2 {
|
||||||
|
background: red;
|
||||||
|
}
|
||||||
|
.board {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.row {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.highlight {
|
||||||
|
width: 50%;
|
||||||
|
height: 50%;
|
||||||
|
top: 25%;
|
||||||
|
left: 25%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.abspos-indicator {
|
||||||
|
height: 100%;
|
||||||
|
background-size: cover;
|
||||||
|
}
|
||||||
|
/*# sourceMappingURL=webworker_glue.css.map */
|
7
experiments/tictactoe4d/webworker_glue.css.map
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"sources": ["../app.css"],
|
||||||
|
"sourcesContent": [".layer {\n margin: 1em;\n border: 1px solid #666;\n display: inline-block;\n}\n.cell {\n display: flex;\n flex-direction: column;\n}\n.slot {\n width: 2rem;\n height: 2rem;\n display: inline-block;\n border: 1px solid #aaa;\n font-size: 0.5em;\n}\n.slot-1 {\n background: blue;\n}\n.slot-2 {\n background: red;\n}\n.board {\n display: flex;\n}\n.row {\n display: flex;\n}\n.highlight {\n width: 50%;\n height: 50%;\n top: 25%;\n left: 25%;\n position: relative;\n}\n.abspos-indicator {\n height: 100%;\n background-size: cover;\n}"],
|
||||||
|
"mappings": ";AAAA,CAAC;AACG,UAAQ;AACR,UAAQ,IAAI,MAAM;AAClB,WAAS;AACb;AACA,CAAC;AACG,WAAS;AACT,kBAAgB;AACpB;AACA,CAAC;AACG,SAAO;AACP,UAAQ;AACR,WAAS;AACT,UAAQ,IAAI,MAAM;AAClB,aAAW;AACf;AACA,CAAC;AACG,cAAY;AAChB;AACA,CAAC;AACG,cAAY;AAChB;AACA,CAAC;AACG,WAAS;AACb;AACA,CAAC;AACG,WAAS;AACb;AACA,CAAC;AACG,SAAO;AACP,UAAQ;AACR,OAAK;AACL,QAAM;AACN,YAAU;AACd;AACA,CAAC;AACG,UAAQ;AACR,mBAAiB;AACrB;",
|
||||||
|
"names": []
|
||||||
|
}
|
3
experiments/tictactoe4d/webworker_glue.js
Normal file
7
experiments/tictactoe4d/webworker_glue.js.map
Normal file
30
src/page.js
@ -151,6 +151,12 @@ window.points = (async () => {
|
|||||||
conditions: "Recurse to a stack depth of 100 or more on RPNCalc v4",
|
conditions: "Recurse to a stack depth of 100 or more on RPNCalc v4",
|
||||||
description: "For using RPNCalcV4 as it is meant to be used - highly, highly recursively.",
|
description: "For using RPNCalcV4 as it is meant to be used - highly, highly recursively.",
|
||||||
points: 18.324
|
points: 18.324
|
||||||
|
},
|
||||||
|
ttt4Win: {
|
||||||
|
title: "Shape Rotator",
|
||||||
|
conditions: "Win 4D Tic-Tac-Toe",
|
||||||
|
description: "You won a game of 4D Tic-Tac-Toe against our highly advanced artificial intelligence, showing your utter comprehension of 4D space.",
|
||||||
|
points: 37.9
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -407,21 +413,21 @@ if (sidenotes && footnotes) {
|
|||||||
const notes = []
|
const notes = []
|
||||||
// read off sidenotes to place
|
// read off sidenotes to place
|
||||||
for (const item of footnoteItems) {
|
for (const item of footnoteItems) {
|
||||||
const itemRect = item.getBoundingClientRect()
|
|
||||||
const link = article.querySelector(`#${item.id.replace(/^fn/, "fnref")}`)
|
const link = article.querySelector(`#${item.id.replace(/^fn/, "fnref")}`)
|
||||||
const linkRect = link.getBoundingClientRect()
|
const linkRect = link.getBoundingClientRect()
|
||||||
item.style.position = "absolute"
|
item.style.position = "absolute"
|
||||||
item.style.left = getComputedStyle(sidenotes).paddingLeft
|
item.style.left = getComputedStyle(sidenotes).paddingLeft
|
||||||
item.style.marginBottom = item.style.marginTop = `${BORDER / 2}px`
|
item.style.paddingBottom = item.style.paddingTop = `${BORDER / 2}px`
|
||||||
|
const itemRect = item.getBoundingClientRect()
|
||||||
notes.push({
|
notes.push({
|
||||||
item,
|
item,
|
||||||
height: itemRect.height + BORDER,
|
height: itemRect.height,
|
||||||
target: linkRect.top - snRect.top
|
target: linkRect.top - snRect.top
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// preliminary placement: place in valid regions going down
|
// preliminary placement: place in valid regions going down
|
||||||
for (const note of notes) {
|
for (const note of notes) {
|
||||||
const index = inclusions.findLastIndex(inc => (inc.start + note.height) < note.target)
|
const index = Math.max(inclusions.findLastIndex(inc => (inc.start + note.height) < note.target), 0)
|
||||||
const next = inclusions.slice(index)
|
const next = inclusions.slice(index)
|
||||||
.findIndex(inc => (sum(inc.contents.map(x => x.height)) + note.height) < (inc.end - inc.start))
|
.findIndex(inc => (sum(inc.contents.map(x => x.height)) + note.height) < (inc.end - inc.start))
|
||||||
inclusions[index + next].contents.push(note)
|
inclusions[index + next].contents.push(note)
|
||||||
@ -506,6 +512,22 @@ if (sidenotes && footnotes) {
|
|||||||
window.relayout = relayout
|
window.relayout = relayout
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const fixDetailsSummary = () => {
|
||||||
|
const el = document.getElementById(window.location.hash.slice(1))
|
||||||
|
var parent = el
|
||||||
|
if (!el) return
|
||||||
|
while (parent.parentElement) {
|
||||||
|
if (parent.nodeName === "DETAILS") {
|
||||||
|
parent.setAttribute("open", true)
|
||||||
|
}
|
||||||
|
parent = parent.parentElement
|
||||||
|
}
|
||||||
|
el.scrollIntoView()
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener("hashchange", fixDetailsSummary)
|
||||||
|
fixDetailsSummary()
|
||||||
|
|
||||||
const customStyle = localStorage.getItem("user-stylesheet")
|
const customStyle = localStorage.getItem("user-stylesheet")
|
||||||
let customStyleEl = null
|
let customStyleEl = null
|
||||||
if (customStyle) {
|
if (customStyle) {
|
||||||
|