Multiplayer kind of working

This commit is contained in:
Arne van Iterson 2020-11-18 11:43:45 +01:00
parent eddfb721ab
commit 3a739e33a9
10 changed files with 442 additions and 88 deletions

View File

@ -11,20 +11,49 @@
<h1><i class="fas fa-bomb"></i>Minesweeper 99</h1> <h1><i class="fas fa-bomb"></i>Minesweeper 99</h1>
<div id="main"> <div id="main">
<div>
<div id="board"> <div id="board">
<!-- Renderer will push content here --> <!-- Renderer will push content here -->
</div> </div>
</div>
<div>
<div id="time">
<h2>Time left:</h2>
<span>00:00</span>
<hr>
</div>
<div id="register">
<h2>Welcome</h2>
<form action="#">
<label for="username">Username:</label><br>
<input type="text" name="username" placeholder="Username"><br><br>
<label for="store">Use this username every game:</label>
<input type="checkbox" name="store"><br>
<label for="store" style="color: tomato">This feature uses cookies.</label><br><br>
<button type="submit">Submit</button>
</form>
</div>
<div id="log"> <div id="log">
<h2>Gamelog</h2> <h2>Gamelog</h2>
<div>
<!-- Game log will be pushed here --> <!-- Game log will be pushed here -->
</div> </div>
</div> </div>
</div>
</div>
<script src="/main.js"></script> <script src="/main.js"></script>
<footer> <footer>
> Coded by <a href="//arnweb.nl">McArn</a>. > Coded by <a href="//arnweb.nl" target="new">McArn</a>.
</footer> </footer>
</body> </body>

170
package-lock.json generated
View File

@ -56,6 +56,11 @@
"strip-json-comments": "^3.1.1" "strip-json-comments": "^3.1.1"
} }
}, },
"@fortawesome/fontawesome-free": {
"version": "5.15.1",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.1.tgz",
"integrity": "sha512-OEdH7SyC1suTdhBGW91/zBfR6qaIhThbcN8PUXtXilY4GYnSBbVqOntdHbC1vXwsDnX0Qix2m2+DSU1J51ybOQ=="
},
"@types/component-emitter": { "@types/component-emitter": {
"version": "1.2.10", "version": "1.2.10",
"resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
@ -506,6 +511,16 @@
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
"integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
}, },
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"dev": true,
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"backo2": { "backo2": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
@ -760,6 +775,14 @@
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
}, },
"chainsaw": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.0.9.tgz",
"integrity": "sha1-EaBRAtHEx4W20EFdM21aOhYSkT4=",
"requires": {
"traverse": ">=0.3.0 <0.4"
}
},
"chalk": { "chalk": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
@ -1049,11 +1072,22 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
}, },
"cookie-storage": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/cookie-storage/-/cookie-storage-6.1.0.tgz",
"integrity": "sha512-HeVqbVy8BjXhAAuFtL6MTG+witHoLbxfky2jgVh9FmxmyL6IKa9gSSyPNjevXCCCxPu6Tzd9J8+eXTRQzYU/cg=="
},
"copy-descriptor": { "copy-descriptor": {
"version": "0.1.1", "version": "0.1.1",
"resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
}, },
"core-js": {
"version": "2.6.11",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
"dev": true
},
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@ -1940,21 +1974,10 @@
"version": "6.2.0", "version": "6.2.0",
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
"integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
"dev": true,
"requires": { "requires": {
"loader-utils": "^2.0.0", "loader-utils": "^2.0.0",
"schema-utils": "^3.0.0" "schema-utils": "^3.0.0"
},
"dependencies": {
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
}
} }
}, },
"fill-range": { "fill-range": {
@ -2371,6 +2394,14 @@
} }
} }
}, },
"hashish": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/hashish/-/hashish-0.0.4.tgz",
"integrity": "sha1-bWC8b/r3Ebav1g5CbQd5iAFOZVQ=",
"requires": {
"traverse": ">=0.2.4"
}
},
"hosted-git-info": { "hosted-git-info": {
"version": "2.8.8", "version": "2.8.8",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
@ -2676,6 +2707,12 @@
"is-extglob": "^2.1.1" "is-extglob": "^2.1.1"
} }
}, },
"is-in-browser": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz",
"integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=",
"dev": true
},
"is-negative-zero": { "is-negative-zero": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
@ -2889,6 +2926,17 @@
"verror": "1.10.0" "verror": "1.10.0"
} }
}, },
"jss": {
"version": "9.8.7",
"resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz",
"integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==",
"dev": true,
"requires": {
"is-in-browser": "^1.1.3",
"symbol-observable": "^1.1.0",
"warning": "^3.0.0"
}
},
"killable": { "killable": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
@ -2951,6 +2999,17 @@
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz",
"integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==" "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA=="
}, },
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"locate-path": { "locate-path": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@ -2969,6 +3028,15 @@
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz",
"integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==" "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ=="
}, },
"loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dev": true,
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"loud-rejection": { "loud-rejection": {
"version": "1.6.0", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
@ -3042,6 +3110,12 @@
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
}, },
"microbuffer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/microbuffer/-/microbuffer-1.0.0.tgz",
"integrity": "sha1-izgy7UDIfVH0e7I0kTppinVtGdI=",
"dev": true
},
"micromatch": { "micromatch": {
"version": "3.1.10", "version": "3.1.10",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
@ -3648,6 +3722,12 @@
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
}, },
"pako": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
"dev": true
},
"parent-module": { "parent-module": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@ -4038,6 +4118,12 @@
"resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
"integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==" "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w=="
}, },
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
"dev": true
},
"regex-not": { "regex-not": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
@ -4081,6 +4167,14 @@
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
"integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q=="
}, },
"remove": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/remove/-/remove-0.1.5.tgz",
"integrity": "sha1-CV/9gn1lyfQa2X0z5BanWBEHmVU=",
"requires": {
"seq": ">= 0.3.5"
}
},
"remove-trailing-separator": { "remove-trailing-separator": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
@ -4355,6 +4449,15 @@
} }
} }
}, },
"seq": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/seq/-/seq-0.3.5.tgz",
"integrity": "sha1-rgKvOkJHk9jMvyEtaRdODFTf/jg=",
"requires": {
"chainsaw": ">=0.0.7 <0.1",
"hashish": ">=0.0.2 <0.1"
}
},
"serialize-javascript": { "serialize-javascript": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
@ -4976,6 +5079,12 @@
"has-flag": "^3.0.0" "has-flag": "^3.0.0"
} }
}, },
"symbol-observable": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
"integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==",
"dev": true
},
"table": { "table": {
"version": "5.4.6", "version": "5.4.6",
"resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
@ -5124,6 +5233,11 @@
"punycode": "^2.1.1" "punycode": "^2.1.1"
} }
}, },
"traverse": {
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
"integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk="
},
"trim-newlines": { "trim-newlines": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
@ -5142,6 +5256,29 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
}, },
"ttf-loader": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/ttf-loader/-/ttf-loader-1.0.2.tgz",
"integrity": "sha512-IMlcqjkSxqfOD4UpPrJ+LGm98JQ5URDFami19mR7lfjNR1XAEoG93Xd3loGYUMSxuhfzSTxsnLXu8emIawx/6A==",
"dev": true,
"requires": {
"babel-runtime": "^6.26.0",
"jss": "^9.5.1",
"ttf2woff": "^2.0.1",
"uuid": "^3.2.1"
}
},
"ttf2woff": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/ttf2woff/-/ttf2woff-2.0.2.tgz",
"integrity": "sha512-X68badwBjAy/+itU49scLjXUL094up+rHuYk+YAOTTBYSUMOmLZ7VyhZJuqQESj1gnyLAC2/5V8Euv+mExmyPA==",
"dev": true,
"requires": {
"argparse": "^1.0.6",
"microbuffer": "^1.0.0",
"pako": "^1.0.0"
}
},
"tunnel-agent": { "tunnel-agent": {
"version": "0.6.0", "version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@ -5336,6 +5473,15 @@
"extsprintf": "^1.2.0" "extsprintf": "^1.2.0"
} }
}, },
"warning": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
"integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
"dev": true,
"requires": {
"loose-envify": "^1.0.0"
}
},
"watchpack": { "watchpack": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.1.tgz", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.1.tgz",

View File

@ -15,11 +15,13 @@
"author": "Arne van Iterson", "author": "Arne van Iterson",
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^5.15.1",
"cookie-storage": "^6.1.0",
"css-loader": "^5.0.1", "css-loader": "^5.0.1",
"eslint": "^7.12.1", "eslint": "^7.12.1",
"file-loader": "^6.2.0",
"jquery": "^3.5.1", "jquery": "^3.5.1",
"node-sass": "^5.0.0", "node-sass": "^5.0.0",
"remove": "^0.1.5",
"sass": "^1.29.0", "sass": "^1.29.0",
"sass-loader": "^10.0.5", "sass-loader": "^10.0.5",
"socket.io-client": "^3.0.0", "socket.io-client": "^3.0.0",
@ -27,5 +29,9 @@
"webpack": "^5.4.0", "webpack": "^5.4.0",
"webpack-cli": "^4.2.0", "webpack-cli": "^4.2.0",
"webpack-dev-server": "^3.11.0" "webpack-dev-server": "^3.11.0"
},
"devDependencies": {
"file-loader": "^6.2.0",
"ttf-loader": "^1.0.2"
} }
} }

BIN
res/fonts/alarm clock.ttf Normal file

Binary file not shown.

View File

@ -1,15 +1,19 @@
@font-face {
font-family: "Alarm Clock";
src: url("../res/fonts/alarm\ clock.ttf") format("truetype"),
}
body { body {
font-family: monospace; font-family: monospace;
padding: 2em; padding: 2em;
margin: 0; margin: 0;
background-color: #111111; background-color: #111111;
color: white; color: white;
// * {
// border: 1px solid white;
// }
h1 { h1 {
text-align: center; text-align: center;
} }
div#main { div#main {
height: 100%; height: 100%;
width: max-content; width: max-content;
@ -17,17 +21,22 @@ body {
grid-template-columns: auto auto; grid-template-columns: auto auto;
column-gap: 1em; column-gap: 1em;
margin: 0 auto; margin: 0 auto;
div { div {
padding: 1em; padding: 1em;
margin-bottom: 1em;
border-radius: 0.25em; border-radius: 0.25em;
background-color: #212121; background-color: #212121;
&#board { display: block;
div#board {
text-align: center; text-align: center;
width: min-content; width: min-content;
display: grid; display: grid;
grid-template-columns: auto auto auto auto auto auto auto auto auto auto auto auto auto auto auto;
column-gap: 3px; column-gap: 3px;
row-gap: 3px; row-gap: 3px;
margin-bottom: 0;
span.cell { span.cell {
color: white; color: white;
text-align: center; text-align: center;
@ -37,34 +46,64 @@ body {
border-radius: 0.1em; border-radius: 0.1em;
background-color: #303030; background-color: #303030;
font-size: large; font-size: large;
&.discovered { &.discovered {
background-color: #424242; background-color: #424242;
} }
&.bomb { &.bomb {
background-color: #FC5130; background-color: #FC5130;
} }
&.flag { &.flag {
background-color: #51CB20; background-color: #51CB20;
} }
} }
} }
&#log {
font-size: 12px;
width: 20vw;
h2 {
text-align: center;
} }
div:nth-of-type(2) {
min-width: 300px;
div {
margin-bottom: 0;
&#time {
span {
margin: 0 auto;
display: block;
text-align: center;
font-size: 5em;
font-family: "Alarm Clock";
}
}
&#register {
display: none;
}
&#log {
display: none;
font-size: 12px;
div {
max-height: 23rem;
overflow: auto;
span { span {
display: block; display: block;
width: 100%; width: 100%;
color: darkgray; color: darkgray;
padding-bottom: 0.5em; padding-bottom: 0.5em;
&.error { &.error {
color: red; color: red;
} }
&.alert { &.alert {
color: orange; color: orange;
} }
&.success { &.success {
color: cyan; color: cyan;
} }
@ -72,12 +111,19 @@ body {
} }
} }
} }
}
}
footer { footer {
position: absolute; position: sticky;
bottom: 1em; bottom: 0;
left: 1em; left: 1em;
color: darkgray; color: darkgray;
height: 1em; height: 1em;
background: #111111;
width: 100%;
padding: 1em;
a { a {
color: white; color: white;
} }

View File

@ -1,8 +1,11 @@
function log(message, type) { function log(message, type) {
var child = document.createElement("span"); var child = document.createElement("span");
child.innerHTML = "- " + message; child.innerHTML = "- " + String(message);
child.className = type; child.className = type;
document.getElementById("log").appendChild(child);
var log = document.querySelectorAll("div#log > div")[0];
log.appendChild(child);
log.scrollTo(0, log.scrollHeight);
} }
export default log; export default log;

View File

@ -1,7 +1,12 @@
/* eslint-disable no-unused-vars */ /* eslint-disable no-unused-vars */
import io from "socket.io-client"; import io from "socket.io-client";
import {
CookieStorage
} from "cookie-storage";
import log from "./log.js"; import log from "./log.js";
const cookie = new CookieStorage();
class Multiplayer { class Multiplayer {
constructor() { constructor() {
// Keep local and external players // Keep local and external players
@ -9,23 +14,43 @@ class Multiplayer {
this.connected = false; this.connected = false;
this.game; this.game;
this.cookie = cookie.getItem("ms99_usr");
if (this.cookie != null) {
log(`Using previous username ${this.cookie}, delete cookies for this site to reset.`, "alert");
this.connect(this.cookie);
} else {
this.register();
}
}
connect(username) {
// Show gamelog
document.querySelectorAll("div#log")[0].style.display = "block";
// Connect to TanksJS-Server instance // Connect to TanksJS-Server instance
log("Connecting to server..."); log("Connecting to server...");
this.socket = io("http://localhost:3000"); this.socket = io("http://localhost:3000/", {
reconnection: false
});
this.socket.on("connect_error", err => this.handleError(err));
this.socket.on("connect_failed", err => this.handleError(err));
this.socket.on("disconnect", err => this.handleError(err));
this.socket.on("identify", () => { this.socket.on("identify", () => {
this.socket.emit("identification", { this.socket.emit("identification", {
name: "Arn", name: username,
playersMax: 2, playersMax: 2,
gameID: "ms99" gameID: "ms99"
}); });
log(`Connected to server as ${this.socket.id}`, "success"); log(`Connected to server as ${username}`, "success");
console.log(this.socket);
this.connected = true; this.connected = true;
this.game.active = true;
}); });
// Handle player logins // Handle player logins
this.socket.on("roomUpdate", (data) => { this.socket.on("roomUpdate", (data) => {
console.log("roomUpdate"); console.log(data);
// Add any player that is not the local player and is not already added // Add any player that is not the local player and is not already added
for (const id in data) { for (const id in data) {
if (id != this.socket.id && this.players.indexOf(id)) { if (id != this.socket.id && this.players.indexOf(id)) {
@ -47,15 +72,35 @@ class Multiplayer {
// Handle player updates // Handle player updates
this.socket.on("update", (data) => { this.socket.on("update", (data) => {
console.log("update"); console.log(data);
}); });
// Start game // Start game
this.socket.on("gameStart", () => { this.socket.on("gameStart", () => {
console.log("gameStart"); console.log("gameStart");
this.game.active = true;
}); });
} }
register() {
var form = document.querySelectorAll("div#register > form")[0];
form.parentElement.style.display = "block";
form.addEventListener("submit", (e) => {
e.preventDefault();
form.parentElement.style.display = "none";
var username = String(form.querySelector("input[name=username]").value);
if (form.querySelector("input[name=store]").checked) {
cookie.setItem("ms99_usr", username);
}
this.connect(username);
});
}
handleError(error) {
log(error, "error");
}
setInstance(game) { setInstance(game) {
this.game = game; this.game = game;
log("Game instance initialized"); log("Game instance initialized");

View File

@ -1,11 +1,31 @@
/* eslint-disable no-unused-vars */ /* eslint-disable no-unused-vars */
import "../scss/index.scss"; import "../scss/index.scss";
import "../node_modules/@fortawesome/fontawesome-free/scss/fontawesome.scss";
import log from "./helpers/log.js"; import log from "./helpers/log.js";
import Game from "./screens/game.js"; import Game from "./screens/game.js";
import Multiplayer from "./helpers/multiplayer.js"; import Multiplayer from "./helpers/multiplayer.js";
["DOMContentLoaded", "resize"].forEach(evt =>
window.addEventListener(evt, (e) => {
var main = document.getElementById("main");
var info = main.children[1];
if (main.scrollWidth > window.innerWidth) {
main.style.display = "block";
info.style.maxWidth = "unset";
} else {
main.style.display = "grid";
info.style.maxWidth = "350px";
}
})
);
var board = document.getElementById("board"); var board = document.getElementById("board");
var mp = new Multiplayer(); var mp = new Multiplayer();
var game = new Game(board); var game = new Game(board);
mp.setInstance(game); mp.setInstance(game);
window.setInterval(function () {
game.update();
}, 1000);

View File

@ -5,16 +5,29 @@ class Game {
constructor(element) { constructor(element) {
this.board = element; this.board = element;
this.children = element.children; this.children = element.children;
this.colours = [
"#B8E5E5",
"#A9C6E5",
"#A79AE6",
"#CE8BE7",
"#E97DC1",
"#EB6D6E",
"#ED9B5C",
"#ECED4C"
];
this.active = false; this.active = false;
this.sides = 15; this.sides = 20;
this.size = Math.pow(this.sides, 2); this.size = Math.pow(this.sides, 2);
this.board.style.gridTemplateColumns = `repeat(${this.sides}, auto)`;
this.generated = false; this.generated = false;
this.bombAmount = 25; this.bombAmount = 60;
this.bombs = []; this.bombs = [];
this.discovered = []; this.discovered = [];
this.time = 60;
this.strikes = 3; this.strikes = 3;
for (let cell = 0; cell < this.size; cell++) { for (let cell = 0; cell < this.size; cell++) {
@ -35,14 +48,37 @@ class Game {
this.board.appendChild(child); this.board.appendChild(child);
} }
}
// for (let index = 0; index < this.bombAmount; index++) { update() {
// var rand = math.default.rand(0, this.size); if (this.active) {
// this.bombs[rand] = 1; if (this.time - 1 <= 0) {
// } this.gameOver();
} else {
this.time--;
this.drawTime();
}
}
}
console.log(this.bombs); drawTime() {
console.log(this.discovered); var minutes = 0;
while (this.time - 60 - (minutes * 60) >= 0) {
minutes++;
}
var seconds = this.time - (minutes * 60);
if (minutes < 10) {
minutes = String("0" + minutes);
}
if (seconds < 10) {
seconds = String("0" + seconds);
}
var timer = document.getElementById("time").children[1];
timer.innerHTML = String(minutes + ":" + seconds);
} }
discover(cell) { discover(cell) {
@ -99,7 +135,7 @@ class Game {
if (!limit.bottom) { if (!limit.bottom) {
surrounds.push(cell + this.sides + 1); surrounds.push(cell + this.sides + 1);
} }
} else if ((cell + 1) % this.sides === 0 ) { } else if ((cell + 1) % this.sides === 0) {
// Cell is on the right side of the map // Cell is on the right side of the map
surrounds.push(cell - 1); surrounds.push(cell - 1);
if (!limit.top) { if (!limit.top) {
@ -138,28 +174,39 @@ class Game {
} }
}); });
} else { } else {
this.children[cell].style.color = this.colours[value];
this.children[cell].innerHTML = String(value); this.children[cell].innerHTML = String(value);
} }
} }
} }
flag(cell) { flag(cell) {
if (this.active) {
if (this.bombs[cell]) { if (this.bombs[cell]) {
if (!this.discovered[cell]) {
this.discovered[cell] = 1;
this.children[cell].innerHTML = "#"; this.children[cell].innerHTML = "#";
this.children[cell].classList.add("flag"); this.children[cell].classList.add("flag");
this.bombAmount--; this.bombAmount--;
log(`Correctly flagged. ${String(this.bombAmount)} bombs left!`);
} else { this.time = this.time + 10;
if (this.strikes - 1 == 0) { this.drawTime();
this.gameOver();
return; if (this.bombAmount == 0) {
} else { log("You have cleared all bombs!", "success");
this.strikes--; this.active = false;
log(`Incorrectly flagged. ${String(this.strikes)} strikes left!`, "alert");
} }
}
} else {
if (!this.discovered[cell]) {
this.time = this.time - 30;
this.drawTime();
this.discover(cell); this.discover(cell);
} }
} }
}
}
gameOver() { gameOver() {
log("Game over", "error"); log("Game over", "error");

View File

@ -1,6 +1,7 @@
module.exports = { module.exports = {
module: { module: {
rules: [{ rules: [
{
test: /\.s[ac]ss$/i, test: /\.s[ac]ss$/i,
use: [ use: [
// Creates `style` nodes from JS strings // Creates `style` nodes from JS strings
@ -10,6 +11,17 @@ module.exports = {
// Compiles Sass to CSS // Compiles Sass to CSS
"sass-loader", "sass-loader",
], ],
}, ] },
{
test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
use: [{
loader: "file-loader",
options: {
name: "[name].[ext]",
outputPath: "res/fonts/"
}
}]
}
]
} }
}; };