about summary refs log tree commit diff stats
path: root/ext/wittle_generator
diff options
context:
space:
mode:
Diffstat (limited to 'ext/wittle_generator')
-rw-r--r--ext/wittle_generator/Panel.cpp8
-rw-r--r--ext/wittle_generator/Panel.h32
-rw-r--r--ext/wittle_generator/wittle_generator.cpp116
3 files changed, 132 insertions, 24 deletions
diff --git a/ext/wittle_generator/Panel.cpp b/ext/wittle_generator/Panel.cpp index 879d205..3279943 100644 --- a/ext/wittle_generator/Panel.cpp +++ b/ext/wittle_generator/Panel.cpp
@@ -127,12 +127,6 @@ std::string Panel::Write() {
127 int genericFlags = 0; 127 int genericFlags = 0;
128 if (symmetry != Symmetry::None) { 128 if (symmetry != Symmetry::None) {
129 genericFlags |= Serializer::Symmetrical; 129 genericFlags |= Serializer::Symmetrical;
130 if (symmetry == Symmetry::Vertical || symmetry == Symmetry::Rotational) {
131 genericFlags |= Serializer::SymmetryX;
132 }
133 if (symmetry == Symmetry::Horizontal || symmetry == Symmetry::Rotational) {
134 genericFlags |= Serializer::SymmetryY;
135 }
136 } 130 }
137 serializer.writeByte(genericFlags); 131 serializer.writeByte(genericFlags);
138 132
@@ -233,5 +227,7 @@ std::string Panel::Write() {
233 } 227 }
234 serializer.writeByte(settings); 228 serializer.writeByte(settings);
235 229
230 serializer.writeByte(symmetry);
231
236 return serializer.str(); 232 return serializer.str();
237} 233}
diff --git a/ext/wittle_generator/Panel.h b/ext/wittle_generator/Panel.h index d152370..3bc23c9 100644 --- a/ext/wittle_generator/Panel.h +++ b/ext/wittle_generator/Panel.h
@@ -188,22 +188,22 @@ class Panel {
188 188
189 enum Symmetry { // NOTE - Not all of these are valid symmetries for certain 189 enum Symmetry { // NOTE - Not all of these are valid symmetries for certain
190 // puzzles 190 // puzzles
191 None, 191 None = 0,
192 Horizontal, 192 Horizontal = 1,
193 Vertical, 193 Vertical = 2,
194 Rotational, 194 Rotational = 3,
195 RotateLeft, 195 RotateLeft = 4,
196 RotateRight, 196 RotateRight = 5,
197 FlipXY, 197 FlipXY = 6,
198 FlipNegXY, 198 FlipNegXY = 7,
199 ParallelH, 199 ParallelH = 8,
200 ParallelV, 200 ParallelV = 9,
201 ParallelHFlip, 201 ParallelHFlip = 10,
202 ParallelVFlip, 202 ParallelVFlip = 11,
203 PillarParallel, 203 PillarParallel = 12,
204 PillarHorizontal, 204 PillarHorizontal = 13,
205 PillarVertical, 205 PillarVertical = 14,
206 PillarRotational 206 PillarRotational = 15,
207 }; 207 };
208 Symmetry symmetry; 208 Symmetry symmetry;
209 209
diff --git a/ext/wittle_generator/wittle_generator.cpp b/ext/wittle_generator/wittle_generator.cpp index c2407cf..0efac07 100644 --- a/ext/wittle_generator/wittle_generator.cpp +++ b/ext/wittle_generator/wittle_generator.cpp
@@ -420,7 +420,7 @@ Rice::Object wittle_generator_generate_easy(Rice::Object /* self */) {
420Rice::Object wittle_generator_generate_medium(Rice::Object /* self */) { 420Rice::Object wittle_generator_generate_medium(Rice::Object /* self */) {
421 Generate generator; 421 Generate generator;
422 422
423 int choice = Random::rand() % 66; 423 int choice = Random::rand() % 69;
424 std::cout << "Generate MEDIUM: choice " << std::dec << choice << std::endl; 424 std::cout << "Generate MEDIUM: choice " << std::dec << choice << std::endl;
425 425
426 switch (choice) { 426 switch (choice) {
@@ -1015,6 +1015,33 @@ Rice::Object wittle_generator_generate_medium(Rice::Object /* self */) {
1015 {Decoration::Dot_Intersection, 25}}}); 1015 {Decoration::Dot_Intersection, 25}}});
1016 break; 1016 break;
1017 } 1017 }
1018 case 66: {
1019 generator.setSymmetry(Panel::Symmetry::FlipNegXY);
1020 generator.generate(7, 7,
1021 {{{Decoration::Gap, 10},
1022 {Decoration::Dot_Intersection, 8},
1023 {Decoration::Start, 2},
1024 {Decoration::Exit, 1}}});
1025 break;
1026 }
1027 case 67: {
1028 generator.setSymmetry(Panel::Symmetry::ParallelV);
1029 generator.generate(7, 7,
1030 {{{Decoration::Gap, 12},
1031 {Decoration::Dot_Intersection, 10},
1032 {Decoration::Start, 2},
1033 {Decoration::Exit, 1}}});
1034 break;
1035 }
1036 case 68: {
1037 generator.setSymmetry(Panel::Symmetry::ParallelHFlip);
1038 generator.generate(7, 7,
1039 {{{Decoration::Gap, 12},
1040 {Decoration::Dot_Intersection, 10},
1041 {Decoration::Start, 2},
1042 {Decoration::Exit, 1}}});
1043 break;
1044 }
1018 } 1045 }
1019 1046
1020 Rice::String str(generator.AsCode()); 1047 Rice::String str(generator.AsCode());
@@ -1024,7 +1051,7 @@ Rice::Object wittle_generator_generate_medium(Rice::Object /* self */) {
1024Rice::Object wittle_generator_generate_expert(Rice::Object /* self */) { 1051Rice::Object wittle_generator_generate_expert(Rice::Object /* self */) {
1025 Generate generator; 1052 Generate generator;
1026 1053
1027 int choice = Random::rand() % 40; 1054 int choice = Random::rand() % 46;
1028 std::cout << "Generate EXPERT: choice " << std::dec << choice << std::endl; 1055 std::cout << "Generate EXPERT: choice " << std::dec << choice << std::endl;
1029 1056
1030 switch (choice) { 1057 switch (choice) {
@@ -1497,6 +1524,91 @@ Rice::Object wittle_generator_generate_expert(Rice::Object /* self */) {
1497 {Decoration::Dot_Intersection, 36}}}); 1524 {Decoration::Dot_Intersection, 36}}});
1498 break; 1525 break;
1499 } 1526 }
1527 case 40: {
1528 generator.setGridSize(7, 7);
1529 generator.setFlag(Generate::RequireCombineShapes);
1530 generator.setSymmetry(Panel::ParallelV);
1531 generator.setSymbol(Decoration::Start, 0, 14);
1532 generator.setSymbol(Decoration::Start, 8, 14);
1533 generator.setSymbol(Decoration::Exit, 6, 0);
1534 generator.setSymbol(Decoration::Exit, 14, 0);
1535 generator.generate(7, 7,
1536 {{{Decoration::Poly | Decoration::Color::Orange, 5}}});
1537 break;
1538 }
1539 case 41: {
1540 generator.setGridSize(7, 7);
1541 generator.setFlag(Generate::RequireCombineShapes);
1542 generator.setSymmetry(Panel::ParallelHFlip);
1543 generator.setSymbol(Decoration::Start, 0, 14);
1544 generator.setSymbol(Decoration::Start, 14, 6);
1545 generator.setSymbol(Decoration::Exit, 0, 0);
1546 generator.setSymbol(Decoration::Exit, 14, 8);
1547 generator.generate(7, 7,
1548 {{{Decoration::Poly | Decoration::Color::Orange, 5}}});
1549 break;
1550 }
1551 case 42: {
1552 generator.setGridSize(7, 7);
1553 generator.setFlag(Generate::RequireCombineShapes);
1554 generator.setSymmetry(Panel::ParallelVFlip);
1555 generator.setSymbol(Decoration::Start, 0, 14);
1556 generator.setSymbol(Decoration::Start, 8, 0);
1557 generator.setSymbol(Decoration::Exit, 6, 0);
1558 generator.setSymbol(Decoration::Exit, 14, 14);
1559 generator.generate(7, 7,
1560 {{{Decoration::Poly | Decoration::Color::Orange, 5}}});
1561 break;
1562 }
1563 case 43: {
1564 generator.setSymmetry(Panel::Symmetry::RotateLeft);
1565 generator.setSymbol(Decoration::Start, 4, 4);
1566 generator.setSymbol(Decoration::Start, 10, 4);
1567 generator.setSymbol(Decoration::Start, 4, 10);
1568 generator.setSymbol(Decoration::Start, 10, 10);
1569 generator.setSymbol(Decoration::Exit, 4, 0);
1570 generator.setSymbol(Decoration::Exit, 14, 4);
1571 generator.setSymbol(Decoration::Exit, 0, 10);
1572 generator.setSymbol(Decoration::Exit, 10, 14);
1573 generator.generate(
1574 7, 7,
1575 {{{Decoration::Triangle4 | Decoration::Color::Orange, 1},
1576 {Decoration::Triangle | Decoration::Color::Orange, 4}}});
1577 break;
1578 }
1579 case 44: {
1580 generator.setFlag(Generate::WriteInvisible);
1581 generator.setFlag(Generate::StartEdgeOnly);
1582 generator.setSymmetry(Panel::Symmetry::FlipXY);
1583 generator.setSymbol(Decoration::Exit, 0, 8);
1584 generator.setSymbol(Decoration::Exit, 8, 0);
1585 generator.generate(7, 7,
1586 {{{Decoration::Dot | Decoration::Color::Blue, 2},
1587 {Decoration::Dot | Decoration::Color::Yellow, 2},
1588 {Decoration::Dot, 8},
1589 {Decoration::Eraser | Decoration::Color::White, 1},
1590 {Decoration::Start, 1}}});
1591 break;
1592 }
1593 case 45: {
1594 generator.setFlag(Generate::WriteInvisible);
1595 generator.setSymmetry(Panel::Symmetry::FlipXY);
1596 generator.setSymbol(Decoration::Start, 0, 16);
1597 generator.setSymbol(Decoration::Start, 16, 0);
1598 generator.setSymbol(Decoration::Exit, 8, 0);
1599 generator.setSymbol(Decoration::Exit, 8, 16);
1600 generator.setSymbol(Decoration::Exit, 0, 8);
1601 generator.setSymbol(Decoration::Exit, 16, 8);
1602 generator.generate(
1603 8, 8,
1604 {{{Decoration::Triangle | Decoration::Color::Cyan, 3},
1605 {Decoration::Triangle | Decoration::Color::Yellow, 2},
1606 {Decoration::Star | Decoration::Color::Cyan, 3},
1607 {Decoration::Star | Decoration::Color::Yellow, 3},
1608 {Decoration::Stone | Decoration::Color::Cyan, 2},
1609 {Decoration::Stone | Decoration::Color::Yellow, 3}}});
1610 break;
1611 }
1500 } 1612 }
1501 1613
1502 Rice::String str(generator.AsCode()); 1614 Rice::String str(generator.AsCode());