diff --git a/client/assets/localization.csv b/client/assets/localization.csv index 87a4baca..7a7a8441 100644 --- a/client/assets/localization.csv +++ b/client/assets/localization.csv @@ -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 diff --git a/client/src/PuzzleSet.lua b/client/src/PuzzleSet.lua index 526e8a81..b6a3d85e 100644 --- a/client/src/PuzzleSet.lua +++ b/client/src/PuzzleSet.lua @@ -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, diff --git a/client/src/scenes/OptionsMenu.lua b/client/src/scenes/OptionsMenu.lua index 7b7477f3..58036e08 100644 --- a/client/src/scenes/OptionsMenu.lua +++ b/client/src/scenes/OptionsMenu.lua @@ -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") diff --git a/docs/puzzles.md b/docs/puzzles.md index 6a5de009..2cdce4f8 100644 --- a/docs/puzzles.md +++ b/docs/puzzles.md @@ -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": [ @@ -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": @@ -36,7 +36,7 @@ The contents of each puzzle file should be formatted something like this: { "Puzzle Type": "clear", "Moves": 0, - "Stack": + "Stack": " [====] [====] @@ -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 @@ -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. @@ -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 `[]{}` \ No newline at end of file +- **=** = 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.