Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions locales/en/apgames.json
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@
"spree": "An impartial n-in-a-row game where players take turns handing a ball to their opponent to place. The goal is to try to make a full line of one of two colours (red and blue by default). There is a third wild neutral colour (green by default) that can play the role of either colour.",
"squaredance": "A game where you move groups of pieces by rotation, trying to force your opponent into a position where they cannot move.",
"stairs": "Stack higher than your opponent in this game of one-space, one-level jumps where you also have to move your lowest pieces first. To take the lead and win, you must surpass your opponent's tallest stack height or, failing that, their number of stacks at the tallest height.",
"stawvs": "A set collection game for 2-4 players that's similar to Amazons, with old-style Volcano scoring. On a checkerboard randomly filled with individual pyramids, player pieces can move and capture pyramids in a straight line (orthogonally or diagonally), if and only if all intervening spaces and the target space contain pyramids but not pieces.",
"stibro": "Win by forming a loop anywhere on the board, while adhering to the placement restriction that ensures loop-forming is always possible.",
"stigmergy": "Territorial line-of-sight game. Cells are controlled and pieces on them are flipped based on how many pieces of a color can see them. The winner is the player who occupies more of the board at the end.",
"storisende": "A unique territory control game where the movement of pieces create territories and walls, eventually creating enclosed nations. Control the most territory to win.",
Expand Down Expand Up @@ -251,6 +252,7 @@
"spire": "In this implementation, if you select only one space, it assumes that you placed the ball of your colour, and if you select two spaces, the first space is for the neutral ball and the second space is for the ball of your colour. If the first click is on a space where only one of the neutral ball or the ball of your colour is valid, it will automatically commit that ball.",
"spook": "When using the randomised board setup, the only fairness heuristics that we currently have are that (1) the number of balls in solid 5-ball pyramids of the same colour are equal for both players and (2), the second-highest layer must contain balls of both colours. Feel free to contact us on Discord if you think of other ways to make the game fairer.",
"spree": "We use 1, 2, 3 to denote the three colours. The neutral colour for the wild ball is colour 3. 1 and 2 are red and blue respectively by default, and 3 is green by default.",
"stawvs": "For clarity, the game pieces are represented as circles, though in real life, caps (small pyramids of distinct player colors) are usually used. The UI will sort and score your trees (trios consisting of one of each pyramid size) for you as in Mega-Volcano, but for reference the point values are: 7 points for each monochrome tree, 5 points for multicolor trees, and 1 point each for loose pyramids. Except in the variant where final pyramids aren't collected, the pyramids under player pieces are added to the players' collections and scored, but greyed-out pyramids remain on the board under the pieces to clarify the final position.",
"stigmergy": "You control a space if more than half of the lines of sight to it end at a piece of your color. Your score is the sum of the number of pieces of your color on the board and the number of empty spaces you control, plus a komi bonus and a button bonus. The button is used when the komi value plus the number of spaces on the board is even, and any player may take a turn off and claim the button if it has yet to be claimed. The game ends when both players pass in succession, but claiming the button does not count toward this. Players cannot pass until the entire board is occupied or controlled.",
"tablero": "When it's your turn, you will see the dice you have to work with, but once your move is complete, the dice will reroll. Exploration is not helpful because the dice roll is not finalized until after the move is submitted. As you scroll back through the game history, the dice you see are the dice for the *next* turn. The dice used to make the move you're seeing are displayed below the board.\n\nWhile most moves can be unambiguously made by simple clicks, sometimes a button is more helpful. The Place, Take, and Bump buttons to the left of the board are there if you need them.",
"tafl": "The variant names are in the format {ruleset}-{board size}-{initial layout}-{optional: starting player}. For example, 'linnaean-9x9-tcross-w' is the linnaean rules on a 9x9 board with T-cross setup, and the starting player is the defenders. If starting player is not mentioned, then attackers start.",
Expand Down Expand Up @@ -2130,6 +2132,32 @@
"name": "5x5 board"
}
},
"stawvs": {
"#setup": {
"description": "In the default setup, the corners of the board are empty.",
"name": "Default setup (empty corners)"
},
"hole": {
"description": "Set up the board with four empty squares in the center.",
"name": "Center hole"
},
"random": {
"description": "Set up the board with four random empty squares.",
"name": "Random gaps"
},
"hey": {
"name": "Simpler captures",
"description": "A simplification of the rules in which you always capture the pyramid you moved away from, instead of a pyramid in any line from your piece's new location. This makes the game less like Amazons and more like Hey! That's My Fish."
},
"finalfree": {
"name": "No final captures",
"description": "At the end of the game, players do not collect the pyramids under their pieces."
},
"pieces-2": {
"name": "2 pieces each",
"description": "The piece count may optionally be reduced from 3 each to 2 each in a four-player game. (This variant is not intended for lower player counts.)"
}
},
"stibro": {
"size-5": {
"name": "Size 5 board"
Expand Down Expand Up @@ -4959,6 +4987,22 @@
"INVALID_MOVE": "You must move a piece to a neighboring stack of the same height. You must move one of your lowest movable pieces.",
"MUST_PASS": "The only move available to you is to pass."
},
"stawvs": {
"BAD_CLAIM": "You must claim a pyramid in a straight, unobstructed line from your new position.",
"BAD_CLAIM_HEY": "In this variant, you must claim the pyramid from your previous position.",
"BAD_MOVE": "You must move to a pyramid in a straight, unobstructed line from your old position.",
"BAD_START": "You must choose one of your own pieces to move.",
"BAD_PLACEMENT": "You must place your cap on an unoccupied pyramid, not on an occupied one or an empty cell.",
"EXTRA_CLAIMS": "You may only claim one pyramid on your turn.",
"INITIAL_PLACEMENT_INSTRUCTIONS": "Click a pyramid to place your piece on the board.",
"INITIAL_MOVE_INSTRUCTIONS": "Click a piece to move.",
"LABEL_COLLECTION": "Player {{playerNum}}'s pyramids",
"MUST_PASS": "Once you have passed, you must continue passing.",
"NOPASS": "You cannot pass while you have legal moves.",
"PARTIAL_MOVE": "Click an accessible destination pyramid.",
"VALID_PLACEMENT": "Looks like a good placement.",
"VALID_PLAY": "Looks like a good play."
},
"stibro": {
"FIRST_PLACEMENT": "The first placement cannot be on the edge.",
"FREE_GROUPS_AFTER": "You must always have at least one free group: a group that does not touch the edge, and has two spaces between itself and an opponent group that does not touch the edge."
Expand Down
6 changes: 5 additions & 1 deletion locales/en/apresults.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
"ANNOUNCE": {
"biscuit": "The following cards were in opposing hands: {{cards}}.",
"deckfish": "{{player}} was unable to move and must pass from now on.",
"quincunx": "Player {{playerNum}} had the following cards left in their hand: {{cards}}."
"quincunx": "Player {{playerNum}} had the following cards left in their hand: {{cards}}.",
"stawvs": "{{player}} was unable to move and must pass from now on."
},
"BEAROFF": {
"complete_one": "{{player}} bore off one piece from {{from}}.",
Expand Down Expand Up @@ -227,6 +228,7 @@
"repetition_positional_one": "The game has ended because the same position has occurred.",
"repetition_positionas_other": "The game has ended because the same position has occurred {{count}} times.",
"stalemate": "The game has ended because one player has run out of moves.",
"stawvs": "The game has ended because the last player was unable to move.",
"susan_nonplacement": "The game has ended because no player has placed a piece for 6 plies.",
"tafl_encirclement": "The game has ended because the defenders are encircled.",
"tafl_exit_fort": "The game has ended because the defenders created an exit fort.",
Expand Down Expand Up @@ -314,6 +316,7 @@
"saltire": "{{player}} swapped the pieces at {{from}} and {{to}}.",
"slyde": "{{player}} slid a piece from {{from}} to {{to}}.",
"spook": "{{player}} moved Spooky from {{from}} to {{to}}.",
"stawvs": "{{player}} moved a piece from {{from}} to {{to}} and captured the {{what}} at {{how}}.",
"susan": "{{player}} slid a piece from {{from}} to {{to}}.",
"tafl": "{{player}} moved a piece from {{from}} to {{to}}.",
"tafl_jump": "{{player}} jumped a piece from {{from}} to {{to}}.",
Expand Down Expand Up @@ -404,6 +407,7 @@
"spire_neutral": "{{player}} placed a neutral ball at {{where}}.",
"spire_player": "{{player}} placed a ball of their colour at {{where}}.",
"spooky": "Spooky has entered the board at {{where}}.",
"stawvs": "{{player}} placed a piece at {{where}}.",
"strands_initial": "{{player}} placed a piece on a space labelled 2 at {{where}}.",
"strands_one": "{{player}} placed a piece at {{where}}.",
"strands_other": "{{player}} placed {{count}} pieces at {{where}}.",
Expand Down
8 changes: 6 additions & 2 deletions src/games/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ import { EmuGame, IEmuState } from "./emu";
import { DeckfishGame, IDeckfishState } from "./deckfish";
import { BluestoneGame, IBluestoneState } from "./bluestone";
import { SunspotGame, ISunspotState } from "./sunspot";
import { StawvsGame, IStawvsState } from "./stawvs";

export {
APGamesInformation, GameBase, GameBaseSimultaneous, IAPGameState,
Expand Down Expand Up @@ -430,6 +431,7 @@ export {
DeckfishGame, IDeckfishState,
BluestoneGame, IBluestoneState,
SunspotGame, ISunspotState,
StawvsGame, IStawvsState,
};

const games = new Map<string, typeof AmazonsGame | typeof BlamGame | typeof CannonGame |
Expand Down Expand Up @@ -503,7 +505,7 @@ const games = new Map<string, typeof AmazonsGame | typeof BlamGame | typeof Cann
typeof TessellaGame | typeof GorogoGame | typeof StibroGame |
typeof BiscuitGame | typeof QuincunxGame | typeof SiegeOfJGame |
typeof StairsGame | typeof EmuGame | typeof DeckfishGame | typeof BluestoneGame |
typeof SunspotGame
typeof SunspotGame | typeof StawvsGame
>();
// Manually add each game to the following array
[
Expand Down Expand Up @@ -536,7 +538,7 @@ const games = new Map<string, typeof AmazonsGame | typeof BlamGame | typeof Cann
GyveGame, PahTumGame, NakattaGame, OmnyGame, PacruGame, AzacruGame, CifraGame, GygesGame,
PonteDDGame, SurmountGame, GlissGame, MorphosGame, AssemblyGame, PaintbucketGame, C1Game,
BloqueoGame, StormCGame, PilastriGame, TessellaGame, GorogoGame, BiscuitGame, QuincunxGame,
SiegeOfJGame, StairsGame, EmuGame, DeckfishGame, BluestoneGame, SunspotGame
SiegeOfJGame, StairsGame, EmuGame, DeckfishGame, BluestoneGame, SunspotGame, StawvsGame
].forEach((g) => {
if (games.has(g.gameinfo.uid)) {
throw new Error("Another game with the UID '" + g.gameinfo.uid + "' has already been used. Duplicates are not allowed.");
Expand Down Expand Up @@ -974,6 +976,8 @@ export const GameFactory = (game: string, ...args: any[]): GameBase|GameBaseSimu
return new BluestoneGame(...args);
case "sunspot":
return new SunspotGame(...args);
case "stawvs":
return new StawvsGame(args[0], ...args.slice(1));
}
return;
}
Loading