From a1e6661249eccd07196270f325eae00f4c0f50a0 Mon Sep 17 00:00:00 2001 From: s3lph Date: Sun, 31 Oct 2021 14:44:14 +0100 Subject: [PATCH] Initial commit --- .gitignore | 5 + requirements.txt | 5 + setup.py | 39 + static/carcassonne-pasture.jpg | Bin 0 -> 246689 bytes static/script.js | 17 + static/set.js | 60 ++ static/style.css | 144 ++++ static/sudoku.js | 0 templates/carcassonne/001.svg | 6 + templates/carcassonne/011.svg | 7 + templates/carcassonne/021.svg | 5 + templates/carcassonne/022.svg | 5 + templates/carcassonne/031.svg | 9 + templates/carcassonne/041.svg | 11 + templates/carcassonne/101.svg | 5 + templates/carcassonne/121.svg | 6 + templates/carcassonne/122.svg | 6 + templates/carcassonne/123.svg | 6 + templates/carcassonne/131.svg | 10 + templates/carcassonne/201.svg | 5 + templates/carcassonne/202.svg | 8 + templates/carcassonne/203.svg | 6 + templates/carcassonne/204.svg | 7 + templates/carcassonne/205.svg | 7 + templates/carcassonne/206.svg | 7 + templates/carcassonne/221.svg | 8 + templates/carcassonne/222.svg | 9 + templates/carcassonne/301.svg | 6 + templates/carcassonne/302.svg | 7 + templates/carcassonne/311.svg | 8 + templates/carcassonne/312.svg | 9 + templates/carcassonne/401.svg | 6 + templates/carcassonne/carcassonne.html.j2 | 161 ++++ templates/carcassonne/defense.svg | 3 + templates/carcassonne/empty.svg | 4 + templates/carcassonne/field.svg | 14 + templates/carcassonne/follower.svg | 3 + templates/carcassonne/follower_pasture.svg | 3 + templates/carcassonne/he-001.svg | 7 + templates/carcassonne/he-011.svg | 8 + templates/carcassonne/he-021.svg | 11 + templates/carcassonne/he-101.svg | 8 + templates/carcassonne/he-111.svg | 9 + templates/carcassonne/ic-021-inn.svg | 8 + templates/carcassonne/ic-021-monastery.svg | 9 + templates/carcassonne/ic-022-inn.svg | 8 + templates/carcassonne/ic-031-inn.svg | 12 + templates/carcassonne/ic-041.svg | 7 + templates/carcassonne/ic-101-branch.svg | 5 + templates/carcassonne/ic-101-road.svg | 6 + templates/carcassonne/ic-122-inn.svg | 11 + templates/carcassonne/ic-202-roads.svg | 12 + templates/carcassonne/ic-203-road-inn.svg | 11 + templates/carcassonne/ic-203-road.svg | 8 + templates/carcassonne/ic-221-crossing.svg | 12 + templates/carcassonne/ic-222-inn.svg | 12 + templates/carcassonne/ic-301-split.svg | 6 + templates/carcassonne/ic-302.svg | 6 + templates/carcassonne/ic-401-cathedral.svg | 6 + templates/carcassonne/ic-401-pasture.svg | 7 + templates/carcassonne/r2-city.svg | 8 + templates/carcassonne/r2-citybridge.svg | 9 + templates/carcassonne/r2-curve.svg | 7 + templates/carcassonne/r2-fork.svg | 8 + templates/carcassonne/r2-lake.svg | 7 + templates/carcassonne/r2-lake2.svg | 9 + templates/carcassonne/r2-monastery.svg | 8 + templates/carcassonne/r2-road.svg | 15 + templates/carcassonne/r2-road2.svg | 9 + templates/carcassonne/r2-roadcity.svg | 13 + templates/carcassonne/r2-source.svg | 6 + templates/cwa/base.html.j2 | 13 + templates/cwa/set.html.j2 | 58 ++ templates/cwa/setcard.svg.j2 | 50 ++ templates/cwa/sudoku.html.j2 | 68 ++ templates/cwa/welcome.html.j2 | 15 + templates/cwa/welcome1.html.j2 | 20 + templates/cwa/welcome2.html.j2 | 29 + templates/cwa/welcome3.html.j2 | 15 + templates/sudoku.example.html | 658 +++++++++++++++ templates/sudoku.html | 55 ++ webgames/__init__.py | 2 + webgames/__main__.py | 165 ++++ webgames/api.py | 184 +++++ webgames/carcassonne.py | 910 +++++++++++++++++++++ webgames/game.py | 105 +++ webgames/human.py | 57 ++ webgames/player.py | 23 + webgames/puzzle.py | 50 ++ webgames/set_puzzle.py | 206 +++++ webgames/sudoku_puzzle.py | 169 ++++ 91 files changed, 3767 insertions(+) create mode 100644 .gitignore create mode 100644 requirements.txt create mode 100755 setup.py create mode 100644 static/carcassonne-pasture.jpg create mode 100644 static/script.js create mode 100644 static/set.js create mode 100644 static/style.css create mode 100644 static/sudoku.js create mode 100644 templates/carcassonne/001.svg create mode 100644 templates/carcassonne/011.svg create mode 100644 templates/carcassonne/021.svg create mode 100644 templates/carcassonne/022.svg create mode 100644 templates/carcassonne/031.svg create mode 100644 templates/carcassonne/041.svg create mode 100644 templates/carcassonne/101.svg create mode 100644 templates/carcassonne/121.svg create mode 100644 templates/carcassonne/122.svg create mode 100644 templates/carcassonne/123.svg create mode 100644 templates/carcassonne/131.svg create mode 100644 templates/carcassonne/201.svg create mode 100644 templates/carcassonne/202.svg create mode 100644 templates/carcassonne/203.svg create mode 100644 templates/carcassonne/204.svg create mode 100644 templates/carcassonne/205.svg create mode 100644 templates/carcassonne/206.svg create mode 100644 templates/carcassonne/221.svg create mode 100644 templates/carcassonne/222.svg create mode 100644 templates/carcassonne/301.svg create mode 100644 templates/carcassonne/302.svg create mode 100644 templates/carcassonne/311.svg create mode 100644 templates/carcassonne/312.svg create mode 100644 templates/carcassonne/401.svg create mode 100644 templates/carcassonne/carcassonne.html.j2 create mode 100644 templates/carcassonne/defense.svg create mode 100644 templates/carcassonne/empty.svg create mode 100644 templates/carcassonne/field.svg create mode 100644 templates/carcassonne/follower.svg create mode 100644 templates/carcassonne/follower_pasture.svg create mode 100644 templates/carcassonne/he-001.svg create mode 100644 templates/carcassonne/he-011.svg create mode 100644 templates/carcassonne/he-021.svg create mode 100644 templates/carcassonne/he-101.svg create mode 100644 templates/carcassonne/he-111.svg create mode 100644 templates/carcassonne/ic-021-inn.svg create mode 100644 templates/carcassonne/ic-021-monastery.svg create mode 100644 templates/carcassonne/ic-022-inn.svg create mode 100644 templates/carcassonne/ic-031-inn.svg create mode 100644 templates/carcassonne/ic-041.svg create mode 100644 templates/carcassonne/ic-101-branch.svg create mode 100644 templates/carcassonne/ic-101-road.svg create mode 100644 templates/carcassonne/ic-122-inn.svg create mode 100644 templates/carcassonne/ic-202-roads.svg create mode 100644 templates/carcassonne/ic-203-road-inn.svg create mode 100644 templates/carcassonne/ic-203-road.svg create mode 100644 templates/carcassonne/ic-221-crossing.svg create mode 100644 templates/carcassonne/ic-222-inn.svg create mode 100644 templates/carcassonne/ic-301-split.svg create mode 100644 templates/carcassonne/ic-302.svg create mode 100644 templates/carcassonne/ic-401-cathedral.svg create mode 100644 templates/carcassonne/ic-401-pasture.svg create mode 100644 templates/carcassonne/r2-city.svg create mode 100644 templates/carcassonne/r2-citybridge.svg create mode 100644 templates/carcassonne/r2-curve.svg create mode 100644 templates/carcassonne/r2-fork.svg create mode 100644 templates/carcassonne/r2-lake.svg create mode 100644 templates/carcassonne/r2-lake2.svg create mode 100644 templates/carcassonne/r2-monastery.svg create mode 100644 templates/carcassonne/r2-road.svg create mode 100644 templates/carcassonne/r2-road2.svg create mode 100644 templates/carcassonne/r2-roadcity.svg create mode 100644 templates/carcassonne/r2-source.svg create mode 100644 templates/cwa/base.html.j2 create mode 100644 templates/cwa/set.html.j2 create mode 100644 templates/cwa/setcard.svg.j2 create mode 100644 templates/cwa/sudoku.html.j2 create mode 100644 templates/cwa/welcome.html.j2 create mode 100644 templates/cwa/welcome1.html.j2 create mode 100644 templates/cwa/welcome2.html.j2 create mode 100644 templates/cwa/welcome3.html.j2 create mode 100644 templates/sudoku.example.html create mode 100644 templates/sudoku.html create mode 100644 webgames/__init__.py create mode 100644 webgames/__main__.py create mode 100644 webgames/api.py create mode 100644 webgames/carcassonne.py create mode 100644 webgames/game.py create mode 100644 webgames/human.py create mode 100644 webgames/player.py create mode 100644 webgames/puzzle.py create mode 100644 webgames/set_puzzle.py create mode 100644 webgames/sudoku_puzzle.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6cf2306 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +**/__pycache__/ +*.pyc +**/*.egg-info/ +*.coverage +**/.mypy_cache/ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f948e5f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +jinja3 +bottle +sudoku-manager +sudokugen +namesgenerator diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..d73f5d6 --- /dev/null +++ b/setup.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +from setuptools import setup, find_packages + +from webgames import __version__ + +setup( + name='webgames', + version=__version__, + author='s3lph', + author_email='', + description='', + license='MIT', + keywords='games,multiplayer,web', + url='', + packages=find_packages(exclude=['*.test']), + long_description='', + python_requires='>=3.6', + install_requires=[ + 'jinja2==2.11.1', + 'bottle==0.12.18', + 'sudoku-manager==1.0.6', + 'sudokugen==0.2.1', + 'namesgenerator==0.3' + ], + entry_points={ + 'console_scripts': [ + 'webgames = webgames:main' + ] + }, + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Environment :: Web Environment', + 'Framework :: Bottle', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: MIT License', + 'Topic :: Games/Entertainment :: Puzzle Games' + ], +) diff --git a/static/carcassonne-pasture.jpg b/static/carcassonne-pasture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..511d6054060c932ac71a67d75db48b7d9a46bc5d GIT binary patch literal 246689 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≪4{mVsU&qVdu#Jk`$3SoietFTlG759JYLFgA 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 z%0D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 Qtv~aq`QLu>zrXeW09+J&ssI20 literal 0 HcmV?d00001 diff --git a/static/script.js b/static/script.js new file mode 100644 index 0000000..590af6e --- /dev/null +++ b/static/script.js @@ -0,0 +1,17 @@ + +document.getElementById('joinurl').addEventListener('click',(e) => { + var url = document.getElementById('joinurl'); + var sel = window.getSelection(); + var range = document.createRange(); + range.selectNodeContents(url); + sel.removeAllRanges(); + sel.addRange(range); + if (document.execCommand('copy') === true) { + url.classList.add('copied'); + setTimeout(() => { + url.classList.remove('copied'); + }, 0); + + } + sel.removeAllRanges(); +}); diff --git a/static/set.js b/static/set.js new file mode 100644 index 0000000..b27562a --- /dev/null +++ b/static/set.js @@ -0,0 +1,60 @@ + +function cardsEqual(a, b) { + return a.getAttribute('data-color') === b.getAttribute('data-color') + && a.getAttribute('data-shape') === b.getAttribute('data-shape') + && a.getAttribute('data-count') === b.getAttribute('data-count') + && a.getAttribute('data-infill') === b.getAttribute('data-infill'); +} + +function replaceCard(a, b) { + a.innerHTML = b.innerHTML; + a.setAttribute('data-color', b.getAttribute('data-color')); + a.setAttribute('data-shape', b.getAttribute('data-shape')); + a.setAttribute('data-count', b.getAttribute('data-count')); + a.setAttribute('data-infill', b.getAttribute('data-infill')); +} + +function markNewCard(card) { + card.classList.add('new'); + setTimeout(() => { + card.classList.remove('new'); + }, 3000); +} + +function update() { + var req = new XMLHttpRequest(); + req.addEventListener('load', (ev) => { + var parser = new DOMParser(); + var doc = parser.parseFromString(req.responseText, 'text/html'); + // Replace playing field cards + var field = document.getElementById('playingfield'); + var aNodes = Array.from(field.children); + var bNodes = Array.from(doc.getElementById('playingfield').children); + for (var i = 0; i < Math.min(aNodes.length, bNodes.length); ++i) { + if (!cardsEqual(aNodes[i], bNodes[i])) { + replaceCard(aNodes[i], bNodes[i]); + markNewCard(aNodes[i]); + } + } + if (bNodes.length < aNodes.length) { + for (var i = bNodes.length; i < aNodes.length; ++i) { + aNodes[i].remove(); + } + } + if (bNodes.length > aNodes.length) { + for (var i = aNodes.length; i < bNodes.length; ++i) { + field.appendChild(bNodes[i]); + markNewCard(bNodes[i]); + } + } + // Replace gamestats and scores + document.getElementById('gamestats').innerHTML = + doc.getElementById('gamestats').innerHTML; + document.getElementById('scorelist').innerHTML = + doc.getElementById('scorelist').innerHTML; + }); + req.open('GET', window.location.href); + req.send(); +} + +setInterval(update, 500); diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..6710686 --- /dev/null +++ b/static/style.css @@ -0,0 +1,144 @@ + +html, body { + padding: 0; + margin: 0; + background: #999999; + font-family: sans-serif; +} + +main { + width: 1200px; + left: 0; + right: 0; + margin: auto; +} + +code#joinurl { + cursor: pointer; + position: relative; +} + +code#joinurl::after { + content: "Copied!"; + text-align: center; + font-family: sans-serif; + font-weight: bold; + pointer-events: none; + position: absolute; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; + background: #ffffff; + opacity: 0; + transition: opacity 1s; +} + +code#joinurl.copied::after { + opacity: 1; + transition: opacity 0s; +} + +/* + * SUDOKU + */ + +table, td { + border: 1px solid black; + border-collapse: collapse; + padding: 0; + background: white; + text-align: center; +} + +tr.row-1 > td { + border-top: 3px solid black; +} + +tr.row-3 > td, tr.row-6 > td, tr.row-9 > td { + border-bottom: 3px solid black; +} + +td.col-1 { + border-left: 3px solid black; +} + +td.col-3, td.col-6, td.col-9 { + border-right: 3px solid black; +} + +input.sudoku-field:checked + label.sudoku-field { + background: #aaaaff; +} + +input.sudoku-field { + display: none; +} + +label.sudoku-field { + display: inline-block; + width: 45px; + height: 45px; + font-size: 2em; + margin: 0; + line-height: 45px; +} + +label.sudoku-field-original { + background: #aaffaa; +} + +input.fill { + width: 100% !important; +} + +#sudoku-input input { + width: 45px; + height: 45px; + font-size: 2em; +} + + + +/* + * SET + */ + +#playingfield { + display: flex; + flex-direction: column; + flex-wrap: wrap; + align-content: flex-start; + max-height: 700px; +} + +#playingfield .card > input { + display: none; +} + +#playingfield .card.new > label #card { + filter: url(#new); +} + +#playingfield .card > input:checked ~ label #card { + filter: url(#drop); +} +#playingfield .card > input:checked ~ label .svgcard { + transform: rotate(5deg); + transform-origin: 70px 100px; +} + +.playercardlist .card { + display: inline-block; + margin-right: -120px; +} + +.playercardlist .playercard-0 { + transform: rotate(-10deg) scale(0.5); +} +.playercardlist .playercard-1 { + transform: scale(0.5); +} +.playercardlist .playercard-2 { + transform: rotate(10deg) scale(0.5) translate(0px, 10px); +} diff --git a/static/sudoku.js b/static/sudoku.js new file mode 100644 index 0000000..e69de29 diff --git a/templates/carcassonne/001.svg b/templates/carcassonne/001.svg new file mode 100644 index 0000000..64791ed --- /dev/null +++ b/templates/carcassonne/001.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/templates/carcassonne/011.svg b/templates/carcassonne/011.svg new file mode 100644 index 0000000..f008d11 --- /dev/null +++ b/templates/carcassonne/011.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/templates/carcassonne/021.svg b/templates/carcassonne/021.svg new file mode 100644 index 0000000..7a31d4a --- /dev/null +++ b/templates/carcassonne/021.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/templates/carcassonne/022.svg b/templates/carcassonne/022.svg new file mode 100644 index 0000000..0ff5d75 --- /dev/null +++ b/templates/carcassonne/022.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/templates/carcassonne/031.svg b/templates/carcassonne/031.svg new file mode 100644 index 0000000..b6efac0 --- /dev/null +++ b/templates/carcassonne/031.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/templates/carcassonne/041.svg b/templates/carcassonne/041.svg new file mode 100644 index 0000000..c34fa29 --- /dev/null +++ b/templates/carcassonne/041.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/templates/carcassonne/101.svg b/templates/carcassonne/101.svg new file mode 100644 index 0000000..bb18838 --- /dev/null +++ b/templates/carcassonne/101.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/templates/carcassonne/121.svg b/templates/carcassonne/121.svg new file mode 100644 index 0000000..cd96855 --- /dev/null +++ b/templates/carcassonne/121.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/templates/carcassonne/122.svg b/templates/carcassonne/122.svg new file mode 100644 index 0000000..a00df82 --- /dev/null +++ b/templates/carcassonne/122.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/templates/carcassonne/123.svg b/templates/carcassonne/123.svg new file mode 100644 index 0000000..9e648d0 --- /dev/null +++ b/templates/carcassonne/123.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/templates/carcassonne/131.svg b/templates/carcassonne/131.svg new file mode 100644 index 0000000..26a9ee1 --- /dev/null +++ b/templates/carcassonne/131.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/templates/carcassonne/201.svg b/templates/carcassonne/201.svg new file mode 100644 index 0000000..8df877a --- /dev/null +++ b/templates/carcassonne/201.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/templates/carcassonne/202.svg b/templates/carcassonne/202.svg new file mode 100644 index 0000000..a51e569 --- /dev/null +++ b/templates/carcassonne/202.svg @@ -0,0 +1,8 @@ + + + + + + {% include "carcassonne/defense.svg" %} + + diff --git a/templates/carcassonne/203.svg b/templates/carcassonne/203.svg new file mode 100644 index 0000000..c69fece --- /dev/null +++ b/templates/carcassonne/203.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/templates/carcassonne/204.svg b/templates/carcassonne/204.svg new file mode 100644 index 0000000..8e296ac --- /dev/null +++ b/templates/carcassonne/204.svg @@ -0,0 +1,7 @@ + + + + + {% include "carcassonne/defense.svg" %} + + diff --git a/templates/carcassonne/205.svg b/templates/carcassonne/205.svg new file mode 100644 index 0000000..92c0b45 --- /dev/null +++ b/templates/carcassonne/205.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/templates/carcassonne/206.svg b/templates/carcassonne/206.svg new file mode 100644 index 0000000..3ae83dc --- /dev/null +++ b/templates/carcassonne/206.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/templates/carcassonne/221.svg b/templates/carcassonne/221.svg new file mode 100644 index 0000000..69dd8e3 --- /dev/null +++ b/templates/carcassonne/221.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/templates/carcassonne/222.svg b/templates/carcassonne/222.svg new file mode 100644 index 0000000..dbb599e --- /dev/null +++ b/templates/carcassonne/222.svg @@ -0,0 +1,9 @@ + + + + + + + {% include "carcassonne/defense.svg" %} + + diff --git a/templates/carcassonne/301.svg b/templates/carcassonne/301.svg new file mode 100644 index 0000000..b624c34 --- /dev/null +++ b/templates/carcassonne/301.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/templates/carcassonne/302.svg b/templates/carcassonne/302.svg new file mode 100644 index 0000000..1c41852 --- /dev/null +++ b/templates/carcassonne/302.svg @@ -0,0 +1,7 @@ + + + + + {% include "carcassonne/defense.svg" %} + + diff --git a/templates/carcassonne/311.svg b/templates/carcassonne/311.svg new file mode 100644 index 0000000..a779a2e --- /dev/null +++ b/templates/carcassonne/311.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/templates/carcassonne/312.svg b/templates/carcassonne/312.svg new file mode 100644 index 0000000..a4f9fe6 --- /dev/null +++ b/templates/carcassonne/312.svg @@ -0,0 +1,9 @@ + + + + + + + {% include "carcassonne/defense.svg" %} + + diff --git a/templates/carcassonne/401.svg b/templates/carcassonne/401.svg new file mode 100644 index 0000000..093a893 --- /dev/null +++ b/templates/carcassonne/401.svg @@ -0,0 +1,6 @@ + + + + {% include "carcassonne/defense.svg" %} + + diff --git a/templates/carcassonne/carcassonne.html.j2 b/templates/carcassonne/carcassonne.html.j2 new file mode 100644 index 0000000..6fe57eb --- /dev/null +++ b/templates/carcassonne/carcassonne.html.j2 @@ -0,0 +1,161 @@ + + + +{% if not done %} + +{% endif %} + + + + {{ field }} + {% if done %} + Game Over! Return to lobby + {% else %} + {% if current_player.uuid == me.uuid %} + It is your turn! + {% if phase == 'place' %}Place your tile{% else %}Claim your resource{% endif %} +

+ {% if phase == 'place' %} + + {{ card }} + + + + + {% endif %} + {% if phase == 'claim' %} + + + {% endif %} + + + {% else %} + It is {{ game._players[current_player.uuid].name }}'s turn. + {% endif %} + {% endif %} + + + {% for player in players | sort(attribute='score', reverse=true) %} + + + + + + {% endfor %} +
NameFollowersScore
{{ game._players[player.uuid].name }}{{ player.followers | selectattr('resource', 'none') | list | length }}{{ player.score }}
+ Deck: {{ deck | length }} + + diff --git a/templates/carcassonne/defense.svg b/templates/carcassonne/defense.svg new file mode 100644 index 0000000..8c02d4f --- /dev/null +++ b/templates/carcassonne/defense.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/templates/carcassonne/empty.svg b/templates/carcassonne/empty.svg new file mode 100644 index 0000000..f5cf876 --- /dev/null +++ b/templates/carcassonne/empty.svg @@ -0,0 +1,4 @@ + + + + diff --git a/templates/carcassonne/field.svg b/templates/carcassonne/field.svg new file mode 100644 index 0000000..5469f0c --- /dev/null +++ b/templates/carcassonne/field.svg @@ -0,0 +1,14 @@ + + {% for card in cards %} + {{ card }} + {% endfor %} + {% for empty in empties %} + + + + + {% endfor %} + {% for follower in follows %} + {{ follower }} + {% endfor %} + \ No newline at end of file diff --git a/templates/carcassonne/follower.svg b/templates/carcassonne/follower.svg new file mode 100644 index 0000000..3859555 --- /dev/null +++ b/templates/carcassonne/follower.svg @@ -0,0 +1,3 @@ + + + diff --git a/templates/carcassonne/follower_pasture.svg b/templates/carcassonne/follower_pasture.svg new file mode 100644 index 0000000..3bae738 --- /dev/null +++ b/templates/carcassonne/follower_pasture.svg @@ -0,0 +1,3 @@ + + + diff --git a/templates/carcassonne/he-001.svg b/templates/carcassonne/he-001.svg new file mode 100644 index 0000000..391274a --- /dev/null +++ b/templates/carcassonne/he-001.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/templates/carcassonne/he-011.svg b/templates/carcassonne/he-011.svg new file mode 100644 index 0000000..b430f65 --- /dev/null +++ b/templates/carcassonne/he-011.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/templates/carcassonne/he-021.svg b/templates/carcassonne/he-021.svg new file mode 100644 index 0000000..82f8023 --- /dev/null +++ b/templates/carcassonne/he-021.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/templates/carcassonne/he-101.svg b/templates/carcassonne/he-101.svg new file mode 100644 index 0000000..3555a15 --- /dev/null +++ b/templates/carcassonne/he-101.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/templates/carcassonne/he-111.svg b/templates/carcassonne/he-111.svg new file mode 100644 index 0000000..32e2eef --- /dev/null +++ b/templates/carcassonne/he-111.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/templates/carcassonne/ic-021-inn.svg b/templates/carcassonne/ic-021-inn.svg new file mode 100644 index 0000000..d2aa83b --- /dev/null +++ b/templates/carcassonne/ic-021-inn.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/templates/carcassonne/ic-021-monastery.svg b/templates/carcassonne/ic-021-monastery.svg new file mode 100644 index 0000000..fbe5fd3 --- /dev/null +++ b/templates/carcassonne/ic-021-monastery.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/templates/carcassonne/ic-022-inn.svg b/templates/carcassonne/ic-022-inn.svg new file mode 100644 index 0000000..2554bae --- /dev/null +++ b/templates/carcassonne/ic-022-inn.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/templates/carcassonne/ic-031-inn.svg b/templates/carcassonne/ic-031-inn.svg new file mode 100644 index 0000000..e3a3849 --- /dev/null +++ b/templates/carcassonne/ic-031-inn.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/templates/carcassonne/ic-041.svg b/templates/carcassonne/ic-041.svg new file mode 100644 index 0000000..ee567a4 --- /dev/null +++ b/templates/carcassonne/ic-041.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/templates/carcassonne/ic-101-branch.svg b/templates/carcassonne/ic-101-branch.svg new file mode 100644 index 0000000..a19a723 --- /dev/null +++ b/templates/carcassonne/ic-101-branch.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/templates/carcassonne/ic-101-road.svg b/templates/carcassonne/ic-101-road.svg new file mode 100644 index 0000000..5409343 --- /dev/null +++ b/templates/carcassonne/ic-101-road.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/templates/carcassonne/ic-122-inn.svg b/templates/carcassonne/ic-122-inn.svg new file mode 100644 index 0000000..f43a6b4 --- /dev/null +++ b/templates/carcassonne/ic-122-inn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/templates/carcassonne/ic-202-roads.svg b/templates/carcassonne/ic-202-roads.svg new file mode 100644 index 0000000..1c4034d --- /dev/null +++ b/templates/carcassonne/ic-202-roads.svg @@ -0,0 +1,12 @@ + + + + + + + + + + {% include "carcassonne/defense.svg" %} + + diff --git a/templates/carcassonne/ic-203-road-inn.svg b/templates/carcassonne/ic-203-road-inn.svg new file mode 100644 index 0000000..89727b1 --- /dev/null +++ b/templates/carcassonne/ic-203-road-inn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/templates/carcassonne/ic-203-road.svg b/templates/carcassonne/ic-203-road.svg new file mode 100644 index 0000000..b1d522f --- /dev/null +++ b/templates/carcassonne/ic-203-road.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/templates/carcassonne/ic-221-crossing.svg b/templates/carcassonne/ic-221-crossing.svg new file mode 100644 index 0000000..4c78a7d --- /dev/null +++ b/templates/carcassonne/ic-221-crossing.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/templates/carcassonne/ic-222-inn.svg b/templates/carcassonne/ic-222-inn.svg new file mode 100644 index 0000000..0b1815e --- /dev/null +++ b/templates/carcassonne/ic-222-inn.svg @@ -0,0 +1,12 @@ + + + + + + + + + + {% include "carcassonne/defense.svg" %} + + diff --git a/templates/carcassonne/ic-301-split.svg b/templates/carcassonne/ic-301-split.svg new file mode 100644 index 0000000..d595455 --- /dev/null +++ b/templates/carcassonne/ic-301-split.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/templates/carcassonne/ic-302.svg b/templates/carcassonne/ic-302.svg new file mode 100644 index 0000000..c37b45c --- /dev/null +++ b/templates/carcassonne/ic-302.svg @@ -0,0 +1,6 @@ + + + + + {% include "carcassonne/defense.svg" %} + diff --git a/templates/carcassonne/ic-401-cathedral.svg b/templates/carcassonne/ic-401-cathedral.svg new file mode 100644 index 0000000..b41330a --- /dev/null +++ b/templates/carcassonne/ic-401-cathedral.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/templates/carcassonne/ic-401-pasture.svg b/templates/carcassonne/ic-401-pasture.svg new file mode 100644 index 0000000..963667c --- /dev/null +++ b/templates/carcassonne/ic-401-pasture.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/templates/carcassonne/r2-city.svg b/templates/carcassonne/r2-city.svg new file mode 100644 index 0000000..977781b --- /dev/null +++ b/templates/carcassonne/r2-city.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/templates/carcassonne/r2-citybridge.svg b/templates/carcassonne/r2-citybridge.svg new file mode 100644 index 0000000..38f7de2 --- /dev/null +++ b/templates/carcassonne/r2-citybridge.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/templates/carcassonne/r2-curve.svg b/templates/carcassonne/r2-curve.svg new file mode 100644 index 0000000..fdd1299 --- /dev/null +++ b/templates/carcassonne/r2-curve.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/templates/carcassonne/r2-fork.svg b/templates/carcassonne/r2-fork.svg new file mode 100644 index 0000000..1acbd89 --- /dev/null +++ b/templates/carcassonne/r2-fork.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/templates/carcassonne/r2-lake.svg b/templates/carcassonne/r2-lake.svg new file mode 100644 index 0000000..29ed058 --- /dev/null +++ b/templates/carcassonne/r2-lake.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/templates/carcassonne/r2-lake2.svg b/templates/carcassonne/r2-lake2.svg new file mode 100644 index 0000000..ef67060 --- /dev/null +++ b/templates/carcassonne/r2-lake2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/templates/carcassonne/r2-monastery.svg b/templates/carcassonne/r2-monastery.svg new file mode 100644 index 0000000..4d5419e --- /dev/null +++ b/templates/carcassonne/r2-monastery.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/templates/carcassonne/r2-road.svg b/templates/carcassonne/r2-road.svg new file mode 100644 index 0000000..c99a1ec --- /dev/null +++ b/templates/carcassonne/r2-road.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/templates/carcassonne/r2-road2.svg b/templates/carcassonne/r2-road2.svg new file mode 100644 index 0000000..5b16c0b --- /dev/null +++ b/templates/carcassonne/r2-road2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/templates/carcassonne/r2-roadcity.svg b/templates/carcassonne/r2-roadcity.svg new file mode 100644 index 0000000..3d1fca0 --- /dev/null +++ b/templates/carcassonne/r2-roadcity.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/templates/carcassonne/r2-source.svg b/templates/carcassonne/r2-source.svg new file mode 100644 index 0000000..82d1d94 --- /dev/null +++ b/templates/carcassonne/r2-source.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/templates/cwa/base.html.j2 b/templates/cwa/base.html.j2 new file mode 100644 index 0000000..2530a88 --- /dev/null +++ b/templates/cwa/base.html.j2 @@ -0,0 +1,13 @@ + + + + + + Game + + + + {%- block body %} + {%- endblock %} + + diff --git a/templates/cwa/set.html.j2 b/templates/cwa/set.html.j2 new file mode 100644 index 0000000..0a0a331 --- /dev/null +++ b/templates/cwa/set.html.j2 @@ -0,0 +1,58 @@ +{% extends 'cwa/base.html.j2' %} + +{%- block body %} +

Set: {{ game.human_id }}

+ +
+ +
+ {%- for card in cards %} + +
+ + +
+ {%- endfor %} + +
+ + + +

+ {%- if game.puzzle.is_completed %} + Game Over Return to lobby + {%- else %} + Draw votes: {{ draw_votes }} / {{ draw_majority }} + Deck: {{ deck | length }} + {% endif %} +

+ +
+ +

Scores

+
    + {%- for score in game.scoreboard %} +
  1. + {{ game.players[score['player']].name }} + {{ score['score'] }} +
    + {%- for symbol in lastset[score['player']] %} +
    + {%- include 'cwa/setcard.svg.j2' %} +
    + {%- endfor %} +
    +
  2. + {%- endfor %} +
+ Refresh + + +{%- endblock %} diff --git a/templates/cwa/setcard.svg.j2 b/templates/cwa/setcard.svg.j2 new file mode 100644 index 0000000..662a64f --- /dev/null +++ b/templates/cwa/setcard.svg.j2 @@ -0,0 +1,50 @@ + +{%- macro fill(symbol) -%} + {%- if symbol.infill == Infill.NONE -%} + none + {%- elif symbol.infill == Infill.SEMI -%} + url(#semifill-{{ symbol.color.value.name }}) + {%- elif symbol.infill == Infill.FULL -%} + {{- symbol.color.value.html -}} + {%- endif -%} +{%- endmacro -%} + + + + {{ symbol.count }} {{ symbol.shape }} {{ symbol.color }} {{ symbol.infill }} + + {%- for color in Color %} + + + + {%- endfor %} + + + + + + + + + + + + + {%- for i in range(symbol.count.value) %} + {%- set ybase = 80 - 25*(symbol.count.value - 1) + 50*i %} + {%- if symbol.shape == Shape.RECTANGLE %} + {#- rect #} + + {%- elif symbol.shape == Shape.TILDE %} + {#- tilde #} + + {%- elif symbol.shape == Shape.ELLIPSE %} + {#- ellipse #} + + {%- endif %} + {%- endfor %} + + + + diff --git a/templates/cwa/sudoku.html.j2 b/templates/cwa/sudoku.html.j2 new file mode 100644 index 0000000..7dc8764 --- /dev/null +++ b/templates/cwa/sudoku.html.j2 @@ -0,0 +1,68 @@ +{% extends 'cwa/base.html.j2' %} + +{%- block body %} +

Sudoku: {{ game.human_id }} ({{ duration }})

+
+
+
+ + {%- for row in range(1, 10) %} + + {%- for col in range(1, 10) %} + + {%- endfor %} + + {%- endfor %} +
+ {%- if puzzle.original[row-1][col-1] %} + + {%- else %} + + + {%- endif %} +
+
+
+ + {%- for row in range(0, 3) %} + + {%- for col in range(1, 4) %} + + {%- endfor %} + + {%- endfor %} + + + +
+ +
+ +
+
+
+
+

Players in Game

+
    + {%- for pkey in game.players.keys() %} +
  • + {{ game.players[pkey].name }} + (Progress: {{ (game.puzzle.puzzles[pkey].progress * 100) | int }} %) +
  • + {%- endfor %} +
+

Scores

+
    + {%- for score in game.scoreboard %} +
  1. + {{ game.players[score['player']].name }} + {{ score['duration'] }} +
  2. + {%- endfor %} +
+ Refresh +{%- endblock %} diff --git a/templates/cwa/welcome.html.j2 b/templates/cwa/welcome.html.j2 new file mode 100644 index 0000000..bc9a76a --- /dev/null +++ b/templates/cwa/welcome.html.j2 @@ -0,0 +1,15 @@ +{% extends 'cwa/base.html.j2' %} + +{% block body %} +

New Game

+ +
+
    +
  1. Choose a name:
  2. +
  3. Join or start a game
  4. +
  5. Invite other players
  6. +
  7. Play!
  8. +
+ +
+{% endblock %} \ No newline at end of file diff --git a/templates/cwa/welcome1.html.j2 b/templates/cwa/welcome1.html.j2 new file mode 100644 index 0000000..f8f9908 --- /dev/null +++ b/templates/cwa/welcome1.html.j2 @@ -0,0 +1,20 @@ +{% extends 'cwa/base.html.j2' %} + +{% block body %} +

New Game

+ +
+
    +
  1. Choose a name: {{ player_name }}
  2. +
  3. Join or start a game: + +
  4. +
  5. Invite other players
  6. +
  7. Play!
  8. +
+
+{% endblock %} \ No newline at end of file diff --git a/templates/cwa/welcome2.html.j2 b/templates/cwa/welcome2.html.j2 new file mode 100644 index 0000000..2f3bd28 --- /dev/null +++ b/templates/cwa/welcome2.html.j2 @@ -0,0 +1,29 @@ +{% extends 'cwa/base.html.j2' %} + +{% block body %} +

{{ game.puzzle_name }}: {{ game.human_id }}

+ +
+
    +
  1. Choose a name: {{ player.name }}
  2. +
  3. Join or start a game of {{ game.puzzle_name }}: {{ game.human_id }}
  4. +
  5. Invite other players: {{ host }}{{ baseurl }}{{ game.human_id }}
  6. +
  7. +
+ +

Game Options

+ +{{ game.get_extra_options_html() }} + +

Players in Game

+
    +{% for player in game.players.values() %} +
  • {{ player.name }}
  • +{% endfor %} +
+Refresh + +
+ + +{% endblock %} diff --git a/templates/cwa/welcome3.html.j2 b/templates/cwa/welcome3.html.j2 new file mode 100644 index 0000000..395d171 --- /dev/null +++ b/templates/cwa/welcome3.html.j2 @@ -0,0 +1,15 @@ +{% extends 'cwa/base.html.j2' %} + +{% block body %} +

{{ game.puzzle_name }}: {{ game.human_id }}

+ +
+
    +
  1. Choose a name:
  2. +
  3. Join or start a game of {{ game.puzzle_name }}: {{ game.human_id }}
  4. +
  5. Invite other players
  6. +
  7. Play!
  8. +
+ +
+{% endblock %} \ No newline at end of file diff --git a/templates/sudoku.example.html b/templates/sudoku.example.html new file mode 100644 index 0000000..2ea31de --- /dev/null +++ b/templates/sudoku.example.html @@ -0,0 +1,658 @@ + + + + + + Sudoku + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + diff --git a/templates/sudoku.html b/templates/sudoku.html new file mode 100644 index 0000000..72d6856 --- /dev/null +++ b/templates/sudoku.html @@ -0,0 +1,55 @@ + + + + + + Sudoku + + + +
+
+
+ + {% for row in range(1, 10) %} + + {% for col in range(1, 10) %} + + {% endfor %} + + {% endfor %} +
+ {% if sudoku_original[row-1][col-1] %} + + {% else %} + + + {% endif %} +
+
+
+ + {% for row in range(0, 3) %} + + {% for col in range(1, 4) %} + + {% endfor %} + + {% endfor %} + + + +
+ +
+ +
+
+
+
+ + diff --git a/webgames/__init__.py b/webgames/__init__.py new file mode 100644 index 0000000..373d726 --- /dev/null +++ b/webgames/__init__.py @@ -0,0 +1,2 @@ + +__version__ = '0.1' diff --git a/webgames/__main__.py b/webgames/__main__.py new file mode 100644 index 0000000..3ba2cf6 --- /dev/null +++ b/webgames/__main__.py @@ -0,0 +1,165 @@ +import sys +import json +from uuid import UUID +from datetime import datetime + +import jinja2 +from bottle import Bottle, abort, request, redirect, static_file +from namesgenerator import get_random_name + +from webgames import api +from webgames.api import apiv1, GAMES, PLAYERS +from webgames.human import HumanID +from webgames.game import GameState + + +app = Bottle() +app.jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader('templates')) + + +@app.get('/') +def get__root(): + scheme, host, *_ = request.urlparts + tmpl = app.jinja_env.get_template('cwa/welcome.html.j2') + example_name = get_random_name(' ').title() + return tmpl.render(placeholder=example_name, host=f'{scheme}://{host}', baseurl=f'{urlbase}/') + + +@app.get('/favicon.ico') +def get_favicon(): + redirect('/static/favicon.ico') + + +@app.post('/') +def post__root(): + scheme, host, *_ = request.urlparts + name = request.forms.get('name') + placeholder = request.forms.get('placeholder') + if not name: + name = placeholder + uuid = api.create_player(name) + redirect(f'{urlbase}/{str(uuid)}') + + +@app.get('/') +@app.get('//') +def get_player(player: str): + scheme, host, *_ = request.urlparts + if len(player) == 0: + return get__root() + elif len(player) == 4: + return get__blank_game(player) + player_id = UUID(player) + player = api.get_player(player_id) + tmpl = app.jinja_env.get_template('cwa/welcome1.html.j2') + return tmpl.render(player_name=player.name, + player_uuid=str(player.uuid), host=f'{scheme}://{host}', baseurl=f'{urlbase}/') + + +@app.post('/') +@app.post('//') +def post_player(player_id: str): + scheme, host, *_ = request.urlparts + if len(player_id) == 4: + return post__blank_game(player_id) + playerid = UUID(player_id) + puzzle = request.forms.get('puzzle') + humanid = request.forms.get('game') + try: + game_id = HumanID.resolve(humanid) + except: + game_id = api.create_game(puzzle) + game = api.get_game(game_id) + player = api.get_player(playerid) + game.join(player) + redirect(f'{urlbase}/{player_id}/{str(game.uuid)}/lobby') + + +def get__blank_game(game_id: str): + scheme, host, *_ = request.urlparts + try: + gameid = HumanID.resolve(game_id) + except: + redirect(f'{urlbase}') + game = api.get_game(gameid) + tmpl = app.jinja_env.get_template('cwa/welcome3.html.j2') + example_name = get_random_name(' ').title() + return tmpl.render(game=game,placeholder=example_name, host=f'{scheme}://{host}', baseurl=f'{urlbase}/') + + +def post__blank_game(game_id: str): + scheme, host, *_ = request.urlparts + try: + gameid = HumanID.resolve(game_id) + except: + redirect(f'{urlbase}/') + game = api.get_game(gameid) + name = request.forms.get('name') + placeholder = request.forms.get('placeholder') + if not name: + name = placeholder + uuid = api.create_player(name) + player = api.get_player(uuid) + game.join(player) + redirect(f'{urlbase}/{uuid}/{game.uuid}/lobby') + + +@app.get('///lobby') +@app.get('///lobby/') +def get_player_game_lobby(player_id: str, game_id: str): + scheme, host, *_ = request.urlparts + playerid = UUID(player_id) + gameid = UUID(game_id) + player = api.get_player(playerid) + game = api.get_game(gameid) + if game.state == GameState.RUNNING: + redirect(f'{urlbase}/{player_id}/{game_id}/play') + elif game.state == GameState.FINISHED: + redirect(f'{urlbase}/{player_id}/{game_id}/done') + tmpl = app.jinja_env.get_template('cwa/welcome2.html.j2') + return tmpl.render(player=player, game=game, host=f'{scheme}://{host}', baseurl=f'{urlbase}/') + + +@app.get('///play') +@app.get('///play/') +def get_player_game_play(player_id: str, game_id: str): + playerid = UUID(player_id) + gameid = UUID(game_id) + player = api.get_player(playerid) + game = api.get_game(gameid) + if game.state == GameState.LOBBY: + game.begin({}, baseurl=f'{urlbase}/') + duration = str(datetime.utcnow() - game.start) + return game.render(app.jinja_env, player, duration) + + +@app.post('///play') +@app.post('///play/') +def post_player_game_play(player_id: str, game_id: str): + playerid = UUID(player_id) + gameid = UUID(game_id) + player = api.get_player(playerid) + game = api.get_game(gameid) + if game.state == GameState.LOBBY: + game.begin(options=request.forms, urlbase=f'{urlbase}/') + else: + game.process_action(playerid, request.forms) + duration = str(datetime.utcnow() - game.start) + return game.render(app.jinja_env, player, duration) + +#@app.error(404) +#def error_404(error): +# redirect('/', 303) + + +@app.get('/static/') +def static(filename): + return static_file(filename, root='static') + + +host = sys.argv[1] if len(sys.argv) >= 3 else '127.0.0.1' +port = sys.argv[-1] if len(sys.argv) > 1 else 8080 +urlbase = sys.argv[2] if len(sys.argv) >= 4 else '' + +app.mount('/api/v1', apiv1) +app.run(host=host, port=port) diff --git a/webgames/api.py b/webgames/api.py new file mode 100644 index 0000000..3af9bf8 --- /dev/null +++ b/webgames/api.py @@ -0,0 +1,184 @@ +from typing import Optional + +import json +from uuid import UUID + +from bottle import Bottle, abort, request + +from webgames.game import Game, GameState +from webgames.player import Player +from webgames.human import HumanID + + +GAMES = {} + + +PLAYERS = {} + + +apiv1 = Bottle() + + +@apiv1.get('/humanid/') +def get_humanid_humanid(humanid: str) -> UUID: + try: + longid: Optional[UUID] = HumanID.resolve(humanid) + except KeyError: + longid = None + return json.dumps({ + 'uuid': str(longid), + 'human_id': str(humanid) + }) + + +def create_player(name: str) -> UUID: + player = Player(name) + PLAYERS[player.uuid] = player + return player.uuid + +@apiv1.post('/player') +def post_player(): + name = request.json.get('name', None) + create_player(name) + return get_player_uuid(str(player.uuid)) + + +def get_player(uuid: UUID): + try: + return PLAYERS[uuid] + except KeyError: + abort(404, 'Player not found') + +@apiv1.get('/player/') +def get_player_uuid(uuid: str): + longid = UUID(uuid) + try: + player = PLAYERS[longid] + except KeyError: + abort(404, 'Player not found') + return json.dumps({ + 'uuid': str(player.uuid), + 'name': str(player.name) + }) + + +def create_game(puzzle: str, puzzle_args = None) -> UUID: + game = Game(puzzle, puzzle_args) + GAMES[game.uuid] = game + return game.uuid + +@apiv1.post('/game') +def post_game(): + puzzle = request.json.get('difficulty', 'sudoku') + puzzle_args = request.json.get('puzzle_args', None) + game = Game(puzzle, puzzle_args) + GAMES[game.uuid] = game + return get_game_uuid(str(game.uuid)) + + +def get_game(uuid: UUID): + try: + return GAMES[uuid] + except KeyError: + abort(404, 'Game not found') + + +@apiv1.get('/game/') +def get_game_uuid(uuid: str): + longid = UUID(uuid) + try: + game = GAMES[longid] + except KeyError: + abort(404, 'Game not found') + players = [ + { + 'uuid': str(pid), + 'name': player.name + } + for pid, player in game.players.items() + ] + puzzles = [ + { + 'uuid': str(pid), + 'progress': puzzle.progress + } + for pid, puzzle in game.puzzles.items() + ] + scores = [ + { + 'player': str(item['player']), + 'duration': str(item['duration']) + } + for item in game.scoreboard + ] + return json.dumps({ + 'uuid': str(game.uuid), + 'human_id': str(game.human_id), + 'state': str(game.state), + 'players': players, + 'puzzles': puzzles, + 'scores': scores, + 'start': game.start.timestamp() if game.start else None, + 'end': game.end.timestamp() if game.end else None + }) + + +@apiv1.post('/game//join') +def post_game_uuid_join(uuid: str): + pid: str = request.json.get('uuid') + game_id = UUID(uuid) + player_id = UUID(pid) + try: + game = GAMES[game_id] + except KeyError: + abort(404, 'Game not found') + try: + player = PLAYERS[player_id] + except KeyError: + abort(404, 'Player not found') + game.join(player) + + +@apiv1.post('/game//start') +def post_game_uuid_start(uuid: str): + game_id = UUID(uuid) + try: + game = GAMES[game_id] + except KeyError: + abort(404, 'Game not found') + game.begin(options=request.json) + + +@apiv1.post('/game//conclude') +def post_game_uuid_conclude(uuid: str): + game_id = UUID(uuid) + try: + game = GAMES[game_id] + except KeyError: + abort(404, 'Game not found') + game.conclude() + + +@apiv1.get('/game//puzzle/') +def post_game_uuid_action(gid: str, pid: str): + game_id = UUID(gid) + try: + game = GAMES[game_id] + except KeyError: + abort(404, 'Game not found') + player_id = UUID(pid) + return json.dumps(game.serialize_puzzle(player_id)) + + +@apiv1.post('/game//puzzle//action') +def post_game_gid_puzzle_pid_action(gid: str, pid: str): + game_id = UUID(gid) + try: + game = GAMES[game_id] + except KeyError: + abort(404, 'Game not found') + player_id = UUID(pid) + action = request.json.get('action') + game.process_action(player_id, action) + + diff --git a/webgames/carcassonne.py b/webgames/carcassonne.py new file mode 100644 index 0000000..ee8a9ce --- /dev/null +++ b/webgames/carcassonne.py @@ -0,0 +1,910 @@ +import random +import enum +from uuid import uuid4, UUID + +from webgames.puzzle import Puzzle + + +class _Color: + + def __init__(self, name, html, ansi): + self.name = name + self.html = html + self.ansi = ansi + + +class Color(enum.Enum): + RED = _Color('red', '#ff0000', '\033[31m') + GREEN = _Color('green', '#00aa00', '\033[32m') + BLUE = _Color('blue', '#0000ff', '\033[34m') + YELLOW = _Color('yellow', '#ff00ff', '\093[33m') + BLACK = _Color('black', '#000000', '\033[30m') + GREY = _Color('grey', '#888888', '\033[90m') + + +class Phase(enum.Enum): + PLACE = 1 + CLAIM = 2 + + +class ResourceBoundary(enum.Enum): + LEFT = 1 + TOP = 2 + RIGHT = 3 + BOTTOM = 4 + LEFT_TOP = 5 + TOP_LEFT = 6 + TOP_RIGHT = 7 + RIGHT_TOP = 8 + RIGHT_BOTTOM = 9 + BOTTOM_RIGHT = 10 + BOTTOM_LEFT = 11 + LEFT_BOTTOM = 12 + + +class Card: + + def __init__(self, monastery=None, shrine=None, city_defense=False, template='', + road_top=None, road_bottom=None, road_left=None, road_right=None, + city_top=None, city_bottom=None, city_left=None, city_right=None, + pasture_lt=None, pasture_rt=None, pasture_rb=None, pasture_lb=None, + pasture_tl=None, pasture_tr=None, pasture_br=None, pasture_bl=None, + inn=None, cathedral=None): + self.resources = {} + self.template = template + self.rotation = 0 + self.city_defense = city_defense + if monastery: + self.resources[monastery] = Monastery(self) + self.monastery = self.resources[monastery] + elif shrine: + self.resources[shrine] = Shrine(self) + self.monastery = self.resources[shrine] + else: + self.monastery = None + _roads = {i: Road(self, inn=inn==i) for i in [road_left, road_top, road_right, road_bottom] if i is not None} + _cities = {i: City(self, cathedral=cathedral==i) for i in [city_left, city_top, city_right, city_bottom] if i is not None} + _pastures = {i: Pasture(self) for i in [pasture_tl, pasture_tr, pasture_br, pasture_bl, pasture_lt, pasture_rt, pasture_rb, pasture_lb] if i is not None} + self.resources.update(_roads) + self.resources.update(_cities) + self.resources.update(_pastures) + self.placed = False + self.x = None + self.y = None + self.road_top, self.road_left, self.road_bottom, self.road_right = \ + _roads.get(road_top), _roads.get(road_left), _roads.get(road_bottom), _roads.get(road_right) + self.city_top, self.city_left, self.city_bottom, self.city_right = \ + _cities.get(city_top), _cities.get(city_left), _cities.get(city_bottom), _cities.get(city_right) + self.pasture_tl, self.pasture_tr, self.pasture_br, self.pasture_bl, self.pasture_lt, self.pasture_rt, self.pasture_rb, self.pasture_lb = \ + _pastures.get(pasture_tl), _pastures.get(pasture_tr), _pastures.get(pasture_br), _pastures.get(pasture_bl), _pastures.get(pasture_lt), _pastures.get(pasture_rt), _pastures.get(pasture_rb), _pastures.get(pasture_lb) + + def can_place(self, field, x, y): + left = field.get((x-1, y)) + top = field.get((x, y-1)) + right = field.get((x+1, y)) + bottom = field.get((x, y+1)) + if left and ((left.pasture_rt is None) != (self.pasture_lt is None) \ + or (left.pasture_rb is None) != (self.pasture_lb is None) \ + or (left.road_right is None) != (self.road_left is None) \ + or (left.city_right is None) != (self.city_left is None)): + raise ValueError('Card does not match the one to the left') + if top and ((top.pasture_bl is None) != (self.pasture_tl is None) \ + or (top.pasture_br is None) != (self.pasture_tr is None) \ + or (top.road_bottom is None) != (self.road_top is None) \ + or (top.city_bottom is None) != (self.city_top is None)): + raise ValueError('Card does not match the one to the top') + if right and ((right.pasture_lt is None) != (self.pasture_rt is None) \ + or (right.pasture_lb is None) != (self.pasture_rb is None) \ + or (right.road_left is None) != (self.road_right is None) \ + or (right.city_left is None) != (self.city_right is None)): + raise ValueError('Card does not match the one to the right') + if bottom and ((bottom.pasture_tl is None) != (self.pasture_bl is None) \ + or (bottom.pasture_tr is None) != (self.pasture_br is None) \ + or (bottom.road_top is None) != (self.road_bottom is None) \ + or (bottom.city_top is None) != (self.city_bottom is None)): + raise ValueError('Card does not match the one to the bottom') + + def rotate_cw(self): + if self.placed: + raise RuntimeError('Cant rotate an already placed time') + self.rotation = (self.rotation + 90) % 360 + self.road_top, self.road_left, self.road_bottom, self.road_right = self.road_left, self.road_bottom, self.road_right, self.road_top + self.city_top, self.city_left, self.city_bottom, self.city_right = self.city_left, self.city_bottom, self.city_right, self.city_top + self.pasture_tl, self.pasture_tr, self.pasture_rt, self.pasture_rb, self.pasture_br, self.pasture_bl, self.pasture_lb, self.pasture_lt = self.pasture_lb, self.pasture_lt, self.pasture_tl, self.pasture_tr, self.pasture_rt, self.pasture_rb, self.pasture_br, self.pasture_bl + + def rotate_ccw(self): + if self.placed: + raise RuntimeError('Cant rotate an already placed time') + self.rotation = (self.rotation + 270) % 360 + self.road_left, self.road_bottom, self.road_right, self.road_top = self.road_top, self.road_left, self.road_bottom, self.road_right + self.city_left, self.city_bottom, self.city_right, self.city_top = self.city_top, self.city_left, self.city_bottom, self.city_right + self.pasture_lb, self.pasture_lt, self.pasture_tl, self.pasture_tr, self.pasture_rt, self.pasture_rb, self.pasture_br, self.pasture_bl = self.pasture_tl, self.pasture_tr, self.pasture_rt, self.pasture_rb, self.pasture_br, self.pasture_bl, self.pasture_lb, self.pasture_lt + + def svg(self, env, standalone=True, x=0, y=0, claimable={}, highlight=False): + tmpl = env.get_template(f'carcassonne/{self.template}.svg') + rendered = tmpl.render(resources=self.resources, rotation=self.rotation, x=x*100, y=y*100, claimable=claimable) + if highlight: + rendered += f'' + if standalone: + return '\n' + rendered + '\n' + return rendered + + @staticmethod + def generate_deck(extensions=[], field=None): + # https://upload.wikimedia.org/wikipedia/commons/f/f8/Carcassonne_tiles.svg + deck = \ + [Card(monastery=1, pasture_tl=2, pasture_tr=2, pasture_br=2, pasture_bl=2, pasture_lt=2, pasture_rt=2, pasture_rb=2, pasture_lb=2, template='001') for _ in range(4)] + \ + [Card(monastery=1, road_bottom=2, pasture_tl=3, pasture_tr=3, pasture_br=3, pasture_bl=3, pasture_lt=3, pasture_rt=3, pasture_rb=3, pasture_lb=3, template='011') for _ in range(2)] + \ + [Card(city_top=2, pasture_br=1, pasture_bl=1, pasture_lt=1, pasture_rt=1, pasture_rb=1, pasture_lb=1, template='101') for _ in range(5)] + \ + [Card(road_left=1, road_right=1, pasture_tl=2, pasture_tr=2, pasture_br=3, pasture_bl=3, pasture_lt=2, pasture_rt=2, pasture_rb=3, pasture_lb=3, template='021') for _ in range(8)] + \ + [Card(road_bottom=1, road_left=1, pasture_tl=2, pasture_tr=2, pasture_br=2, pasture_bl=3, pasture_lt=2, pasture_rt=2, pasture_rb=2, pasture_lb=3, template='022') for _ in range(9)] + \ + [Card(road_bottom=4, road_left=5, road_right=6, pasture_tl=1, pasture_tr=1, pasture_br=2, pasture_bl=3, pasture_lt=1, pasture_rt=1, pasture_rb=2, pasture_lb=3, template='031') for _ in range(4)] + \ + [Card(road_bottom=5, road_left=6, road_right=7, road_top=8, pasture_tl=1, pasture_tr=2, pasture_br=3, pasture_bl=4, pasture_lt=1, pasture_rt=2, pasture_rb=3, pasture_lb=4, template='041') for _ in range(1)] + \ + [Card(city_top=2, pasture_br=1, pasture_bl=1, pasture_lt=1, pasture_rt=1, pasture_rb=1, pasture_lb=1, template='101') for _ in range(5)] + \ + [Card(road_left=3, road_right=3, city_top=4, pasture_br=2, pasture_bl=2, pasture_lt=1, pasture_rt=1, pasture_rb=2, pasture_lb=2, template='121') for _ in range(3)] + \ + [Card(road_left=3, road_bottom=3, city_top=4, pasture_br=1, pasture_bl=2, pasture_lt=1, pasture_rt=1, pasture_rb=1, pasture_lb=2, template='122') for _ in range(3)] + \ + [Card(road_right=3, road_bottom=3, city_top=4, pasture_br=2, pasture_bl=1, pasture_lt=1, pasture_rt=1, pasture_rb=2, pasture_lb=1, template='123') for _ in range(3)] + \ + [Card(road_bottom=4, road_left=5, road_right=6, city_top=7, pasture_br=2, pasture_bl=3, pasture_lt=1, pasture_rt=1, pasture_rb=2, pasture_lb=3, template='131') for _ in range(3)] + \ + [Card(city_left=3, city_right=3, pasture_tl=1, pasture_tr=1, pasture_br=2, pasture_bl=2, template='201') for _ in range(1)] + \ + [Card(city_defense=True, city_left=3, city_right=3, pasture_tl=1, pasture_tr=1, pasture_br=2, pasture_bl=2, template='202') for _ in range(2)] + \ + [Card(city_top=2, city_right=2, pasture_bl=1, pasture_br=1, pasture_lt=1, pasture_lb=1, template='203') for _ in range(3)] + \ + [Card(city_defense=True, city_top=2, city_right=2, pasture_bl=1, pasture_br=1, pasture_lt=1, pasture_lb=1, template='204') for _ in range(2)] + \ + [Card(city_top=2, city_bottom=3, pasture_lt=1, pasture_rt=1, pasture_lb=1, pasture_rb=1, template='205') for _ in range(3)] + \ + [Card(city_top=2, city_right=3, pasture_bl=1, pasture_br=1, pasture_lb=1, pasture_lt=1, template='206') for _ in range(2)] + \ + [Card(road_left=3, road_bottom=3, city_top=4, city_right=4, pasture_lt=1, pasture_lb=2, pasture_bl=2, pasture_br=1, template='221') for _ in range(2)] + \ + [Card(road_left=3, road_bottom=3, city_defense=True, city_top=4, city_right=4, pasture_lt=1, pasture_lb=2, pasture_bl=2, pasture_br=1, template='222') for _ in range(2)] + \ + [Card(city_left=1, city_top=1, city_right=1, pasture_bl=2, pasture_br=2, template='301') for _ in range(3)] + \ + [Card(city_defense=True, city_left=1, city_top=1, city_right=1, pasture_bl=2, pasture_br=2, template='302') for _ in range(1)] + \ + [Card(road_bottom=4, city_left=3, city_top=3, city_right=3, pasture_bl=1, pasture_br=2, template='311') for _ in range(1)] + \ + [Card(road_bottom=4, city_defense=True, city_left=3, city_top=3, city_right=3, pasture_bl=1, pasture_br=2, template='312') for _ in range(2)] + \ + [Card(city_defense=True, city_left=1, city_top=1, city_right=1, city_bottom=1, template='401') for _ in range(1)] + + if 'heretics' in extensions: + # https://wikicarpedia.com/index.php/File:Sheet_Cult.png + deck += [ + Card(shrine=1, road_top=2, road_bottom=3, pasture_tl=4, pasture_lt=4, pasture_lb=4, pasture_bl=4, pasture_tr=5, pasture_rt=5, pasture_rb=5, pasture_br=5, template='he-021'), + Card(shrine=1, pasture_tl=2, pasture_lt=2, pasture_lb=2, pasture_bl=2, pasture_tr=2, pasture_rt=2, pasture_rb=2, pasture_br=2, template='he-001'), + Card(shrine=1, city_top=3, road_bottom=4, pasture_lt=2, pasture_lb=2, pasture_bl=2, pasture_rt=2, pasture_rb=2, pasture_br=2, template='he-111'), + Card(shrine=1, road_bottom=3, pasture_tl=2, pasture_lt=2, pasture_lb=2, pasture_bl=2, pasture_tr=2, pasture_rt=2, pasture_rb=2, pasture_br=2, template='he-011'), + Card(shrine=1, city_top=3, pasture_lt=2, pasture_lb=2, pasture_bl=2, pasture_rt=2, pasture_rb=2, pasture_br=2, template='he-101') + ] + + if 'inns-cathedrals' in extensions: + # https://wikicarpedia.com/index.php/Inns_and_Cathedrals + center_pasture = Card(city_top=1, city_right=2, city_bottom=3, city_left=4, pasture_tl=5, template='ic-401-pasture') + center_pasture.pasture_tl = None + deck += [ + Card(road_bottom=1, road_left=1, pasture_tl=2, pasture_tr=2, pasture_br=2, pasture_bl=3, pasture_lt=2, pasture_rt=2, pasture_rb=2, pasture_lb=3, template='ic-022-inn', inn=1), + Card(road_left=1, road_right=1, pasture_tl=2, pasture_tr=2, pasture_br=3, pasture_bl=3, pasture_lt=2, pasture_rt=2, pasture_rb=3, pasture_lb=3, template='ic-021-inn', inn=1), + Card(road_bottom=4, road_left=5, road_right=6, pasture_tl=1, pasture_tr=1, pasture_br=2, pasture_bl=3, pasture_lt=1, pasture_rt=1, pasture_rb=2, pasture_lb=3, template='ic-031-inn', inn=6), + Card(monastery=4, road_left=1, road_right=5, pasture_tl=2, pasture_tr=2, pasture_br=3, pasture_bl=3, pasture_lt=2, pasture_rt=2, pasture_rb=3, pasture_lb=3, template='ic-021-monastery'), + Card(road_bottom=1, road_right=1, road_top=2, road_left=2, pasture_tl=3, pasture_tr=4, pasture_br=5, pasture_bl=4, pasture_lt=3, pasture_rt=4, pasture_rb=5, pasture_lb=4, template='ic-041'), + Card(road_bottom=3, city_top=2, city_right=2, pasture_bl=1, pasture_br=4, pasture_lt=1, pasture_lb=1, template='ic-203-road'), + Card(city_top=1, pasture_br=3, pasture_bl=3, pasture_lt=3, pasture_rt=2, pasture_rb=2, pasture_lb=3, template='ic-101-branch'), + center_pasture, + Card(road_left=5, road_right=6, city_top=7, city_bottom=8, pasture_lt=1, pasture_rt=2, pasture_rb=4, pasture_lb=3, template='ic-221-crossing'), + Card(road_bottom=3, city_top=4, pasture_br=1, pasture_bl=2, pasture_lt=2, pasture_rt=1, pasture_rb=1, pasture_lb=2, template='ic-101-road'), + Card(city_left=1, city_top=1, city_right=1, city_bottom=1, template='ic-401-cathedral', cathedral=1), + Card(city_left=1, city_top=1, city_right=1, city_bottom=1, template='ic-401-cathedral', cathedral=1), + Card(road_left=3, road_bottom=3, city_defense=True, city_top=4, city_right=4, pasture_lt=1, pasture_lb=2, pasture_bl=2, pasture_br=1, template='ic-222-inn', inn=3), + Card(road_left=3, road_bottom=3, city_top=4, pasture_br=1, pasture_bl=2, pasture_lt=1, pasture_rt=1, pasture_rb=1, pasture_lb=2, template='ic-122-inn', inn=3), + Card(road_bottom=3, city_top=2, city_left=2, pasture_br=1, pasture_bl=4, pasture_rt=1, pasture_rb=1, template='ic-203-road-inn', inn=3), + Card(city_top=3, city_right=4, city_left=2, pasture_bl=1, pasture_br=1, template='ic-301-split'), + Card(city_defense=True, city_right=2, city_left=3, city_bottom=3, pasture_tl=1, pasture_tr=1, template='ic-302'), + Card(city_defense=True, city_left=5, city_right=5, road_top=6, road_bottom=7, pasture_tl=1, pasture_tr=2, pasture_bl=3, pasture_br=4, template='ic-202-roads') + ] + + random.shuffle(deck) + + if 'river' in extensions: + # https://wikicarpedia.com/index.php/File:River_I_And_River_II_C2_Examples.png + inn = 5 if 'inns-cathedrals' in extensions else None + riverdeck = [ + RiverCard(river_bottom=True, pasture_bl=1, pasture_lb=1, pasture_lt=1, pasture_tl=1, pasture_tr=1, pasture_rt=1, pasture_rb=1, pasture_br=1, template='r2-source'), + RiverCard(river_bottom=True, river_left=True, pasture_bl=2, pasture_lb=2, pasture_lt=1, pasture_tl=1, pasture_tr=1, pasture_rt=1, pasture_rb=1, pasture_br=1, template='r2-curve'), + + RiverCard(river_bottom=True, river_right=True, city_defense=True, city_left=3, city_top=3, pasture_bl=1, pasture_rt=1, pasture_rb=2, pasture_br=2, template='r2-city'), + RiverCard(river_top=True, river_bottom=True, road_left=5, road_right=5, pasture_bl=1, pasture_lb=1, pasture_lt=2, pasture_tl=2, pasture_tr=3, pasture_rt=3, pasture_rb=4, pasture_br=4, inn=inn, template='r2-road'), + RiverCard(river_top=True, river_bottom=True, city_left=3, city_right=3, pasture_bl=1, pasture_tl=1, pasture_tr=2, pasture_br=2, template='r2-citybridge'), + RiverCard(river_bottom=True, river_left=True, pasture_bl=2, pasture_lb=2, pasture_lt=1, pasture_tl=1, pasture_tr=1, pasture_rt=1, pasture_rb=1, pasture_br=1, template='r2-curve'), + RiverCard(river_bottom=True, river_left=True, road_top=4, road_right=4, pasture_bl=2, pasture_lb=2, pasture_lt=1, pasture_tl=1, pasture_tr=3, pasture_rt=3, pasture_rb=1, pasture_br=1, template='r2-road2'), + RiverCard(river_bottom=True, river_top=True, road_left=5, city_right=6, pasture_bl=1, pasture_lb=1, pasture_lt=2, pasture_tl=2, pasture_tr=3, pasture_br=4, template='r2-roadcity'), + RiverCard(river_top=True, pasture_bl=1, pasture_lb=1, pasture_lt=1, pasture_tl=1, pasture_tr=1, pasture_rt=1, pasture_rb=1, pasture_br=1, template='r2-lake'), + RiverCard(river_left=True, river_right=True, monastery=3, pasture_bl=1, pasture_lb=1, pasture_lt=2, pasture_tl=2, pasture_tr=2, pasture_rt=2, pasture_rb=1, pasture_br=1, template='r2-monastery'), + ] + random.shuffle(riverdeck) + riverdeck.insert(0, RiverCard(river_bottom=True, city_top=3, pasture_bl=1, pasture_lb=1, pasture_lt=1, pasture_rt=2, pasture_rb=2, pasture_br=2, template='r2-lake2')) + deck += riverdeck + if field: + field._resources = {} + field._field = {} + field.place_card(0, 0, RiverCard(river_bottom=True, river_top=True, river_right=True, pasture_bl=1, pasture_lb=1, pasture_lt=1, pasture_tl=1, pasture_tr=2, pasture_rt=2, pasture_rb=3, pasture_br=3, template='r2-fork')) + + return deck + + +class RiverCard(Card): + def __init__(self, river_left=False, river_top=False, river_right=False, river_bottom=False, **kwargs): + self.river_left = river_left + self.river_top = river_top + self.river_right = river_right + self.river_bottom = river_bottom + super().__init__(**kwargs) + + def can_place(self, field, x, y): + super().can_place(field, x, y) + left = field.get((x-1, y)) + top = field.get((x, y-1)) + right = field.get((x+1, y)) + bottom = field.get((x, y+1)) + adj = [t for t in [left, top, right, bottom] if t is not None] + if len(adj) != 1: + raise ValueError('Cannot place river tile here') + if left and (not left.river_right or not self.river_left): + raise ValueError('Card does not match the one to the left') + if top and (not top.river_bottom or not self.river_top): + raise ValueError('Card does not match the one to the top') + if right and (not right.river_left or not self.river_right): + raise ValueError('Card does not match the one to the right') + if bottom and (not bottom.river_top or not self.river_bottom): + raise ValueError('Card does not match the one to the bottom') + # Check that there are no immediate 180deg turn + if self.river_left and not left: + if (top and top.river_left) or (bottom and bottom.river_left): + raise ValueError('Card placement introduces a 180 degree angle') + elif self.river_top and not top: + if (left and left.river_top) or (right and right.river_top): + raise ValueError('Card placement introduces a 180 degree angle') + elif self.river_right and not right: + if (top and top.river_right) or (bottom and bottom.river_right): + raise ValueError('Card placement introduces a 180 degree angle') + elif self.river_bottom and not bottom: + if (left and left.river_bottom) or (right and right.river_bottom): + raise ValueError('Card placement introduces a 180 degree angle') + + def rotate_cw(self): + super().rotate_cw() + self.river_top, self.river_left, self.river_bottom, self.river_right = self.river_left, self.river_bottom, self.river_right, self.river_top + + def rotate_ccw(self): + super().rotate_ccw() + self.river_left, self.river_bottom, self.river_right, self.river_top = self.river_top, self.river_left, self.river_bottom, self.river_right + + +class Resource: + + def __init__(self, card): + self.owners = set() + self.cards = set([card]) + self.joined = self + self.completed = False + self.completed_before_end = False + self.boundaries = set() + self._uuid = uuid4() + + def root(self): + a = self + while a != a.joined: + a = a.joined + self.joined = a + return a + + def uuid(self): + return self.root()._uuid + + def join(self, other): + if type(self) != type(other.joined): + raise TypeError(f'Cannot join {type(self)} with {type(other.joined)}') + a = self.root() + b = other.root() + if a.completed or b.completed: + raise RuntimeError(f'Cannot join completed resources') + a.owners.update(b.owners) + a.cards.update(b.cards) + a.boundaries.update(b.boundaries) + b.joined = a + return a + + def claim(self, player, card): + a = self.root() + if len(a.owners) > 0: + raise RuntimeError('Cannot claim already-claimed resource') + if len([1 for f in player.followers if f.resource is None]) == 0: + raise RuntimeError('Player has no followers left') + for f in player.followers: + if f.resource is None: + a.owners.add(f) + f.claim(self, card) + break + + def unclaim(self): + r = self.root() + for follower in r.owners: + follower.resource = None + r.owners = [] + + + def complete(self, game_end, players): + r = self.root() + if r.completed: + return + r.completed = True + r.completed_before_end = not game_end + owners = {} + for follower in r.owners: + owners.setdefault(follower.player.uuid, 0) + owners[follower.player.uuid] += 1 + if not game_end: + r.unclaim() + nmax = max(owners.values(), default=0) + scoring_players = [uuid for uuid, n in owners.items() if n == nmax] + for p in scoring_players: + players[p].score += r.get_score(game_end) + + def get_score(self, game_end): + return 0 + + + +class Monastery(Resource): + + def __init__(self, card): + super().__init__(card) + self._score = 0 + self._competitors = set() + + def join(self, other): + raise TypeError('Cannot join monasteries') + + def get_score(self, game_end): + for c in self._competitors: + c.unclaim() + return self._score + + def add_competitor(self, other): + if isinstance(other, Shrine): + self._competitors.add(other) + other._competitors.add(self) + + +class Shrine(Monastery): + + def __init__(self, card): + super().__init__(card) + + def join(self, other): + raise TypeError('Cannot join shrines') + + def add_competitor(self, other): + if isinstance(other, Monastery) and not isinstance(other, Shrine): + self._competitors.add(other) + other._competitors.add(self) + + +class Road(Resource): + + def __init__(self, card, inn=False): + super().__init__(card) + self._inn = inn + + def get_score(self, game_end): + r = self.root() + if r._inn: + return (2 * len(r.cards)) if not game_end else 0 + else: + return len(r.cards) + + def join(self, other): + a = self.root() + b = other.root() + joined = super().join(other) + joined._inn = a._inn or b._inn + return joined + + +class City(Resource): + + def __init__(self, card, cathedral=False): + super().__init__(card) + self._cathedral = cathedral + + def get_score(self, game_end): + r = self.root() + score = sum([2 if c.city_defense else 1 for c in r.cards]) + if r._cathedral: + return (score * 3) if not game_end else 0 + else: + return (score * 2) if not game_end else score + + def join(self, other): + a = self.root() + b = other.root() + joined = super().join(other) + joined._cathedral = a._cathedral or b._cathedral + return joined + + +class Pasture(Resource): + + def __init__(self, card): + super().__init__(card) + + def complete(self, game_end, players): + if not game_end: + return + return super().complete(game_end, players) + + def get_score(self, game_end): + if not game_end: + return 0 + r = self.root() + cities = set() + for card in r.cards: + if card.pasture_tl and card.pasture_tl.root() is self and card.city_left and card.city_left.completed_before_end: + cities.add(card.city_left.root().uuid()) + if card.pasture_tr and card.pasture_tr.root() is self and card.city_right and card.city_right.completed_before_end: + cities.add(card.city_right.root().uuid()) + if card.pasture_rt and card.pasture_rt.root() is self and card.city_top and card.city_top.completed_before_end: + cities.add(card.city_top.root().uuid()) + if card.pasture_rb and card.pasture_rb.root() is self and card.city_bottom and card.city_bottom.completed_before_end: + cities.add(card.city_bottom.root().uuid()) + if card.pasture_br and card.pasture_br.root() is self and card.city_right and card.city_right.completed_before_end: + cities.add(card.city_right.root().uuid()) + if card.pasture_bl and card.pasture_bl.root() is self and card.city_left and card.city_left.completed_before_end: + cities.add(card.city_left.root().uuid()) + if card.pasture_lb and card.pasture_lb.root() is self and card.city_bottom and card.city_bottom.completed_before_end: + cities.add(card.city_bottom.root().uuid()) + if card.pasture_lt and card.pasture_lt.root() is self and card.city_top and card.city_top.completed_before_end: + cities.add(card.city_top.root().uuid()) + return 3 * len(cities) + + +def p(r, symbol, other, players): + if not r: + return other + owners = {} + for follower in r.root().owners: + owners.setdefault(follower.player.uuid, 0) + owners[follower.player.uuid] += 1 + max_p, _ = max(owners.items(), key=lambda x: x[1], default=(None, 0)) + if max_p: + return players[max_p].color.value.ansi + symbol + '\033[0m' + return symbol + +class CarcassonneField: + + def __init__(self): + self._min_x = 0 + self._max_x = 0 + self._min_y = 0 + self._max_y = 0 + self._field = {} + self._resources = {} + self.place_card(0, 0, Card(road_left=3, road_right=3, city_top=4, pasture_br=2, pasture_bl=2, pasture_lt=1, pasture_rt=1, pasture_rb=2, pasture_lb=2, template='121')) + + def can_place_card(self, x, y, card): + if self._field.get((x, y)): + raise KeyError(f'There already is a card at ({x}, {y})') + left = self._field.get((x-1, y)) + top = self._field.get((x, y-1)) + right = self._field.get((x+1, y)) + bottom = self._field.get((x, y+1)) + # Don't enforce placement rules for the first tile + if x != 0 or y != 0: + if not left and not top and not right and not bottom: + raise KeyError(f'There is no card around ({x}, {y})') + card.can_place(self._field, x, y) + + def place_card(self, x, y, card): + self.can_place_card(x, y, card) + left = self._field.get((x-1, y)) + top = self._field.get((x, y-1)) + right = self._field.get((x+1, y)) + bottom = self._field.get((x, y+1)) + card.road_left.boundaries.add((x, y, ResourceBoundary.LEFT)) if card.road_left else None + card.road_top.boundaries.add((x, y, ResourceBoundary.TOP)) if card.road_top else None + card.road_right.boundaries.add((x, y, ResourceBoundary.RIGHT)) if card.road_right else None + card.road_bottom.boundaries.add((x, y, ResourceBoundary.BOTTOM)) if card.road_bottom else None + card.city_left.boundaries.add((x, y, ResourceBoundary.LEFT)) if card.city_left else None + card.city_top.boundaries.add((x, y, ResourceBoundary.TOP)) if card.city_top else None + card.city_right.boundaries.add((x, y, ResourceBoundary.RIGHT)) if card.city_right else None + card.city_bottom.boundaries.add((x, y, ResourceBoundary.BOTTOM)) if card.city_bottom else None + card.pasture_lt.boundaries.add((x, y, ResourceBoundary.LEFT_TOP)) if card.pasture_lt else None + card.pasture_tl.boundaries.add((x, y, ResourceBoundary.TOP_LEFT)) if card.pasture_tl else None + card.pasture_tr.boundaries.add((x, y, ResourceBoundary.TOP_RIGHT)) if card.pasture_tr else None + card.pasture_rt.boundaries.add((x, y, ResourceBoundary.RIGHT_TOP)) if card.pasture_rt else None + card.pasture_rb.boundaries.add((x, y, ResourceBoundary.RIGHT_BOTTOM)) if card.pasture_rb else None + card.pasture_br.boundaries.add((x, y, ResourceBoundary.BOTTOM_RIGHT)) if card.pasture_br else None + card.pasture_bl.boundaries.add((x, y, ResourceBoundary.BOTTOM_LEFT)) if card.pasture_bl else None + card.pasture_lb.boundaries.add((x, y, ResourceBoundary.LEFT_BOTTOM)) if card.pasture_lb else None + + if card.road_left and left and left.road_right: + j = card.road_left.join(left.road_right) + j.boundaries.discard((x, y, ResourceBoundary.LEFT)) + j.boundaries.discard((x-1, y, ResourceBoundary.RIGHT)) + if card.road_top and top and top.road_bottom: + j = card.road_top.join(top.road_bottom) + j.boundaries.discard((x, y, ResourceBoundary.TOP)) + j.boundaries.discard((x, y-1, ResourceBoundary.BOTTOM)) + if card.road_right and right and right.road_left: + j = card.road_right.join(right.road_left) + j.boundaries.discard((x, y, ResourceBoundary.RIGHT)) + j.boundaries.discard((x+1, y, ResourceBoundary.LEFT)) + if card.road_bottom and bottom and bottom.road_top: + j = card.road_bottom.join(bottom.road_top) + j.boundaries.discard((x, y, ResourceBoundary.BOTTOM)) + j.boundaries.discard((x, y+1, ResourceBoundary.TOP)) + + if card.city_left and left and left.city_right: + j = card.city_left.join(left.city_right) + j.boundaries.discard((x, y, ResourceBoundary.LEFT)) + j.boundaries.discard((x-1, y, ResourceBoundary.RIGHT)) + if card.city_top and top and top.city_bottom: + j = card.city_top.join(top.city_bottom) + j.boundaries.discard((x, y, ResourceBoundary.TOP)) + j.boundaries.discard((x, y-1, ResourceBoundary.BOTTOM)) + if card.city_right and right and right.city_left: + j = card.city_right.join(right.city_left) + j.boundaries.discard((x, y, ResourceBoundary.RIGHT)) + j.boundaries.discard((x+1, y, ResourceBoundary.LEFT)) + if card.city_bottom and bottom and bottom.city_top: + j = card.city_bottom.join(bottom.city_top) + j.boundaries.discard((x, y, ResourceBoundary.BOTTOM)) + j.boundaries.discard((x, y+1, ResourceBoundary.TOP)) + + if card.pasture_lt and left and left.pasture_rt: + j = card.pasture_lt.join(left.pasture_rt) + j.boundaries.discard((x, y, ResourceBoundary.LEFT_TOP)) + j.boundaries.discard((x-1, y, ResourceBoundary.RIGHT_TOP)) + if card.pasture_tl and top and top.pasture_bl: + j = card.pasture_tl.join(top.pasture_bl) + j.boundaries.discard((x, y, ResourceBoundary.TOP_LEFT)) + j.boundaries.discard((x, y-1, ResourceBoundary.BOTTOM_LEFT)) + if card.pasture_rt and right and right.pasture_lt: + j = card.pasture_rt.join(right.pasture_lt) + j.boundaries.discard((x, y, ResourceBoundary.RIGHT_TOP)) + j.boundaries.discard((x+1, y, ResourceBoundary.LEFT_TOP)) + if card.pasture_tr and top and top.pasture_br: + j = card.pasture_tr.join(top.pasture_br) + j.boundaries.discard((x, y, ResourceBoundary.TOP_RIGHT)) + j.boundaries.discard((x, y-1, ResourceBoundary.BOTTOM_RIGHT)) + if card.pasture_rb and right and right.pasture_lb: + j = card.pasture_rb.join(right.pasture_lb) + j.boundaries.discard((x, y, ResourceBoundary.RIGHT_BOTTOM)) + j.boundaries.discard((x+1, y, ResourceBoundary.LEFT_BOTTOM)) + if card.pasture_br and bottom and bottom.pasture_tr: + j = card.pasture_br.join(bottom.pasture_tr) + j.boundaries.discard((x, y, ResourceBoundary.BOTTOM_RIGHT)) + j.boundaries.discard((x, y+1, ResourceBoundary.TOP_RIGHT)) + if card.pasture_lb and left and left.pasture_rb: + j = card.pasture_lb.join(left.pasture_rb) + j.boundaries.discard((x, y, ResourceBoundary.LEFT_BOTTOM)) + j.boundaries.discard((x-1, y, ResourceBoundary.RIGHT_BOTTOM)) + if card.pasture_bl and bottom and bottom.pasture_tl: + j = card.pasture_bl.join(bottom.pasture_tl) + j.boundaries.discard((x, y, ResourceBoundary.BOTTOM_LEFT)) + j.boundaries.discard((x, y+1, ResourceBoundary.TOP_LEFT)) + + self._field[(x, y)] = card + card.placed = True + card.x = x + card.y = y + self._min_x = min(self._min_x, x) + self._max_x = max(self._max_x, x) + self._min_y = min(self._min_y, y) + self._max_y = max(self._max_y, y) + completed_resources = set() + for r in card.resources.values(): + r = r.root() + self._resources[r.uuid] = r + if len(r.boundaries) == 0 and not isinstance(r, Monastery): + completed_resources.add(r) + # special handling for monasteries, as they can't be joined and require diagonally adjacent tiles + if card.monastery: + card.monastery._score = len([1 for i in range(x-1, x+2) for j in range(y-1, y+2) if (i, j) in self._field]) -1 + for c in [self._field[(i, j)] for i in range(x-1, x+2) for j in range(y-1, y+2) if (i, j) in self._field]: + if c.monastery: + c.monastery._score += 1 + if card.monastery: + c.monastery.add_competitor(card.monastery) + if c.monastery._score == 9: + completed_resources.add(c.monastery) + return completed_resources + + def get_available_fields(self, card=None): + empty_fields = set() + for x, y in self._field.keys(): + for ax, ay in [(x-1,y), (x,y-1), (x+1,y), (x,y+1)]: + if card: + try: + self.can_place_card(ax, ay, card) + except: + continue + empty_fields.add((ax, ay)) + for c in self._field.keys(): + empty_fields.discard(c) + return empty_fields + + + def svg(self, env, claimable, new_card, followers, phase, controls): + empty_fields = self.get_available_fields(new_card if phase == Phase.PLACE else None) + cards = [] + empties = [] + follows = [] + for coord, card in self._field.items(): + if controls and card is new_card and phase == Phase.CLAIM: + claim = claimable + else: + claim = {} + x, y = coord + gx = x - self._min_x + 1 + gy = y - self._min_y + 1 + cards.append(card.svg(env, standalone=False, x=gx, y=gy, claimable=claim, highlight=card is new_card)) + if controls and phase == Phase.PLACE: + for x, y in empty_fields: + empties.append((x, y, (x-self._min_x+1)*100, (y-self._min_y+1)*100)) + for follower in followers: + follows.append(follower.svg(env, -self._min_x+1, -self._min_y+1)) + tmpl = env.get_template('carcassonne/field.svg') + return tmpl.render(width=self._max_x-self._min_x+3, height=self._max_y-self._min_y+3, cards=cards, empties=empties, follows=follows) + + + def print_board(self, next_card=None, players={}): + width = (self._max_x - self._min_x + 3) * 4 + 1 + height = (self._max_y - self._min_y + 3) * 4 + 1 + chrs = [[' ' for x in range(width)] for y in range(height)] + for x in range(0, width, 4): + for y in range(height): + chrs[y][x] = '│' + for y in range(0, height, 4): + for x in range(width): + chrs[y][x] = '─' if x % 4 != 0 else '┼' + items = list(self._field.items()) + if next_card: + items.append(((self._min_x-1, self._min_y-1), next_card)) + for coord, card in items: + x, y = coord + x = (x - self._min_x + 1) * 4 + 2 + y = (y - self._min_y + 1) * 4 + 2 + chrs[y-1][x] = p(card.road_top, '=', chrs[y-1][x], players) + chrs[y-1][x] = p(card.city_top, '#', chrs[y-1][x], players) + chrs[y][x-1] = p(card.road_left, '=', chrs[y][x-1], players) + chrs[y][x-1] = p(card.city_left, '#', chrs[y][x-1], players) + chrs[y][x] = p(card.monastery, 'M', chrs[y][x], players) + chrs[y][x+1] = p(card.road_right, '=', chrs[y][x+1], players) + chrs[y][x+1] = p(card.city_right, '#', chrs[y][x+1], players) + chrs[y+1][x] = p(card.road_bottom, '=', chrs[y+1][x], players) + chrs[y+1][x] = p(card.city_bottom, '#', chrs[y+1][x], players) + for line in chrs: + print(''.join(line)) + + +class Player: + + def __init__(self, uuid, i): + self.uuid = uuid + self.color = list(Color)[i] + self.score = 0 + self.followers = [Follower(self) for _ in range(7)] + + +class Follower: + + def __init__(self, player): + self.uuid = uuid4() + self.player = player + self.resource = None + self.cx = None + self.cy = None + self.lx = 50 + self.ly = 50 + + def claim(self, r, card): + if self.resource is not None: + raise RuntimeError('Follower already claimed') + self.resource = r.root() + self.cx = card.x + self.cy = card.y + self.lx = 50 + self.ly = 50 + if card.road_top is r or card.city_top is r: + self.ly = 15 + elif card.road_bottom is r or card.city_bottom is r: + self.ly = 85 + elif card.road_left is r or card.city_left is r: + self.lx = 15 + elif card.road_right is r or card.city_right is r: + self.lx = 85 + elif card.pasture_lt is r: + self.lx = 15 + self.ly = 25 + elif card.pasture_tl is r: + self.lx = 25 + self.ly = 15 + elif card.pasture_rt is r: + self.lx = 85 + self.ly = 25 + elif card.pasture_tr is r: + self.lx = 75 + self.ly = 15 + elif card.pasture_lb is r: + self.lx = 15 + self.ly = 75 + elif card.pasture_bl is r: + self.lx = 25 + self.ly = 85 + elif card.pasture_rb is r: + self.lx = 85 + self.ly = 75 + elif card.pasture_br is r: + self.lx = 75 + self.ly = 85 + + def svg(self, env, xoff, yoff): + if self.cx is None or self.cy is None or self.resource is None: + return '' + if isinstance(self.resource, Pasture): + tmpl = env.get_template(f'carcassonne/follower_pasture.svg') + else: + tmpl = env.get_template(f'carcassonne/follower.svg') + return tmpl.render(x=(self.cx+xoff)*100, y=(self.cy+yoff)*100, lx=self.lx, ly=self.ly, color=self.player.color.value.html) + + +class Carcassonne(Puzzle): + + def __init__(self, pargs = None): + super().__init__('carcassonne', self.__class__) + if not pargs: + pargs = {} + self._players = {} + self._followers = [] + self._scores = {} + self._turn_order = [] + self._turn = 0 + self._phase = Phase.PLACE + self._done = False + self._card = None + self._claimable = {} + self._completed_resources = set() + self._completed_pastures = set() + self._field = CarcassonneField() + self._urlbase = '/' + + def add_player(self, uuid: UUID) -> None: + p = Player(uuid, len(self._turn_order)) + self._players[uuid] = p + self._followers.extend(p.followers) + self._turn_order.append(uuid) + self._turn += 1 + + def get_extra_options_html(self) -> str: + return ''' +

Extensions

+ +
+ +
+ +
+''' + + def begin(self, options, urlbase): + self._urlbase = urlbase + self._deck = Card.generate_deck(options.getall('extensions'), self._field) + random.shuffle(self._turn_order) + self.next_turn() + + def _check_done(self): + if self._done or len(self._deck) > 0 or self._card is not None: + return + self._done = True + for r in self._field._resources.values(): + if r.completed: + continue + r.complete(True, self._players) + self._completed_pastures = set() + for r in self._field._resources.values(): + r = r.root() + if r.completed and len(r.owners) > 0: + self._completed_pastures.add(r.uuid()) + + def next_turn(self): + self._claimable = {} + for r in self._completed_resources: + r.complete(False, self._players) + self._completed_resources.clear() + self._phase = Phase.PLACE + self._turn = (self._turn + 1) % len(self._turn_order) + try: + # Discard cards that can't be placed + placeable = False + discarded = [] + card = None + while not placeable: + if card is not None: + discarded.insert(0, card) + card = self._deck.pop() + for _ in range(4): + if len(self._field.get_available_fields(card)) > 0: + placeable = True + break + card.rotate_cw() + # Return the discarded cards to the deck + self._deck.extend(discarded) + self._card = card + except IndexError: + self._card = None + self._check_done() + + def process_action(self, puuid, action) -> None: + try: + act = action.get('action', None) + if puuid != self._turn_order[self._turn]: + return + if act == 'Rotate CW': + if self._phase != Phase.PLACE: + return + self._card.rotate_cw() + if act == 'Rotate CCW': + if self._phase != Phase.PLACE: + return + self._card.rotate_ccw() + if act == 'Place Tile': + if self._phase != Phase.PLACE: + return + x = int(action.get('x')) + y = int(action.get('y')) + self._completed_resources = self._field.place_card(x, y, self._card) + self._claimable = {r.uuid(): r.root() for r in self._card.resources.values() if len(r.root().owners) == 0} + if len(self._claimable) > 0 and len([f for f in self._players[puuid].followers if f.resource is None]) > 0: + self._phase = Phase.CLAIM + else: + self.next_turn() + if act == 'Claim': + if self._phase != Phase.CLAIM: + return + cuuid = action.get('claim') + if cuuid: + cuuid = UUID(hex=cuuid) + self._claimable[cuuid].claim(self._players[puuid], self._card) + self.next_turn() + except BaseException as e: + print(e) + + def serialize(self, player): + # todo + return {} + + def render(self, env, game, player, duration): + show_controls = player.uuid == self._turn_order[self._turn] and not self._done + field = self._field.svg(env, self._claimable, self._card, self._followers, self._phase, show_controls) + card = '' + claimable = '' + if self._card and self._phase == Phase.PLACE: + card = self._card.svg(env, standalone=True) + if self._claimable and self._phase == Phase.CLAIM: + claimable = '\n ' + '\n '.join([f'' for r in self._claimable.values()]) + tmpl = env.get_template('carcassonne/carcassonne.html.j2') + return tmpl.render(field=field, card=card, claimable=claimable, phase='place' if self._phase == Phase.PLACE else 'claim', + players=self._players.values(), me=self._players[player.uuid], + current_player=self._players[self._turn_order[self._turn]], + game=game, done=self._done, + completed_pastures=self._completed_pastures, deck=self._deck, + baseurl=self._urlbase) + + @property + def human_name(self) -> str: + return 'Carcassonne' + + @property + def scores(self): + return sorted( + [{'player': uuid, 'score': player.score} for uuid, player in self._players.items()], + key=lambda x: x['score'], reverse=True) + + @property + def is_completed(self) -> bool: + return self._done + + +Carcassonne() diff --git a/webgames/game.py b/webgames/game.py new file mode 100644 index 0000000..3052827 --- /dev/null +++ b/webgames/game.py @@ -0,0 +1,105 @@ +from typing import Any, Dict, List + +from enum import Enum +from uuid import uuid4, UUID +from datetime import datetime + +from webgames.puzzle import Puzzle + +from webgames.sudoku_puzzle import Sudoku +from webgames.set_puzzle import SetPuzzle +from webgames.carcassonne import Carcassonne +from webgames.player import Player +from webgames.human import HumanID + + +class GameState(Enum): + LOBBY = 0 + RUNNING = 1 + FINISHED = 2 + + +class Game: + + def __init__(self, puzzle: str, puzzle_args: Dict[str, Any] = None) -> None: + self._uuid: UUID = uuid4() + self._human_id: HumanId = HumanID(self.uuid) + self._players: Dict[UUID, Player] = {} + self._puzzle: Puzzle = Puzzle.create(puzzle, puzzle_args) + self._start: datetime = None + self._end: datetime = None + self._state = GameState.LOBBY + + def join(self, player: Player) -> None: + if self._state != GameState.LOBBY: + raise RuntimeError(f'Can\'t join a game in {self._state} state') + player.game = self + self._players[player.uuid] = player + self._puzzle.add_player(player.uuid) + + def render(self, env, player, duration): + return self._puzzle.render(env, self, player, duration) + + def get_extra_options_html(self) -> str: + return self._puzzle.get_extra_options_html() + + def begin(self, options, urlbase) -> None: + if self._state != GameState.LOBBY: + raise RuntimeError(f'Can\'t start a game in {self._state} state') + self._start = datetime.utcnow() + self._state = GameState.RUNNING + self._puzzle.begin(options, urlbase) + + def conclude(self) -> None: + if self._state == GameState.FINISHED: + raise RuntimeError(f'Can\'t start a game in {self._state} state') + if not self._start: + self._start = datetime.utcnow() + self._end = datetime.utcnow() + self._state = GameState.FINISHED + + def process_action(self, player: UUID, action) -> None: + if self._state != GameState.RUNNING: + raise RuntimeError(f'Can\'t process a game action in {self._state} state') + self._puzzle.process_action(player, action) + + def serialize_puzzle(self, player: UUID) -> None: + if self._state != GameState.RUNNING: + raise RuntimeError(f'Can\'t fetch a player puzzle in {self._state} state') + return self._puzzle.serialize(player) + + @property + def uuid(self) -> UUID: + return self._uuid + + @property + def human_id(self) -> HumanID: + return self._human_id + + @property + def puzzle_name(self): + return self._puzzle.human_name + + @property + def puzzle(self): + return self._puzzle + + @property + def players(self) -> Dict[UUID, Player]: + return self._players + + @property + def scoreboard(self) -> List[Any]: + return self._puzzle.scores + + @property + def state(self) -> GameState: + return self._state + + @property + def start(self) -> datetime: + return self._start + + @property + def end(self) -> datetime: + return self._end diff --git a/webgames/human.py b/webgames/human.py new file mode 100644 index 0000000..8251240 --- /dev/null +++ b/webgames/human.py @@ -0,0 +1,57 @@ + +import uuid +import hashlib +from functools import reduce + + +class HumanID: + + _CODE = { + 0: 'A', + 1: 'B', + 2: 'F', + 3: 'H', + 4: 'J', + 5: 'K', + 6: 'L', + 7: 'M', + 8: 'P', + 9: 'Q', + 10: 'R', + 11: 'S', + 12: 'T', + 13: 'U', + 14: 'X', + 15: 'Z' + } + + _resolver = {} + + def __init__(self, longid: uuid.UUID = None) -> None: + if not longid: + longid = uuid.uuid4() + sha = hashlib.sha1(longid.bytes).digest() + e = reduce(lambda a,b: a^b, [e for e in sha[::2]], 0) + o = reduce(lambda a,b: a^b, [o for o in sha[1::2]], 0) + nibbles = [(e & 0xf0) >> 4, e & 0x0f, (o & 0xf0) >> 4, o & 0x0f] + self._human_id = ''.join([HumanID._CODE[i] for i in nibbles]) + self._uuid = longid + HumanID._resolver[self._human_id] = self._uuid + + def __del__(self) -> None: + HumanID._resolver[self._human_id] + + @classmethod + def resolve(cls, human_id: str) -> uuid.UUID: + return cls._resolver[human_id] + + def __str__(self) -> str: + return self._human_id + + @property + def human_id(self) -> str: + return self._human_id + + @property + def uuid(self) -> uuid.UUID: + return self._uuid diff --git a/webgames/player.py b/webgames/player.py new file mode 100644 index 0000000..ed5f61c --- /dev/null +++ b/webgames/player.py @@ -0,0 +1,23 @@ +from uuid import uuid4, UUID + +from namesgenerator import get_random_name + + +class Player: + + def __init__(self, name: str = None) -> None: + if name is None: + name = get_random_name(' ').title() + self._uuid: UUID = uuid4() + self._name: str = name + + @property + def uuid(self) -> UUID: + return self._uuid + + @property + def name(self) -> str: + return self._name + + def __repr__(self) -> str: + return f'Player({self._name})' diff --git a/webgames/puzzle.py b/webgames/puzzle.py new file mode 100644 index 0000000..4fbb7ca --- /dev/null +++ b/webgames/puzzle.py @@ -0,0 +1,50 @@ + +from typing import Any, Dict + +import abc + +from uuid import UUID + + +_PUZZLES = {} + + +class Puzzle(abc.ABC): + + def __init__(self, name, clazz) -> None: + global _PUZZLES + _PUZZLES[name] = clazz + + def get_extra_options_html(self) -> str: + return '' + + def add_player(self, uuid: UUID) -> None: + pass + + def begin(self, options: Dict[str, Any], urlbase: str) -> None: + pass + + def process_action(self, player, action) -> None: + pass + + def serialize(self, player): + pass + + def render(self, env, game, player, duration): + pass + + @property + def human_name(self) -> str: + pass + + @property + def scores(self): + pass + + @property + def is_completed(self) -> bool: + pass + + @staticmethod + def create(puzzle: str, args) -> 'Puzzle': + return _PUZZLES[puzzle](args) diff --git a/webgames/set_puzzle.py b/webgames/set_puzzle.py new file mode 100644 index 0000000..11d1dc6 --- /dev/null +++ b/webgames/set_puzzle.py @@ -0,0 +1,206 @@ +import random +import enum +from uuid import UUID + +from webgames.puzzle import Puzzle + + +class _Color: + + def __init__(self, name, html): + self.name = name + self.html = html + + +class Infill(enum.Enum): + NONE = 1 + SEMI = 2 + FULL = 3 + + +class Count(enum.Enum): + ONE = 1 + TWO = 2 + THREE = 3 + + +class Shape(enum.Enum): + RECTANGLE = 1 + TILDE = 2 + ELLIPSE = 3 + + +class Color(enum.Enum): + RED = _Color('red', '#ff0000') + GREEN = _Color('green', '#00ff00') + BLUE = _Color('blue', '#0000ff') + + +class Card: + + def __init__(self, infill, count, shape, color): + self.infill = infill + self.count = count + self.shape = shape + self.color = color + + def __repr__(self) -> str: + return f'' + + def serialize(self): + return { + 'infill': self.infill.name, + 'count': self.count.name, + 'shape': self.shape.name, + 'color': self.color.name + } + + @staticmethod + def validate_set(c1, c2, c3): + return sum([ + len(x) == 1 or len(x) == 3 + for x in [ + { c1.infill, c2.infill, c3.infill }, + { c1.count, c2.count, c3.count }, + { c1.shape, c2.shape, c3.shape }, + { c1.color, c2.color, c3.color } + ] + ]) == 4 + + @staticmethod + def generate_deck(): + deck = [ + Card(infill, count, shape, color) + for infill in Infill + for count in Count + for shape in Shape + for color in Color + ] + random.shuffle(deck) + return deck + + +class SetPuzzle(Puzzle): + + def __init__(self, pargs = None): + super().__init__('set', self.__class__) + if not pargs: + pargs = {} + self._players = {} + self._scores = {} + self._deck = Card.generate_deck() + self._playing_field = [] + self._draw_votes = set() + self._draw_majority = 0 + self._done = False + self._draw(9) + self._urlbase = '/' + + def get_extra_options_html(self) -> str: + return '' + + def add_player(self, uuid: UUID) -> None: + self._players[uuid] = [] + self._scores[uuid] = 0 + self._draw_majority = int(-(-(len(self._players)+0.5)//2)) + + def begin(self, options, urlbase): + self._urlbase = urlbase + + def _draw(self, n: int = 3, append=True): + ret = [] + for i in range(n): + try: + card = self._deck.pop() + except IndexError: + break + ret.append(card) + if append: + self._playing_field.append(card) + self._draw_votes.clear() + return ret + + def _check_done(self): + if self._done or len(self._deck) > 0: + return + for i1 in range(0, len(self._playing_field)-2): + for i2 in range(i1+1, len(self._playing_field)-1): + for i3 in range(i2+1, len(self._playing_field)): + if Card.validate_set(self._playing_field[i1], self._playing_field[i2], self._playing_field[i3]): + # There is still a valid set - not done yet + return + self._done = True + + def process_action(self, player, action) -> None: + act = action.get('action', None) + if act == 'Draw 3': + self._draw_votes.add(player) + if len(self._draw_votes) >= self._draw_majority: + self._draw() + self._check_done() + elif act == 'Set!': + ci = [int(x) for x in action.getall('set')] + cards = [self._playing_field[i] for i in ci] + if len(cards) != 3: + return + if Card.validate_set(*cards): + self._scores[player] += 3 + new = self._draw(append=False) + for card, i in zip(cards, ci): + try: + self._playing_field[i] = new.pop() + except IndexError: + self._playing_field.remove(card) + self._players[player].append(card) + self._check_done() + else: + self._scores[player] -= 1 + self._draw_votes.clear() + + def serialize(self, player): + return { + 'field': [x.serialize() for x in self._playing_field], + 'players': sorted([{ + 'name': x, + 'score': self._scores[x], + 'cards': [y.serialize() for y in self._players[x][-3:]] + } for x in self._players.keys()], key=lambda x: x['score'], reverse=True), + 'deck': len(self._deck), + 'draw': { + 'votes': len(self._draw_votes), + 'majority': self._draw_majority + }, + 'done': self._done + } + + def render(self, env, game, player, duration): + tmpl = env.get_template('cwa/set.html.j2') + return tmpl.render(player=player, + game=game, + duration=duration, + cards=self._playing_field, + deck=self._deck, + lastset={k: v[-3:] for k, v in self._players.items()}, + draw_votes=len(self._draw_votes), + draw_majority=self._draw_majority, + Color=Color, + Shape=Shape, + Infill=Infill, + baseurl=self._urlbase) + + @property + def human_name(self) -> str: + return 'Set' + + @property + def scores(self): + return sorted( + [{'player': k, 'score': v} for k, v in self._scores.items()], + key=lambda x: x['score'], reverse=True) + + @property + def is_completed(self) -> bool: + return self._done + + +SetPuzzle() diff --git a/webgames/sudoku_puzzle.py b/webgames/sudoku_puzzle.py new file mode 100644 index 0000000..6351ec4 --- /dev/null +++ b/webgames/sudoku_puzzle.py @@ -0,0 +1,169 @@ +from typing import Any, Dict + +from uuid import UUID + +from sudokugen.solver import solve, NoSolution +from sudoku_manager import Sudoku as SudokuManager + +from webgames.puzzle import Puzzle + +class Sudoku: + + def __init__(self, difficulty: int = 2) -> None: + self._solved = False + self.grid = SudokuManager.generate_grid(difficulty) + self.original = [[col is not None for col in row] for row in self.grid] + + def put(self, row: int, col: int, value: int) -> None: + if self.original[row-1][col-1]: + raise KeyError(f'Cell ({row},{col}) is part of the original grid') + if value == 0: + value = None + if value is not None and value not in range(10): + raise ValueError(f'Don\'t understand value {value}') + self.grid[row-1][col-1] = value + + def get(self, row: int, col: int) -> int: + return self.grid[row-1][col-1] + + def begin(self): + pass + + def make_instance(self) -> 'Sudoku': + grid = [[None for i in range(9)] for i in range(9)] + for row in range(9): + for col in range(9): + if self.original[row][col]: + grid[row][col] = self.grid[row][col] + else: + grid[row][col] = None + s = Sudoku() + s.grid = grid + s.original = self.original + return s + + def process_action(self, action: Dict[str, Any]) -> None: + field = action['sudoku-field'] + row = int(field[:1]) + col = int(field[1:]) + number = action['number'] + if number == 'Delete': + self.put(row, col, None) + else: + self.put(row, col, int(number)) + + def serialize(self) -> Dict[str, Any]: + return { + 'grid': self.grid, + 'original': self.original, + 'filled': self.filled, + 'solved': self.solved + } + + @property + def filled(self) -> bool: + if self._solved: + return True + return len([1 for row in self.grid for col in row if col is None]) == 0 + + @property + def solved(self) -> bool: + if not self.filled: + return False + if self._solved: + return True + try: + solve(self.grid) + self._solved = True + except NoSolution: + return False + return True + + @property + def progress(self) -> float: + n = len([1 for row in self.original for col in row if not col]) + i = len([1 for row in self.grid for col in row if col is None]) + return 1 - i/n + + +class SudokuPuzzle(Puzzle): + + def __init__(self, pargs = None): + super().__init__('sudoku', self.__class__) + if not pargs: + pargs = {} + self._puzzles: Dict[UUID, Sudoku] = {} + self._scores: List[Any] = [] + self._urlbase = '/' + + def begin(self, options: Dict[str, Any], urlbase): + difficulty = int(options.get('sudoku-input-difficulty', '2')) + self._urlbase = urlbase + self._puzzle = Sudoku(difficulty) + for p in self._puzzles.keys(): + self._puzzles[p] = self._puzzle.make_instance() + + def get_extra_options_html(self) -> str: + return ''' + + +''' + + def add_player(self, uuid: UUID) -> None: + self._puzzles[uuid] = None + + def process_action(self, player, action) -> None: + cell = action.get('sudoku-field') + row, col = int(cell[0]), int(cell[1]) + v = action.get('number') + if v == 'Delete': + value = None + else: + value = int(v) + + puzzle = self._puzzles[player] + if puzzle.solved: + raise RuntimeError(f'Can\'t process a game action for a solved puzzle') + puzzle.process_action(action) + if puzzle.solved: + duration = datetime.utcnow() - self._start + self._scores.append({ + 'player': player, + 'duration': duration + }) + + def serialize(self, player): + puzzle = self._puzzles[player] + return puzzle.serialize() + + def render(self, env, game, player, duration): + puzzle = self._puzzles[player.uuid] + tmpl = env.get_template('cwa/sudoku.html.j2') + return tmpl.render(player=player, + game=game, + puzzle=puzzle, + duration=duration, + baseurl=self._urlbase) + + + @property + def human_name(self) -> str: + return 'Sudoku' + + @property + def puzzles(self): + return self._puzzles + + @property + def scores(self): + return self._scores + + @property + def is_completed(self) -> bool: + for x in self._puzzles.values(): + if not x.solved: + return False + return True + + +SudokuPuzzle()