diff options
| author | Star Rauchenberger <fefferburbia@gmail.com> | 2023-11-01 18:07:04 -0400 |
|---|---|---|
| committer | Star Rauchenberger <fefferburbia@gmail.com> | 2023-11-01 18:07:04 -0400 |
| commit | bec6f657f405cb27939ec42ae35c0cc9d524bbb9 (patch) | |
| tree | d7cef60e532041b650ef9c54c8645607f21c3b12 | |
| parent | 63624385ccc66f6a2f40797baad1972957e34863 (diff) | |
| download | wittle-bec6f657f405cb27939ec42ae35c0cc9d524bbb9.tar.gz wittle-bec6f657f405cb27939ec42ae35c0cc9d524bbb9.tar.bz2 wittle-bec6f657f405cb27939ec42ae35c0cc9d524bbb9.zip | |
invisible symmetry!
| -rw-r--r-- | app/assets/javascripts/wittle/puzzle.js | 5 | ||||
| -rw-r--r-- | app/assets/javascripts/wittle/serializer.js | 3 | ||||
| -rw-r--r-- | app/assets/javascripts/wittle/trace2.js | 23 | ||||
| -rw-r--r-- | app/assets/javascripts/wittle/utilities.js.erb | 4 | ||||
| -rw-r--r-- | ext/wittle_generator/Generate.cpp | 4 | ||||
| -rw-r--r-- | ext/wittle_generator/Panel.cpp | 10 | ||||
| -rw-r--r-- | ext/wittle_generator/Panel.h | 3 | ||||
| -rw-r--r-- | ext/wittle_generator/Serializer.h | 3 |
8 files changed, 45 insertions, 10 deletions
| diff --git a/app/assets/javascripts/wittle/puzzle.js b/app/assets/javascripts/wittle/puzzle.js index a7ad10a..4d6b0fb 100644 --- a/app/assets/javascripts/wittle/puzzle.js +++ b/app/assets/javascripts/wittle/puzzle.js | |||
| @@ -35,9 +35,12 @@ window.Puzzle = class { | |||
| 35 | 35 | ||
| 36 | // If true, custom mechanics are displayed (and validated) in this puzzle. | 36 | // If true, custom mechanics are displayed (and validated) in this puzzle. |
| 37 | CUSTOM_MECHANICS: false, | 37 | CUSTOM_MECHANICS: false, |
| 38 | 38 | ||
| 39 | // If true, polyominos may be placed partially off of the grid as an intermediate solution step. | 39 | // If true, polyominos may be placed partially off of the grid as an intermediate solution step. |
| 40 | // OUT_OF_BOUNDS_POLY: false, | 40 | // OUT_OF_BOUNDS_POLY: false, |
| 41 | |||
| 42 | // If true, the symmetry line will be invisible. | ||
| 43 | INVISIBLE_SYMMETRY: false, | ||
| 41 | } | 44 | } |
| 42 | } | 45 | } |
| 43 | 46 | ||
| diff --git a/app/assets/javascripts/wittle/serializer.js b/app/assets/javascripts/wittle/serializer.js index e440569..1598d9b 100644 --- a/app/assets/javascripts/wittle/serializer.js +++ b/app/assets/javascripts/wittle/serializer.js | |||
| @@ -43,6 +43,7 @@ window.serializePuzzle = function(puzzle) { | |||
| 43 | if (puzzle.settings.FLASH_FOR_ERRORS) settingsFlags |= SETTINGS_FLAG_FFE | 43 | if (puzzle.settings.FLASH_FOR_ERRORS) settingsFlags |= SETTINGS_FLAG_FFE |
| 44 | if (puzzle.settings.FAT_STARTPOINTS) settingsFlags |= SETTINGS_FLAG_FS | 44 | if (puzzle.settings.FAT_STARTPOINTS) settingsFlags |= SETTINGS_FLAG_FS |
| 45 | if (puzzle.settings.CUSTOM_MECHANICS) settingsFlags |= SETTINGS_FLAG_CM | 45 | if (puzzle.settings.CUSTOM_MECHANICS) settingsFlags |= SETTINGS_FLAG_CM |
| 46 | if (puzzle.settings.INVISIBLE_SYMMETRY) settingsFlags |= SETTINGS_FLAG_IS | ||
| 46 | s.writeByte(settingsFlags) | 47 | s.writeByte(settingsFlags) |
| 47 | 48 | ||
| 48 | return s.str() | 49 | return s.str() |
| @@ -93,6 +94,7 @@ window.deserializePuzzle = function(data) { | |||
| 93 | FLASH_FOR_ERRORS: (settingsFlags & SETTINGS_FLAG_FFE) != 0, | 94 | FLASH_FOR_ERRORS: (settingsFlags & SETTINGS_FLAG_FFE) != 0, |
| 94 | FAT_STARTPOINTS: (settingsFlags & SETTINGS_FLAG_FS) != 0, | 95 | FAT_STARTPOINTS: (settingsFlags & SETTINGS_FLAG_FS) != 0, |
| 95 | CUSTOM_MECHANICS: (settingsFlags & SETTINGS_FLAG_CM) != 0, | 96 | CUSTOM_MECHANICS: (settingsFlags & SETTINGS_FLAG_CM) != 0, |
| 97 | INVISIBLE_SYMMETRY: (settingsFlags & SETTINGS_FLAG_IS) != 0, | ||
| 96 | } | 98 | } |
| 97 | 99 | ||
| 98 | s.destroy() | 100 | s.destroy() |
| @@ -342,5 +344,6 @@ var SETTINGS_FLAG_PP = 4 | |||
| 342 | var SETTINGS_FLAG_FFE = 8 | 344 | var SETTINGS_FLAG_FFE = 8 |
| 343 | var SETTINGS_FLAG_FS = 16 | 345 | var SETTINGS_FLAG_FS = 16 |
| 344 | var SETTINGS_FLAG_CM = 32 | 346 | var SETTINGS_FLAG_CM = 32 |
| 347 | var SETTINGS_FLAG_IS = 64 | ||
| 345 | 348 | ||
| 346 | }) | 349 | }) |
| diff --git a/app/assets/javascripts/wittle/trace2.js b/app/assets/javascripts/wittle/trace2.js index 01e4ccd..7a77564 100644 --- a/app/assets/javascripts/wittle/trace2.js +++ b/app/assets/javascripts/wittle/trace2.js | |||
| @@ -138,10 +138,18 @@ class PathSegment { | |||
| 138 | data.svg.insertBefore(this.symCirc, data.cursor) | 138 | data.svg.insertBefore(this.symCirc, data.cursor) |
| 139 | data.svg.insertBefore(this.symPoly2, data.cursor) | 139 | data.svg.insertBefore(this.symPoly2, data.cursor) |
| 140 | data.svg.insertBefore(this.symPillarCirc, data.cursor) | 140 | data.svg.insertBefore(this.symPillarCirc, data.cursor) |
| 141 | this.symPoly1.setAttribute('class', 'line-3 ' + data.svg.id) | 141 | |
| 142 | this.symCirc.setAttribute('class', 'line-3 ' + data.svg.id) | 142 | if (data.puzzle.settings.INVISIBLE_SYMMETRY) { |
| 143 | this.symPoly2.setAttribute('class', 'line-3 ' + data.svg.id) | 143 | this.symPoly1.setAttribute('class', 'line-4 ' + data.svg.id) |
| 144 | this.symPillarCirc.setAttribute('class', 'line-3 ' + data.svg.id) | 144 | this.symCirc.setAttribute('class', 'line-4 ' + data.svg.id) |
| 145 | this.symPoly2.setAttribute('class', 'line-4 ' + data.svg.id) | ||
| 146 | this.symPillarCirc.setAttribute('class', 'line-4 ' + data.svg.id) | ||
| 147 | } else { | ||
| 148 | this.symPoly1.setAttribute('class', 'line-3 ' + data.svg.id) | ||
| 149 | this.symCirc.setAttribute('class', 'line-3 ' + data.svg.id) | ||
| 150 | this.symPoly2.setAttribute('class', 'line-3 ' + data.svg.id) | ||
| 151 | this.symPillarCirc.setAttribute('class', 'line-3 ' + data.svg.id) | ||
| 152 | } | ||
| 145 | 153 | ||
| 146 | this.symCirc.setAttribute('cx', data.symbbox.middle.x) | 154 | this.symCirc.setAttribute('cx', data.symbbox.middle.x) |
| 147 | this.symCirc.setAttribute('cy', data.symbbox.middle.y) | 155 | this.symCirc.setAttribute('cy', data.symbbox.middle.y) |
| @@ -345,6 +353,7 @@ function clearGrid(svg, puzzle) { | |||
| 345 | window.deleteElementsByClassName(svg, 'line-1') | 353 | window.deleteElementsByClassName(svg, 'line-1') |
| 346 | window.deleteElementsByClassName(svg, 'line-2') | 354 | window.deleteElementsByClassName(svg, 'line-2') |
| 347 | window.deleteElementsByClassName(svg, 'line-3') | 355 | window.deleteElementsByClassName(svg, 'line-3') |
| 356 | window.deleteElementsByClassName(svg, 'line-4') | ||
| 348 | puzzle.clearLines() | 357 | puzzle.clearLines() |
| 349 | } | 358 | } |
| 350 | 359 | ||
| @@ -506,7 +515,11 @@ window.onTraceStart = function(puzzle, pos, svg, start, symStart=null) { | |||
| 506 | 515 | ||
| 507 | data.symcursor = createElement('circle') | 516 | data.symcursor = createElement('circle') |
| 508 | svg.insertBefore(data.symcursor, data.cursor) | 517 | svg.insertBefore(data.symcursor, data.cursor) |
| 509 | data.symcursor.setAttribute('class', 'line-3 ' + data.svg.id) | 518 | if (data.puzzle.settings.INVISIBLE_SYMMETRY) { |
| 519 | data.symcursor.setAttribute('class', 'line-4 ' + data.svg.id) | ||
| 520 | } else { | ||
| 521 | data.symcursor.setAttribute('class', 'line-3 ' + data.svg.id) | ||
| 522 | } | ||
| 510 | data.symcursor.setAttribute('cx', symStart.getAttribute('cx')) | 523 | data.symcursor.setAttribute('cx', symStart.getAttribute('cx')) |
| 511 | data.symcursor.setAttribute('cy', symStart.getAttribute('cy')) | 524 | data.symcursor.setAttribute('cy', symStart.getAttribute('cy')) |
| 512 | data.symcursor.setAttribute('r', 12) | 525 | data.symcursor.setAttribute('r', 12) |
| diff --git a/app/assets/javascripts/wittle/utilities.js.erb b/app/assets/javascripts/wittle/utilities.js.erb index 487af6e..6bf3a17 100644 --- a/app/assets/javascripts/wittle/utilities.js.erb +++ b/app/assets/javascripts/wittle/utilities.js.erb | |||
| @@ -153,6 +153,10 @@ l('.line-3 {') | |||
| 153 | l(' fill: ' + window.LINE_SECONDARY + ';') | 153 | l(' fill: ' + window.LINE_SECONDARY + ';') |
| 154 | l(' pointer-events: none;') | 154 | l(' pointer-events: none;') |
| 155 | l('}') | 155 | l('}') |
| 156 | l('.line-4 {') | ||
| 157 | l(' display: none;') | ||
| 158 | l(' pointer-events: none;') | ||
| 159 | l('}') | ||
| 156 | l('@keyframes line-success {to {fill: ' + window.LINE_SUCCESS + ';}}') | 160 | l('@keyframes line-success {to {fill: ' + window.LINE_SUCCESS + ';}}') |
| 157 | l('@keyframes line-fail {to {fill: ' + window.LINE_FAIL + ';}}') | 161 | l('@keyframes line-fail {to {fill: ' + window.LINE_FAIL + ';}}') |
| 158 | l('@keyframes error {to {fill: red;}}') | 162 | l('@keyframes error {to {fill: red;}}') |
| diff --git a/ext/wittle_generator/Generate.cpp b/ext/wittle_generator/Generate.cpp index ed5f2f5..a5c0af9 100644 --- a/ext/wittle_generator/Generate.cpp +++ b/ext/wittle_generator/Generate.cpp | |||
| @@ -136,6 +136,10 @@ void Generate::initPanel() { | |||
| 136 | if (pathWidth != 1) | 136 | if (pathWidth != 1) |
| 137 | _panel->pathWidth = pathWidth; // Init path scale. "1" is considered the | 137 | _panel->pathWidth = pathWidth; // Init path scale. "1" is considered the |
| 138 | // default, and therefore means no change. | 138 | // default, and therefore means no change. |
| 139 | |||
| 140 | if (hasFlag(Config::WriteInvisible)) { | ||
| 141 | _panel->SetInvisibleSymmetry(true); | ||
| 142 | } | ||
| 139 | } | 143 | } |
| 140 | 144 | ||
| 141 | // Place a specific symbol into the puzzle at the specified location. The | 145 | // Place a specific symbol into the puzzle at the specified location. The |
| diff --git a/ext/wittle_generator/Panel.cpp b/ext/wittle_generator/Panel.cpp index 892d4cc..879d205 100644 --- a/ext/wittle_generator/Panel.cpp +++ b/ext/wittle_generator/Panel.cpp | |||
| @@ -225,9 +225,13 @@ std::string Panel::Write() { | |||
| 225 | } | 225 | } |
| 226 | 226 | ||
| 227 | serializer.writeInt(0); | 227 | serializer.writeInt(0); |
| 228 | serializer.writeByte(Serializer::NegationsCancelNegations | | 228 | |
| 229 | Serializer::PrecisePolyominos | | 229 | char settings = Serializer::NegationsCancelNegations | |
| 230 | Serializer::FlashForErrors); | 230 | Serializer::PrecisePolyominos | Serializer::FlashForErrors; |
| 231 | if (_invisible_symmetry) { | ||
| 232 | settings |= Serializer::InvisibleSymmetry; | ||
| 233 | } | ||
| 234 | serializer.writeByte(settings); | ||
| 231 | 235 | ||
| 232 | return serializer.str(); | 236 | return serializer.str(); |
| 233 | } | 237 | } |
| diff --git a/ext/wittle_generator/Panel.h b/ext/wittle_generator/Panel.h index b8dec2f..95832b5 100644 --- a/ext/wittle_generator/Panel.h +++ b/ext/wittle_generator/Panel.h | |||
| @@ -169,6 +169,8 @@ class Panel { | |||
| 169 | int get(int x, int y) { return _grid[x][y]; } | 169 | int get(int x, int y) { return _grid[x][y]; } |
| 170 | void set(int x, int y, int val) { _grid[x][y] = val; } | 170 | void set(int x, int y, int val) { _grid[x][y] = val; } |
| 171 | 171 | ||
| 172 | void SetInvisibleSymmetry(bool val) { _invisible_symmetry = val; } | ||
| 173 | |||
| 172 | std::string Write(); | 174 | std::string Write(); |
| 173 | 175 | ||
| 174 | enum Style { | 176 | enum Style { |
| @@ -447,6 +449,7 @@ class Panel { | |||
| 447 | float minx, miny, maxx, maxy, unitWidth, unitHeight; | 449 | float minx, miny, maxx, maxy, unitWidth, unitHeight; |
| 448 | int _style; | 450 | int _style; |
| 449 | bool _resized; | 451 | bool _resized; |
| 452 | bool _invisible_symmetry = false; | ||
| 450 | }; | 453 | }; |
| 451 | 454 | ||
| 452 | #endif /* end of include guard: PANEL_H_FC471D68 */ | 455 | #endif /* end of include guard: PANEL_H_FC471D68 */ |
| diff --git a/ext/wittle_generator/Serializer.h b/ext/wittle_generator/Serializer.h index 86b262d..6eeb887 100644 --- a/ext/wittle_generator/Serializer.h +++ b/ext/wittle_generator/Serializer.h | |||
| @@ -56,7 +56,8 @@ class Serializer { | |||
| 56 | PrecisePolyominos = 4, | 56 | PrecisePolyominos = 4, |
| 57 | FlashForErrors = 8, | 57 | FlashForErrors = 8, |
| 58 | FatStartpoints = 16, | 58 | FatStartpoints = 16, |
| 59 | CustomMechanics = 32 | 59 | CustomMechanics = 32, |
| 60 | InvisibleSymmetry = 64, | ||
| 60 | }; | 61 | }; |
| 61 | 62 | ||
| 62 | enum GapType : char { GapNone = 0, GapBreak = 1, GapFull = 2 }; | 63 | enum GapType : char { GapNone = 0, GapBreak = 1, GapFull = 2 }; |
