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
1 change: 1 addition & 0 deletions client/assets/localization.csv
Original file line number Diff line number Diff line change
Expand Up @@ -637,3 +637,4 @@ mod_manage_music,Label for music in mod management,Music,Musique,Música,音楽,
mod_manage_submods,Label for submods in mod management,Sub Mods,Sous-mods,Submods,サブMOD,Submods,Submods,Submod,ซับม็อด
mod_manage_enabled,Label for enabled in mod management,Enabled,Activé,Ativado,有効,Activado,Aktiviert,Abilitato,เปิดใช้งาน
mm_2_time,,2P time attack,2J contre la montre,2J contra o tempo,2P スコアアタック,2J Contrareloj,2P Time Attack,2P a tempo,2P time attack
op_about_puzzles,,About custom puzzles,À propos des puzzles personnalisés,Sobre quebra-cabeças personalizados,カスタムパズルについて,Acerca de rompecabezas personalizados,How to: Eigene Puzzles erstellen,A proposito dei puzzle personalizzabili,เกี่ยวกับ custom puzzles
1 change: 0 additions & 1 deletion client/src/PuzzleSet.lua
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,6 @@ PuzzleSet.keyOrder = {
Puzzle.PUZZLE_PROPERTY.START_TIMING,
Puzzle.PUZZLE_PROPERTY.MOVES,
Puzzle.PUZZLE_PROPERTY.STOP,
Puzzle.PUZZLE_PROPERTY.PRE_STOP,
Puzzle.PUZZLE_PROPERTY.SHAKE,
Puzzle.PUZZLE_PROPERTY.STACK,
Puzzle.PUZZLE_PROPERTY.PANEL_BUFFER,
Expand Down
4 changes: 4 additions & 0 deletions client/src/scenes/OptionsMenu.lua
Original file line number Diff line number Diff line change
Expand Up @@ -514,6 +514,10 @@ function OptionsMenu:loadAboutMenu()
GAME.theme:playValidationSfx()
love.system.openURL("https://github.com/panel-attack/panel-game/blob/beta/docs/panels.md")
end),
ui.MenuItem.createButtonMenuItem("op_about_puzzles", nil, nil, function()
GAME.theme:playValidationSfx()
love.system.openURL("https://github.com/panel-attack/panel-game/blob/beta/docs/puzzles.md")
end),
ui.MenuItem.createButtonMenuItem("op_about_attack_files", nil, nil, function()
GAME.theme:playValidationSfx()
love.system.openURL("https://github.com/panel-attack/panel-game/blob/beta/docs/training.txt")
Expand Down
24 changes: 19 additions & 5 deletions docs/puzzles.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Each puzzle file can contain as many puzzle sets as you like. Each set within a

The contents of each puzzle file should be formatted something like this:

```json
```jsonc
{
"Version": 3,
"Puzzle Sets": [
Expand All @@ -24,7 +24,7 @@ The contents of each puzzle file should be formatted something like this:
"Puzzle Type": "chain",
"StartTiming": "countdown",
"Moves": 0,
"Stack":
"Stack":
"040000
111440",
"CursorStartLeft":
Expand All @@ -36,7 +36,7 @@ The contents of each puzzle file should be formatted something like this:
{
"Puzzle Type": "clear",
"Moves": 0,
"Stack":
"Stack":
"
[====]
[====]
Expand Down Expand Up @@ -81,7 +81,9 @@ Version 3 is the current version it allows "Puzzle Sets" to have recursive "Puzz
- **"clear"** - all garbage on the field needs to be cleared before health runs out

#### Other Fields
- **"Moves"** - the number of moves, can be zero to not have a limit
- **"Moves"** - the number of moves allowed to complete the puzzle
- Set to 0 for unlimited moves (no move limit)
- **Important**: "moves" type puzzles must have a value greater than 0
- **"Stack"** - the starting arrangement of the panels, see below

#### Start Timing
Expand All @@ -100,6 +102,14 @@ If no start timing is given, a suitable start timing is selected based on puzzle
- **"Shake"** - specifies how many frames of shake time are initially granted to the player
- **"CursorStartLeft"** - specifies where the left part of the cursor should start the puzzle
- Format: `{ "Row": 1, "Column": 1 }`
- Valid ranges: Row must be 1-12, Column must be 1-5
- **"Solution"** - a compressed input string representing the solution to the puzzle
- Format: String of encoded inputs (swap directions and timing)
- Used by the game to verify solutions or provide hints
- The best way to add this is to solve your puzzle in game, and it will be added to the puzzle.
- **"Help Description"** - optional text that explains the puzzle pattern or provides hints to the player
- Format: String describing the puzzle mechanic or strategy
- Displayed when the player requests help for the puzzle

#### Panel Buffers
**"PanelBuffer"** specifies the panels that should appear if the player is raising the stack.
Expand Down Expand Up @@ -174,4 +184,8 @@ Carriage returns are allowed in the middle of the panel maps for each individual
- **]** = bottom right corner of a combo / chain garbage block
- **{** = left end of a shock garbage block
- **}** = right end of a shock garbage block
- **=** = filler space to determine the size of the garbage block indicated by the surrounding `[]{}`
- **=** = filler space to determine the size of the garbage block indicated by the surrounding `[]{}`

## More Examples

For additional examples, check out the [default puzzles included with the game](https://github.com/panel-attack/panel-game/blob/beta/client/assets/default_data/puzzles/) on GitHub. This file contains a variety of puzzle types and demonstrates many of the features described in this guide.