diff --git a/ci-deps.prod.json b/ci-deps.prod.json index 93a214792..886760c73 100644 --- a/ci-deps.prod.json +++ b/ci-deps.prod.json @@ -1,6 +1,6 @@ { - "renderer": "1.0.0-ci-33584881740.0", - "recranks": "1.0.0-ci-33687599936.0", - "updatedAt": "2026-09-03T20:28:15.425Z", - "source": "ci-deps.prod.json" + "renderer": "1.0.0-ci-33995787246.0", + "updatedAt": "2026-09-05T22:25:38.071Z", + "source": "repository_dispatch", + "recranks": "1.0.0-ci-33687599936.0" } diff --git a/locales/en/apgames.json b/locales/en/apgames.json index 9a5e085df..e4f200a7f 100644 --- a/locales/en/apgames.json +++ b/locales/en/apgames.json @@ -618,6 +618,7 @@ "loa": "In the centre of the 9x9 board is a \"black hole.\". Landing on the black hole means the piece is removed from the game. Simultaneous connections are scored as a draw.", "magnate": "The terminology of some Magnate actions has been altered for clarity and brevity. Completely developing a new property is called the \"Buy\" action; purchasing a deed for a new property is called \"Deed\", developing deeds (that is, adding tokens to a deeded property, whether it results in the deed becoming fully developed or not) is called \"Add\". (Selling a card and trading suit tokens 3 for 1 are unchanged.)\n\nIn order to speed up the process of rolling for resources, there are two additional actions:\n* \"Prefer\" is for setting your preference of which suit token to take when a deed pays out on your opponent's roll. If you do not set an explicit preference, the code will choose the rarer token for you based on your non-crown suits and current supply of tokens. The currently preferred token is circled in the UI, but your personal preference is never visible to the other player.\n* \"Choose\" is a mandatory first action for collecting suit tokens when a deed pays out on your own roll. (In all cases where you need to choose a suit token that is not already among your tokens, you still click on the appropriate token pile.)\n\nBecause you can perform several actions during a ply in any order, there is also an \"Undo\" action to back out your most recent action, whether or not it was complete.\n\nNote that only the final resource die result is displayed, but the distribution of expected outcomes is still that of rolling 2d10 and taking the higher value. Taxation happens when the lower of 2d10 comes up 1; a suit die is rolled (or two, in the double taxation variant), and the suits will be displayed underneath the resource result. The roll is logged at the end of a player's turn, and is attributed to the next player (who would have rolled in the physical game). Except for a \"Choose\", no user action is required; resources are added or removed automatically by the server in between turns.\n\nWhen a player is ahead in a district, the Pawn or Excuse for that district is outlined in that player's color. The first tiebreaker score (total property value) is displayed in parentheses after the district score. The second tiebreaker is total number of tokens remaining.", "mchess": "If there have been seven consecutive turns without a capture, someone can \"call the clock\" by adding an asterisk (*) to the end of their move. This can only be done by selecting the move from the drop-down list. After another seven turns with no capture, the game will end and be scored.", + "mirador": "Declaring takes your entire turn. Complete your unassailable connection first, then declare on your next turn; you cannot place a mirador and declare on the same turn.", "murus": "The default ruleset is \"Advanced Murus Gallicus\" (with catapults). By default, your first move is to redistribute one of your starting towers as walls on your second row. Additionally, the standard pie rule is also available. There are three variants you can mix and match:\n\n* \"Basic\" reverts the game to the \"no catapult\" state.\n* \"Static\" disables the initial tower redistribution.\n* \"Escape\" eliminates the breakthrough win condition.", "mutternland": "Mutternland was designed by Hartmut Witt in 1997. This implementation deals differently with the initial piece placements. While the original game had players, in the setup, place one _enemy_ piece per turn, here players place one friendly piece and then one opponent piece (including some restrictions to prevent unbalanced starts due to the random generation of the playing field). This makes the setup faster and provides some control of the player's own pieces. Also, pushed-off pieces, which go back to the player's reserve, are placed again by the owner.", "narrows": "Narrows, designed by Mark Steere in 2026, is an unification game inspired by the ancient Hawiian game of Kōnane. True to the spirit of Kōnane, Ūnane begins with a checkerboard pattern of stones and is extremely simple. In this case, the unification goal includes the use of orthogonal paths of empty cells to connect different groups of friendly pieces.", diff --git a/locales/eo/apgames.json b/locales/eo/apgames.json index 4aca87d2f..b0051de41 100644 --- a/locales/eo/apgames.json +++ b/locales/eo/apgames.json @@ -4620,6 +4620,7 @@ "loa": "En la centro de la tabulo 9×9 estas „nigra truo“. Peco, kiu alteriĝas sur la nigra truo, estas forigita el la ludo. Samtempaj konektoj rezultigas egalvenkon.", "magnate": "La nomoj de kelkaj agoj en Magnate estas ŝanĝitaj por klareco kaj koncizeco. Plene evoluigi novan posedaĵon nomiĝas „Aĉeti“; aĉeti akton por nova posedaĵo nomiĝas „Akto“; evoluigi aktojn (t.e. aldoni ludmarkojn al posedaĵo kun akto, ĉu la posedaĵo per tio plene evoluas aŭ ne) nomiĝas „Aldoni“. Vendado de karto kaj interŝanĝo de tri emblemoludmarkoj kontraŭ unu ne ŝanĝiĝis.\n\nPor rapidigi la ĵetadon por rimedoj, ekzistas du pliaj agoj:\n* „Preferi“ agordas, kiun emblemoludmarkon vi preferas ricevi kiam akto pagas pro ĵeto de la kontraŭulo. Se vi ne eksplicite elektas preferon, la programo elektas por vi la pli maloftan ludmarkon laŭ viaj ne-kronaj emblemoj kaj nuna provizo de ludmarkoj. La nun preferata ludmarko estas ĉirkaŭita en la interfaco, sed la kontraŭulo neniam vidas vian personan preferon.\n* „Elekti“ estas deviga unua ago por kolekti emblemoludmarkojn kiam akto pagas pro via propra ĵeto. (Ĉiufoje kiam vi devas elekti emblemoludmarkon, kiu ne jam estas inter la viaj, vi ankoraŭ klaku la koncernan amason.)\n\nĈar vi povas fari plurajn agojn dum unu ludvico laŭ ajna ordo, ekzistas ankaŭ la ago „Malfari“ por nuligi vian plej lastan agon, sendepende de tio, ĉu ĝi estis kompleta.\n\nRimarku, ke nur la fina rezulto de la rimeda ĵetkubo estas montrata, sed la probablodistribuo restas tiu de ĵeto de 2d10 kun elekto de la pli alta valoro. Impostado okazas kiam la pli malalta el 2d10 montras 1; tiam oni ĵetas emblemĵetkubon (aŭ du en la variaĵo de duobla impostado), kaj la emblemoj aperas sub la rimeda rezulto. La ĵeto estas protokolata fine de la vico de ludanto kaj atribuata al la sekva ludanto (kiu ĵetus en la fizika ludo). Krom por „Elekti“, neniu ago de la uzanto estas bezonata; la servilo aŭtomate aldonas aŭ forigas rimedojn inter vicoj.\n\nKiam ludanto gvidas en distrikto, la Peono aŭ Senkulpigo de tiu distrikto estas konturita per la koloro de la ludanto. La unua egalecrompa poentaro (totala valoro de posedaĵoj) aperas en krampoj post la distrikta poentaro. La dua egalecrompo estas la totala nombro de restantaj ludmarkoj.", "mchess": "Se pasis sep sinsekvaj vicoj sen kapto, iu povas „voki la horloĝon“ aldonante steleton (*) al la fino de sia movo. Tion eblas fari nur per elekto de la movo el la falmenuo. Post pliaj sep vicoj sen kapto, la ludo finiĝos kaj estos poentata.", + "mirador": "Deklari okupas vian tutan vicon. Unue kompletigu vian ne-atakeblan konekton, poste deklaru dum via sekva vico; vi ne povas meti miradoron kaj deklari dum la sama vico.", "murus": "La defaŭlta regularo estas „Advanced Murus Gallicus“ (kun katapultoj). Defaŭlte, via unua movo estas redistribui unu el viaj komencaj turoj kiel murojn sur via dua vico. Ankaŭ la norma tortregulo disponeblas. Tri variaĵoj estas libere kombineblaj:\n\n* „Basic“ revenigas la ludon al la stato „sen katapultoj“.\n* „Static“ malŝaltas la komencan redistribuon de turo.\n* „Escape“ forigas la venkkondiĉon de trarompo.", "mutternland": "Mutternland estis projektita de Hartmut Witt en 1997. Ĉi tiu realigo alimaniere traktas la komencajn metojn. En la origina ludo, dum la preparado, la ludantoj metis po unu *malamikan* pecon en ĉiu vico; ĉi tie ili metas unu amikan kaj poste unu kontraŭulan pecon (kun kelkaj limigoj por malhelpi malekvilibrajn komencojn pro la hazarda generado de la ludkampo). Tio rapidigas la preparadon kaj donas al ludanto iom da rego pri la propraj pecoj. Krome, pecojn puŝitajn de la tabulo, kiuj revenas al la provizo de la ludanto, remetas ilia posedanto.", "narrows": "Narrows, projektita de Mark Steere en 2026, estas unuigludo inspirita de la antikva havaja ludo Kōnane. Fidela al la spirito de Kōnane, Ūnane komenciĝas per ŝaktabula ŝablono de ŝtonoj kaj estas ege simpla. Ĉi-kaze la unuigcelo inkluzivas ortajn vojojn de malplenaj ĉeloj por konekti malsamajn grupojn de amikaj pecoj.", diff --git a/package-lock.json b/package-lock.json index e4f290418..837cc3cd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@abstractplay/gameslib", - "version": "1.0.0-ci-33996014004.0", + "version": "1.0.0-ci-33995846150.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@abstractplay/gameslib", - "version": "1.0.0-ci-33996014004.0", + "version": "1.0.0-ci-33995846150.0", "license": "MIT", "dependencies": { - "@abstractplay/recranks": "1.0.0-ci-33686810882.0", - "@abstractplay/renderer": "1.0.0-ci-33995779968.0", + "@abstractplay/recranks": "1.0.0-ci-33687599936.0", + "@abstractplay/renderer": "1.0.0-ci-33995787246.0", "@turf/boolean-contains": "^6.5.0", "@turf/boolean-intersects": "^6.5.0", "@turf/boolean-point-in-polygon": "^6.5.0", @@ -94,9 +94,9 @@ } }, "node_modules/@abstractplay/recranks": { - "version": "1.0.0-ci-33686810882.0", - "resolved": "https://npm.pkg.github.com/download/@abstractplay/recranks/1.0.0-ci-33686810882.0/5f40862b7d958433fe9adea466e2dbd18b1d0284", - "integrity": "sha512-gAOCF7UuxzoA2jfBEJjeJEiLwxomINvzigYXmZ+DHG4UkVWCNKq7AqxCcHB06lky81mvIlh0WEVERDuZiyBsWA==", + "version": "1.0.0-ci-33687599936.0", + "resolved": "https://npm.pkg.github.com/download/@abstractplay/recranks/1.0.0-ci-33687599936.0/7e6b3dde13ef3847370af8aabf259420972de32c", + "integrity": "sha512-kh0Jn3v1WdeaL0wyHR8vJpXPCMn7MYTDTDw/Eg8LogfsLBkYqJuakIdO+J/u8P598J5ASDYpZdv7DzF132WQgw==", "license": "MIT", "dependencies": { "ajv": "^8.12.0", @@ -110,9 +110,9 @@ } }, "node_modules/@abstractplay/renderer": { - "version": "1.0.0-ci-33995779968.0", - "resolved": "https://npm.pkg.github.com/download/@abstractplay/renderer/1.0.0-ci-33995779968.0/cb036cafbf7210296420b30371492cb4f460cfda", - "integrity": "sha512-s+7tbtWRLmK3fGeueHzqygZVNz9YQf9VaCAxTh7aOT4dk7gDK1GUTrYOMAY516a/oQcynB+BTmo9jq2iqLQEbA==", + "version": "1.0.0-ci-33995787246.0", + "resolved": "https://npm.pkg.github.com/download/@abstractplay/renderer/1.0.0-ci-33995787246.0/2e2a606d3f26ca711b38b858d4bd40cc4e244f02", + "integrity": "sha512-ThatYaHNprHRppgkXPYWzuoSpTfcOkrDyR23DLP0eDuSCSbwZwZchvjg8KsXZsWPNSJ9NF+o20F97kDKNRdFOw==", "license": "MIT", "dependencies": { "@svgdotjs/svg.js": "3.2.5", diff --git a/package.json b/package.json index 6b2af18b4..d2a09e42e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@abstractplay/gameslib", - "version": "1.0.0-ci-33996014004.0", + "version": "1.0.0-ci-33995846150.0", "description": "TypeScript implementations of the core Abstract Play games, intended to be wrapped by the front- and backends", "type": "module", "main": "build/index.js", @@ -131,8 +131,8 @@ "vite": "^6.3.5" }, "dependencies": { - "@abstractplay/recranks": "1.0.0-ci-33686810882.0", - "@abstractplay/renderer": "1.0.0-ci-33995779968.0", + "@abstractplay/recranks": "1.0.0-ci-33687599936.0", + "@abstractplay/renderer": "1.0.0-ci-33995787246.0", "@turf/boolean-contains": "^6.5.0", "@turf/boolean-intersects": "^6.5.0", "@turf/boolean-point-in-polygon": "^6.5.0", diff --git a/src/games/mirador.ts b/src/games/mirador.ts index fdf4f3b69..e14654374 100644 --- a/src/games/mirador.ts +++ b/src/games/mirador.ts @@ -2,6 +2,7 @@ import { GameBase, IAPGameState, IClickResult, + ICustomButton, IIndividualState, IValidationResult, } from "./_base.js"; @@ -37,6 +38,7 @@ export class MiradorGame extends GameBase { version: "20230729", dateAdded: "2023-08-25", description: "apgames:descriptions.mirador", + notes: "apgames:notes.mirador", urls: [ "https://www.abstractgames.org/mirador.html", "https://boardgamegeek.com/boardgame/65822/mirador", @@ -55,7 +57,7 @@ export class MiradorGame extends GameBase { }, ], categories: ["goal>connect", "mechanic>block", "mechanic>place", "board>shape>rect", "board>connect>rect", "components>simple>pnp"], - flags: ["pie"], + flags: ["pie", "custom-buttons"], }; public numplayers = 2; @@ -143,6 +145,13 @@ export class MiradorGame extends GameBase { return moves.sort((a, b) => a.localeCompare(b)); } + public getButtons(): ICustomButton[] { + if (this.stage === "play") { + return [{ label: "declare", move: "declare" }]; + } + return []; + } + public handleClick( move: string, row: number,