diff --git a/games/__init__.py b/games/__init__.py index d57be9c..d566ed2 100644 --- a/games/__init__.py +++ b/games/__init__.py @@ -2,6 +2,7 @@ from .gamesman_classic import GamesmanClassic from .gamesman_puzzles import GamesmanPuzzles from .gamesman_one import GamesmanOne +from .gamesman_py import GamesmanPy from .chess import RegularChessVariant from .tootandotto import TootAndOtto from .nim import NimVariant, nim_custom_start @@ -266,6 +267,18 @@ }, gui='v3'), + 'clobber': Game( + name='Clobber', + variants={ + variant_id: Variant( + name=variant_id, + data_provider=GamesmanPy, + data_provider_game_id='clobber', + data_provider_variant_id=variant_id, + gui='v3') for variant_id in ['3x4', '3x6', '5x3', '5x4'] + }, + gui='v3'), + 'clocksolitaire': Game( name='Clock Solitaire', variants= { @@ -701,6 +714,27 @@ gui='v3', ), + 'horses': Game( + name="Horses", + variants={ + 'regular': Variant( + name='Regular', + data_provider=GamesmanPy, + data_provider_game_id='horses', + data_provider_variant_id='regular', + gui='v3', + ), + 'misere': Variant( + name='Misere', + data_provider=GamesmanPy, + data_provider_game_id='horses', + data_provider_variant_id='misere', + gui='v3', + ), + }, + gui='v3', + ), + 'hopndrop': Game( name="Hop N' Drop", variants= { @@ -1132,6 +1166,37 @@ gui='v3' ), + 'pancakes': Game( + name="Pancakes", + variants={ + '5': Variant( + name='5', + data_provider=GamesmanPy, + data_provider_game_id='pancakes', + data_provider_variant_id='5', + gui='v3'), + '6': Variant( + name='6', + data_provider=GamesmanPy, + data_provider_game_id='pancakes', + data_provider_variant_id='6', + gui='v3'), + '7': Variant( + name='7', + data_provider=GamesmanPy, + data_provider_game_id='pancakes', + data_provider_variant_id='7', + gui='v3'), + '8': Variant( + name='8', + data_provider=GamesmanPy, + data_provider_game_id='pancakes', + data_provider_variant_id='8', + gui='v3'), + }, + is_two_player_game=False, + gui='v3'), + 'ponghauki': Game( name="Pong Hau K'i", variants={ diff --git a/games/gamesman_py.py b/games/gamesman_py.py new file mode 100644 index 0000000..21c196e --- /dev/null +++ b/games/gamesman_py.py @@ -0,0 +1,30 @@ +import json, requests +from .models import DataProvider + +class GamesmanPy(DataProvider): + # Use first url when running on a different machine, + # use second when running on main gamesman server. + #url = "https://nyc.cs.berkeley.edu:9004/" + url = "http://localhost:9004/" + + def read_from_url(tempurl): + try: + response = requests.get(tempurl) + response.raise_for_status() + except Exception as err: + print(f'Error occurred: {err}') + return {} + return json.loads(response.content) + + def start_position(puzzle_id, variant_id): + print("Test") + tempurl = f"{GamesmanPy.url}{puzzle_id}/{variant_id}/start/" + data = GamesmanPy.read_from_url(tempurl) + return { + 'position': data.get('position', ''), + 'autoguiPosition': data.get('autoguiPosition', '') + } + + def position_data(puzzle_id, variant_id, position): + tempurl = f"{GamesmanPy.url}{puzzle_id}/{variant_id}/positions/?p={position}" + return GamesmanPy.read_from_url(tempurl) \ No newline at end of file diff --git a/games/image_autogui_data.py b/games/image_autogui_data.py index 8c766bb..b24b697 100644 --- a/games/image_autogui_data.py +++ b/games/image_autogui_data.py @@ -500,6 +500,33 @@ def get_chungtoi(variant_id): } } +def get_clobber(variant_id): + def get_theme(cols, rows): + return { + "defaultTheme": "regular", + "themes": { + "regular": { + "space": [cols, rows], + "centers": [[0.5 + i % cols, 0.5 + i // cols] for i in range(rows * cols)], + "background": f"clobber/{variant_id}.svg", + "charImages": { + "x": {"image": "general/blackpiece.svg", "scale": 1}, + "o": {"image": "general/whitepiece.svg", "scale": 1}, + }, + "arrowWidth": 0.1, + "sounds": { + "x": "general/slide.mp3", + }, + "animationType": "simpleSlides", + } + } + } + match variant_id: + case '3x4': return get_theme(3, 4) + case '3x6': return get_theme(3, 6) + case '5x3': return get_theme(5, 3) + case '5x4': return get_theme(5, 4) + def get_clock_solitaire(variant_id): scale = 1 arrowWidth = 0.15 @@ -1087,6 +1114,39 @@ def get_hobaggonu(variant_id): } } +def get_horses(variant_id): + centers = [ + [100, 30], + [149.4975, 50.5025], + [170, 100], + [149.4975, 149.4975], + [100, 170], + [50.5025, 149.4975], + [30, 100], + [50.5025, 50.5025], + [100, 100], + ] + return { + "defaultTheme": "regular", + "themes": { + "regular": { + "space": [200, 200], + "background": "horses/background.svg", + "centers": centers, + "charImages": { + "x": {"image": "general/bluepiece.svg", "scale": 25}, + "o": {"image": "general/redpiece.svg", "scale": 25}, + }, + "arrowWidth": 2.5, + "sounds": { + "x": "general/place.mp3", + "y": "general/slide.mp3", + }, + "animationType": "simpleSlides", + } + } + } + def get_jenga(variant_id): return { "defaultTheme": "simple", @@ -1682,6 +1742,41 @@ def get_othello(variant_id): } } +def get_pancakes(variant_id): + rows = int(variant_id) + height = 1.25 * rows + centers = [[8, height - 0.5 - (1.25 * i)] for i in range(rows)] + space = [16, height] + return { + "defaultTheme": "regular", + "themes": { + "regular": { + "space": space, + "centers": centers, + "charImages": { + "1": {"image": "pancakes/pancake1.svg", "scale": 15}, + "2": {"image": "pancakes/pancake2.svg", "scale": 15}, + "3": {"image": "pancakes/pancake3.svg", "scale": 15}, + "4": {"image": "pancakes/pancake4.svg", "scale": 15}, + "5": {"image": "pancakes/pancake5.svg", "scale": 15}, + "6": {"image": "pancakes/pancake6.svg", "scale": 15}, + "7": {"image": "pancakes/pancake7.svg", "scale": 15}, + "8": {"image": "pancakes/pancake8.svg", "scale": 15}, + "a": {"image": "pancakes/pancake1f.svg", "scale": 15}, + "b": {"image": "pancakes/pancake2f.svg", "scale": 15}, + "c": {"image": "pancakes/pancake3f.svg", "scale": 15}, + "d": {"image": "pancakes/pancake4f.svg", "scale": 15}, + "e": {"image": "pancakes/pancake5f.svg", "scale": 15}, + "f": {"image": "pancakes/pancake6f.svg", "scale": 15}, + "g": {"image": "pancakes/pancake7f.svg", "scale": 15}, + "h": {"image": "pancakes/pancake8f.svg", "scale": 15}, + }, + "sounds": {"x": "general/place.mp3"}, + "animationType": "entityFade" + } + } + } + def get_pegsolitaire(variant_id): scale = 18 arrowWidth = 2 @@ -2627,6 +2722,7 @@ def get_orbito(variant_id): "chinesechess": get_chinesechess, "chomp": get_chomp, "chopsticks": get_chopsticks, + "clobber": get_clobber, "clocksolitaire": get_clock_solitaire, "connect4": get_connect4, "connect4twist": get_connect4twist, @@ -2650,6 +2746,7 @@ def get_orbito(variant_id): "hareandhounds": get_hareandhounds, "hexapawn": get_hexapawn, "hobaggonu": get_hobaggonu, + "horses": get_horses, "jan": get_jan, "jenga": get_jenga, "joust": get_joust, @@ -2673,6 +2770,7 @@ def get_orbito(variant_id): "oddoreven": get_oddoreven, "orbito" : get_orbito, "othello": get_othello, + "pancakes": get_pancakes, "pegsolitaire": get_pegsolitaire, "ponghauki": get_ponghauki, "quickchess": get_quickchess,