Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
1c4a0aa
Add Ice Palace rules core and maximum-build solver
claude Sep 18, 2026
a0054f9
Add the Ice Palace game engine
claude Sep 18, 2026
d749329
Add English strings for Ice Palace
claude Sep 18, 2026
8d40ab0
Lay out both structures on one freespace canvas
claude Sep 18, 2026
1d0b072
Fix Ice Palace render scale and localize board labels
claude Sep 18, 2026
2aa40d4
Draw pyramids side-on, and collapse Ice Palace into one module
claude Sep 19, 2026
5e4a6ca
Drop no-moves so forced passes auto-pass
claude Sep 19, 2026
7a3d9b7
Render Ice Palace with stacking-3D, a pieces area, and hands in the s…
claude Sep 20, 2026
f745281
Prefix Ice Palace legend keys so they are valid element ids
claude Sep 20, 2026
3a6d490
Stand every pyramid on its cell in the stacking-3D view
claude Sep 20, 2026
2fade11
Stack pyramids exactly on one another the way Volcano does
claude Sep 20, 2026
2e75461
Place stacked pyramids one index apart, as Volcano does
claude Sep 20, 2026
b6f1cb7
Give the Ice Palace board a minimum footprint and a wider gap
claude Sep 20, 2026
069065e
Put the Ice Palace Yard on the left and the Palace on the right
Sep 20, 2026
73d3c99
Dot the legal cells for a picked Ice Palace pyramid and show the button
Sep 20, 2026
69438f8
Give the Ice Palace status panel the glyph shape the front reads
Sep 20, 2026
8bcf2a0
Add an expanding top-down display for Ice Palace
Sep 20, 2026
d4cec46
Log the Ice Palace build with a worked example, and state the count p…
Sep 20, 2026
4ccc285
Merge remote-tracking branch 'upstream/develop' into ice-palace-2026-…
Sep 20, 2026
111ca63
Seed the Ice Palace name into the managed locales and fix a lint error
Sep 20, 2026
fb85a3c
Leave the managed locales and sidecars to the translation system
Sep 20, 2026
50e8e3e
Address review: failsafe on incomplete moves, export exclusion, tests
Sep 21, 2026
3b40f55
Add the Ice Palace coder entry and the rules links
Sep 21, 2026
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
33 changes: 33 additions & 0 deletions locales/en/apgames.json
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@
"hexy": "An adaptation of Y on a regular hexagon where players vye to control most of the perimeter of the board.",
"homeworlds": "An Icehouse game for 2 to 4 players. Players are interstellar civilizations vying for dominance. Each of the four colours of pyramid gives access to different actions. Amass a fleet, explore the galaxy, and ultimately destroy your opponent.",
"hula": "Two players aim to form a loop around the center of a regular hexagonal board, using their own stones and, possibly, some number of neutral stones.",
"icepalace": "Three to six players compete to win hands by playing pyramids into a shared Yard, where each pyramid must be bigger than the one it covers. The winner of each hand builds everything they won into the Ice Palace, where the size rule runs the other way and only smaller pyramids may stack. Each Palace stack scores its height for whoever owns the pyramid on top, so small pyramids are the key to scoring. Almost everything is open to negotiation.",
"intermedium": "Sowing stacks to enclose and capture. Win by capturing the opponent's city.",
"invector": "Eliminate the adversary army while getting near the board center.",
"iqishiqi": "Iqishiqi (pronounced EE-chee-shee-chee) is an abstract strategy game that is played on a hexagonal board composed of hexagonal cells. Players own designated edges of the board, and by clever placement of stones they push a neutral stone around the board. A player wins if he/she moves the neutral stone to one of his/her edges, or leaves his/her opponent unable to move.",
Expand Down Expand Up @@ -287,6 +288,10 @@
"yonmoque": "Try to form four in a row in a game where not all spaces are equal and opposing pieces can be converted.",
"zola": "A game where your movement is constrained by your distance from the centre of the board. Capturing moves must not increase that distance. Non-capturing moves must increase that distance. First person to capture all opposing pieces wins."
},
"icepalace": {
"HAND": "{{player}}'s hand",
"STOCK": "Pyramids from the Yard, to be built into the Palace"
},
"names": {
"abande": "Abande",
"accasta": "Accasta",
Expand Down Expand Up @@ -417,6 +422,7 @@
"hexy": "Hexagonal Y",
"homeworlds": "Homeworlds",
"hula": "Hula",
"icepalace": "Ice Palace",
"intermedium": "Intermedium",
"invector": "Invector",
"iqishiqi": "Iqishiqi",
Expand Down Expand Up @@ -607,6 +613,7 @@
"gonnect": "In the base game, passing is not allowed. The **Cascading Connection Goals** variant allows passing and ends after two consecutive passes. An outright connection wins immediately, otherwise find the largest centered subboard where exactly one player connects opposite sides: that player wins.",
"garden": "To make it very clear what happened on a previous turn, each move is displayed over four separate boards. The first board shows the game after the piece was first placed. The second board shows the state after adjacent pieces were flipped. The third board shows any harvests. The fourth board is the final game state and is where you make your moves.\n\nIn our implementation, black is always the \"tome\" or tie-breaker colour. The last player to harvest black will have a `0.1` after their score.",
"guerrilla": "Either player wins by removing all of the opponent's pieces. The security player also wins if they survive long enough that the insurgents run out of stones to place.\n\nBy default, a match consists of two games with roles reversed. Each player plays one game as insurgents and one as security. When both players win as insurgents, the match goes to whoever used fewer stones (`66 − remaining` at the end of that game; lower score wins). Equal insurgent scores are the only draw in that case. A security win in a game scores 67. If one player sweeps both games (wins as insurgents in one and security in the other), they win the match outright. If both players only win as security, the match is drawn.",
"icepalace": "Ice Palace's rules say a pyramid placed on the ground must be next to a pyramid of the same colour, but not whether every neighbour has to match. This implementation requires at least one matching orthogonal neighbour; the others may be any colour. White matches any colour except Black, and Black matches nothing.",
"scribe": "The glyph reference chart is shown in the left margin. A dot marks each player's most recent placement. When a mini grid fills, glyph points are tallied and the higher score wins that grid (ties go to the player who completed it).",
"gyges": "The goal squares are adjacent to all the cells in the back row. The renderer cannot currently handle \"floating\" cells.",
"halma": "To prevent the [drawish nature](https://boardgamegeek.com/thread/3706389/unspoiling-halma-redux) of the game, the following rules apply: (a) a player wins if the opposite home-base is complete with at least one friendly stone (David Parlett's criteria); (b) Any piece in the player's home-base must make progress towards the enemy camp whenever this is possible by jumping over an enemy piece. (Zillions rule, to remove drawish strategies); (c) No stone can return to its home-base.\n\n[Halma](https://en.wikipedia.org/wiki/Halma) was one of the first commercial successes for an abstract game. The game was designed by [George Howard Monks](https://en.wikipedia.org/wiki/George_Howard_Monks) in 1883/4. It is said that Halma was inspired by an older British game called *Hoppity*. However, this game has no documentation or surviving boards, turning this lineal statement into a historical mystery. Halma was later adapted (c.1892/3) into an even bigger success: [Chinese Checkers](https://boardgamegeek.com/boardgame/2386/chinese-checkers) (which could easily be played by three or six players).\n\nSuper Halma is a more dynamic, uncredited variant, presented in the 1992 book **New Rules for Classic Games** by Wayne Schmittberger. This variant proposes long jumps, where the number of empty cells before and after the jumped stone must be equal. The base's move restrictions still apply in this implementation of Super Halma.",
Expand Down Expand Up @@ -4467,6 +4474,12 @@
"description": "Display the board using vertices instead of hexes."
}
},
"icepalace": {
"expanding": {
"description": "Looks straight down on the Yard and the Palace, with each stack's pyramids drawn over one another. Hover over a cell to see its stack laid out beside the board.",
"name": "Expanding"
}
},
"intermedium": {
"hide-diagonals": {
"description": "Don't show diagonal lines.",
Expand Down Expand Up @@ -4875,6 +4888,10 @@
"GAME2": "Game 2",
"INSURGENTS": "Insurgents remaining"
},
"icepalace": {
"MUST_USE": "Pyramids to build",
"POOL": "Pyramids left in the Pool"
},
"scribe": {
"MINI_GRIDS": "Mini grids won"
},
Expand Down Expand Up @@ -6344,6 +6361,22 @@
},
"VALID_W_ACTIONS": "Looks like a valid move, but you still have actions to spend."
},
"icepalace": {
"BAD_PLACEMENT": "Could not read '{{move}}' as a pyramid and a space.",
"BUILD_COMPLETE": "The whole Yard has been built into the Ice Palace. Submit when you are happy with it.",
"BUILD_ENOUGH": "The remaining {{count}} pyramids will be discarded. Submit when you are happy with the arrangement.",
"BUILD_MORE": "Place {{count}} more pyramids.",
"ILLEGAL_PALACE": "The {{piece}} cannot go at {{cell}}. In the Ice Palace a pyramid may only cover a bigger one, or start a new stack beside a stack of its own colour.",
"ILLEGAL_YARD": "The {{piece}} cannot go at {{cell}}. In the Yard a pyramid may only cover a smaller one, or start a new stack beside a stack whose top it matches.",
"INITIAL_BUILD": "You won the hand. Build the Yard into the Ice Palace, using {{count}} pyramids.",
"INITIAL_HAND": "Place a pyramid from your hand into the Yard, or pass.",
"LEAD_CANNOT_PASS": "You are leading the hand and must place a pyramid to start the Yard.",
"MUST_BUILD": "You cannot decline to build: {{count}} of the Yard's pyramids can be placed.",
"NOT_IN_HAND": "You do not have a {{piece}} in hand.",
"NOT_IN_STOCK": "The {{piece}} is not among the pyramids you won.",
"OFF_STRUCTURE": "That space is not part of the structure you are building in.",
"PARTIAL_PIECE": "Now choose where to place the {{piece}}."
},
"intermedium": {
"INSTRUCTIONS": "Select a friendly stack; click on it as many times as pieces to move, then click on a diagonal path that starts adjacent to this sowing stack (one pieces per square), making 90º turns.",
"NOT_FRIENDLY_STACK": "Select a friendly stack with two or more pieces to sow.",
Expand Down
5 changes: 5 additions & 0 deletions locales/en/apresults.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
"deckfish": "{{player}} was unable to move and must pass from now on.",
"frogger_one": "{{player}} chose to refill the draw pool. He gets another turn to take his {{count}} remaining move.",
"frogger_other": "{{player}} chose to refill the draw pool. He gets another turn to take his {{count}} remaining moves.",
"icepalace_build": "{{player}} won the hand and builds the Yard into the Ice Palace, using {{count}} pyramids. One legal way to build it is `{{move}}`.",
"icepalace_nobuild": "{{player}} won the hand, but none of the Yard can be built into the Ice Palace.",
"quincunx": "Player {{playerNum}} had the following cards left in their hand: {{cards}}.",
"elOso": {
"playerSetup": "Player setup",
Expand Down Expand Up @@ -424,6 +426,7 @@
"druid": "{{player}} passed.",
"elOso": "{{player}} passed.",
"frogger": "{{player}} passed {{why}}.",
"icepalace": "{{player}} passed.",
"linage": "{{player}} passes.",
"pie": "{{player}} accepted the komi offer and will continue playing second.",
"pigs": "{{player}} idles.",
Expand Down Expand Up @@ -485,6 +488,7 @@
"epam": "{{player}} placed a stone at {{where}}.",
"gorogo_henge": "{{player}} placed a henge piece at {{where}}.",
"gorogo_piece": "{{player}} placed a piece at {{where}}.",
"icepalace": "{{player}} placed a {{what}} at {{where}}.",
"iqishiqi": "{{player}} placed a shared stone at {{where}}.",
"knightline": "{{player}} placed their initial stack at {{where}}.",
"logger_logger": "{{player}} placed their logger at {{where}}.",
Expand Down Expand Up @@ -594,6 +598,7 @@
"fourinarow_sw": "{{player}} cleared two lines, shifting the pieces on the board downwards and leftwards.",
"fourinarow_w": "{{player}} cleared a line, shifting the pieces on the board leftwards.",
"gliss": "{{player}} moved their glider at {{where}} off the edge of the board.",
"icepalace": "{{what}} was discarded and removed from play.",
"nonum": "{{player}} removed a piece from {{where}}.",
"phutball_one": "{{count}} player was removed.",
"phutball_other": "{{count}} players were removed.",
Expand Down
Loading
Loading