Skip to content

Commit

Permalink
Merge branch 'master' into Archipelago
Browse files Browse the repository at this point in the history
  • Loading branch information
Jarno458 authored Apr 23, 2022
2 parents 4ce8916 + dd0a7fe commit 57161ae
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 30 deletions.
12 changes: 6 additions & 6 deletions App/App.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -23,32 +23,32 @@
<ProjectGuid>{235D27F1-9907-489B-8D58-636A0C5CD079}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>App</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0.18362.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
Expand Down Expand Up @@ -160,7 +160,7 @@
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalIncludeDirectories>..\Source;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<TreatWarningAsError>false</TreatWarningAsError>
<TreatWarningAsError>true</TreatWarningAsError>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalOptions>/Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ Currently there are two people working on this.

# Witness Random Puzzle Generator

### [Click Here to Download (ver 1.2.3)](https://github.com/sigma144/witness-randomizer/releases/download/1.2.3/WitnessRPG1.2.3.zip)
### [Click Here to Download (ver 1.3.0)](https://github.com/sigma144/witness-randomizer/releases/download/1.3.0/WitnessRPG1.3.0.zip)

#### Randomizer Version 1.2 is finally out! It includes numerous puzzle tweaks, nerfs, and bug fixes. Full change log coming shortly
#### Randomizer Version 1.3 is out, which includes compatibility for Expert double rando! Double rando capability is also now included in the randomizer itself. This release has not been fully tested, so I will be actively monitoring for any issues/bugs that crop up. Big thank you to hatkirbyy who contributed the code for this release and got Expert working 😄

The Witness Random Puzzle Generator takes most of the puzzles in Jonathan Blow's "The Witness" and makes them into new, randomly generated puzzles. The mod requires the game in order to function. No game files will be altered, as the randomizer works enterly in RAM. This mod uses WinAPI, so it is only compatible with Microsoft Windows. There is a program you can use that might make it work with Linux; see https://marugawa.dk/witness-randomizer-on-linux for more details.

Expand Down
17 changes: 16 additions & 1 deletion Source/Generate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,10 @@ bool Generate::generate_maze(int id, int numStarts, int numExits)
return false;

clear();
if (hasFlag(Generate::Config::ShortPath)) {
while (!generate_path_length((_panel->_width + _panel->_height),
min((_panel->_width + _panel->_height) * 2, (_panel->_width / 2 + 1) * (_panel->_height / 2 + 1) * 1 / 2))) clear();
}
while (!generate_path_length((_panel->_width + _panel->_height),
std::min((_panel->_width + _panel->_height) * 2, (_panel->_width / 2 + 1) * (_panel->_height / 2 + 1) * 4 / 5))) clear();
}
Expand Down Expand Up @@ -494,6 +498,17 @@ bool Generate::generate_maze(int id, int numStarts, int numExits)
set(p, Decoration::Gap_Column);
}
_path = path; //Restore backup of the correct solution for testing purposes
std::vector<std::string> solution; //For debugging only
for (int y = 0; y < _panel->_height; y++) {
std::string row;
for (int x = 0; x < _panel->_width; x++) {
if (_path.count(Point(x, y))) {
row += "xx";
}
else row += " ";
}
solution.push_back(row);
}
if (!hasFlag(Config::DisableWrite)) write(id);
return true;
}
Expand Down Expand Up @@ -618,7 +633,7 @@ bool Generate::generate_path(PuzzleSymbols & symbols)
if (_obstructions.size() > 0) {
std::vector<Point> walls = pick_random(_obstructions);
for (Point p : walls) if (get(p) == 0) set(p, p.first % 2 == 0 ? Decoration::Gap_Column : Decoration::Gap_Row);
bool result = (hasFlag(Config::ShortPath) ? generate_path_length(1) : _parity != -1 ? generate_longest_path() :
bool result = (hasFlag(Config::ShortPath) ? generate_path_length(1) : _parity != -1 ? generate_longest_path() :
hitPoints.size() > 0 ? generate_special_path() : generate_path_length(_panel->get_num_grid_points() * 3 / 4));
for (Point p : walls) if (get(p) & Decoration::Gap) set(p, 0);
return result;
Expand Down
31 changes: 16 additions & 15 deletions Source/PuzzleList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,16 +181,15 @@ void PuzzleList::GenerateSymmetryN()
generator->removeFlagOnce(Generate::Config::StartEdgeOnly);
generator->generateMaze(0x00059, 1, 0);
generator->generateMaze(0x00062);
generator->generateMaze(0x0005C);
specialCase->generateSpecialSymMaze(generator, 0x0005C);
//Rotational Symmetry Mazes
generator->setSymmetry(Panel::Symmetry::Rotational);
generator->setGridSize(5, 5);
generator->generateMaze(0x0008D, 0, 1);
generator->generateMaze(0x00081, 1, 1);
generator->removeFlagOnce(Generate::Config::StartEdgeOnly);
generator->generateMaze(0x00083, 1, 1);
generator->setGridSize(6, 6);
generator->generateMaze(0x00083);
generator->setGridSize(7, 7);
generator->pathWidth = 0.8f;
generator->generateMaze(0x00084);
generator->generateMaze(0x00082);
generator->generateMaze(0x0343A);
Expand Down Expand Up @@ -426,9 +425,9 @@ void PuzzleList::GenerateSwampN()
generator->pathWidth = 0.6f;
generator->generate(0x0000A, Decoration::Poly | Decoration::Can_Rotate, 1, Decoration::Gap, 15);
//5x5 Rotating Shapes
generator->generate(0x003B2, Decoration::Poly | Decoration::Can_Rotate, 3, Decoration::Gap, 3);
generator->generate(0x003B2, Decoration::Poly | Decoration::Can_Rotate, 3, Decoration::Gap, 2);
generator->generate(0x00A1E, Decoration::Poly | Decoration::Can_Rotate, 4);
generator->generate(0x00C2E, Decoration::Poly | Decoration::Can_Rotate, 2, Decoration::Poly, 1, Decoration::Gap, 3);
generator->generate(0x00C2E, Decoration::Poly | Decoration::Can_Rotate, 2, Decoration::Poly, 1, Decoration::Gap, 2);
generator->setFlagOnce(Generate::Config::BigShapes);
generator->generate(0x00E3A, Decoration::Poly | Decoration::Can_Rotate, 3);
//Optional Tetris
Expand Down Expand Up @@ -509,7 +508,9 @@ void PuzzleList::GenerateTreehouseN()
generator->generate(0x17DC7, Decoration::Star | Decoration::Color::Magenta, 6, Decoration::Dot_Intersection, 6, Decoration::Gap, 3);
generator->generate(0x17CE4, Decoration::Star | Decoration::Color::Magenta, 6, Decoration::Dot_Intersection, 6, Decoration::Gap, 3);
generator->setGridSize(5, 5);
generator->pathWidth = 0.8f;
generator->generate(0x17D2D, Decoration::Star | Decoration::Color::Magenta, 6, Decoration::Dot_Intersection, 9, Decoration::Gap, 8);
generator->pathWidth = 1;
generator->generate(0x17D6C, Decoration::Star | Decoration::Color::Magenta, 8, Decoration::Dot_Intersection, 9, Decoration::Gap, 5);
generator->removeFlag(Generate::Config::FullGaps);
//Pink Bridge 2
Expand Down Expand Up @@ -552,10 +553,10 @@ void PuzzleList::GenerateTreehouseN()
generator->generate(0x17DE3, Decoration::Star | Decoration::Color::Black, 2, Decoration::Star | Decoration::Color::White, 2, Decoration::Stone | Decoration::Color::Black, 3, Decoration::Stone | Decoration::Color::White, 3);
generator->removeFlag(Generate::Config::AlternateColors);
generator->setGridSize(4, 4);
generator->generate(0x17DEC, Decoration::Star | Decoration::Color::Black, 3, Decoration::Stone | Decoration::Color::Black, 3, Decoration::Stone | Decoration::Color::White, 3);
generator->generate(0x17DAE, Decoration::Star | Decoration::Color::White, 4, Decoration::Stone | Decoration::Color::White, 3, Decoration::Stone | Decoration::Color::Black, 3);
generator->generate(0x17DB0, Decoration::Star | Decoration::Color::Black, 3, Decoration::Star | Decoration::Color::White, 2, Decoration::Stone | Decoration::Color::Black, 3, Decoration::Stone | Decoration::Color::White, 3);
generator->generate(0x17DDB, Decoration::Star | Decoration::Color::Black, 3, Decoration::Star | Decoration::Color::White, 3, Decoration::Stone | Decoration::Color::Black, 2, Decoration::Stone | Decoration::Color::White, 2);
generator->generate(0x17DEC, Decoration::Star | Decoration::Color::Black, 3, Decoration::Star | Decoration::Color::White, 2, Decoration::Stone | Decoration::Color::Black, 2, Decoration::Stone | Decoration::Color::White, 2);
generator->generate(0x17DAE, Decoration::Star | Decoration::Color::Black, 3, Decoration::Star | Decoration::Color::White, 3, Decoration::Stone | Decoration::Color::Black, 2, Decoration::Stone | Decoration::Color::White, 2);
generator->generate(0x17DB0, Decoration::Star | Decoration::Color::Black, 3, Decoration::Star | Decoration::Color::White, 4, Decoration::Stone | Decoration::Color::Black, 2, Decoration::Stone | Decoration::Color::White, 2);
generator->generate(0x17DDB, Decoration::Star | Decoration::Color::Black, 4, Decoration::Star | Decoration::Color::White, 4, Decoration::Stone | Decoration::Color::Black, 2, Decoration::Stone | Decoration::Color::White, 2);
//Orange Bridge 2
generator->setFlag(Generate::Config::TreehouseColors);
generator->setGridSize(3, 3);
Expand Down Expand Up @@ -1368,7 +1369,7 @@ void PuzzleList::GenerateQuarryH()
//All together
generator->removeFlag(Generate::Config::WriteColors);
generator->setFlag(Generate::Config::ResetColors);
generator->setGridSize(7, 3);
generator->setGridSize(6, 3);
generator->pathWidth = 0.6f;
generator->generate(0x0A3CB, Decoration::Star | Decoration::Color::Orange, 4, Decoration::Poly | Decoration::Color::Orange, 2,
Decoration::Poly | Decoration::Negative | Decoration::Color::Magenta, 2, Decoration::Eraser | Decoration::White, 2);
Expand Down Expand Up @@ -1704,7 +1705,7 @@ void PuzzleList::GenerateTreehouseH()
generator->generate(0x17D8C, Decoration::Star | Decoration::Color::Orange, 1, Decoration::Star | Decoration::Color::Magenta, 2,
Decoration::Triangle | Decoration::Color::Orange, 3, Decoration::Triangle | Decoration::Color::Magenta, 2);
specialCase->generatePivotPanel(0x17CE3, { 4, 4 }, { { Decoration::Triangle | Decoration::Color::Orange, 3 },{ Decoration::Triangle | Decoration::Color::Magenta, 2 } }, generator->colorblind);
generator->setGridSize(5, 5);
generator->setGridSize(5, 4);
generator->pathWidth = 0.8f;
generator->generate(0x17DCD, Decoration::Star | Decoration::Color::Orange, 3, Decoration::Star | Decoration::Color::Magenta, 3,
Decoration::Triangle | Decoration::Color::Orange, 3, Decoration::Triangle | Decoration::Color::Magenta, 3);
Expand All @@ -1719,9 +1720,9 @@ void PuzzleList::GenerateTreehouseH()
specialCase->generatePivotPanel(0x17DB7, { 4, 4 }, { { Decoration::Triangle | Decoration::Color::Orange, 2 },{ Decoration::Triangle | Decoration::Color::Magenta, 2 },{ Decoration::Triangle | Decoration::Color::Green, 1 } }, generator->colorblind);
generator->generate(0x17DB1, { { Decoration::Star | Decoration::Color::Orange, 3 },{ Decoration::Star | Decoration::Color::Magenta, 3 },{ Decoration::Star | Decoration::Color::White, 3 },
{ Decoration::Star | Decoration::Color::Green, 3 },
{ Decoration::Triangle | Decoration::Color::Orange, 2 },{ Decoration::Triangle | Decoration::Color::Magenta, 2 },{ Decoration::Triangle | Decoration::Color::White, 1 },
{ Decoration::Triangle | Decoration::Color::Orange, 1 },{ Decoration::Triangle | Decoration::Color::Magenta, 1 },{ Decoration::Triangle | Decoration::Color::White, 1 },
{ Decoration::Triangle | Decoration::Color::Green, 1 } });
generator->generate(0x17DA2, { { Decoration::Star | Decoration::Color::Orange, 3 },{ Decoration::Star | Decoration::Color::Magenta, 3 },{ Decoration::Star | Decoration::Color::White, 2 },
generator->generate(0x17DA2, { { Decoration::Star | Decoration::Color::Orange, 2 },{ Decoration::Star | Decoration::Color::Magenta, 2 },{ Decoration::Star | Decoration::Color::White, 2 },
{ Decoration::Star | Decoration::Color::Green, 2 },{ Decoration::Star | Decoration::Color::Black, 2 },
{ Decoration::Triangle | Decoration::Color::Orange, 1 },{ Decoration::Triangle | Decoration::Color::Magenta, 1 },{ Decoration::Triangle | Decoration::Color::White, 1 },
{ Decoration::Triangle | Decoration::Color::Green, 1 },{ Decoration::Triangle | Decoration::Color::Black, 1 } });
Expand Down Expand Up @@ -2067,7 +2068,7 @@ void PuzzleList::GenerateMountainH()
Decoration::Triangle | Decoration::Color::Orange, 2, Decoration::Dot_Intersection | Decoration::Color::Cyan, 2, Decoration::Dot_Intersection | Decoration::Color::Yellow, 2);
specialCase->initPillarSymmetry(generator, 0x33961, Panel::Symmetry::PillarParallel);
generator->generate(0x33961, Decoration::Triangle | Decoration::Color::Orange, 2, Decoration::Triangle | Decoration::Color::Magenta, 1,
Decoration::Star | Decoration::Color::Orange, 1, Decoration::Star | Decoration::Color::Magenta, 2, Decoration::Poly | Decoration::Color::Orange, 1,
Decoration::Star | Decoration::Color::Orange, 1, Decoration::Star | Decoration::Color::Magenta, 1, Decoration::Poly | Decoration::Color::Orange, 1,
Decoration::Poly | Decoration::Negative | Decoration::Color::Magenta, 2, Decoration::Eraser | Decoration::Color::Magenta, 1);
}

Expand Down
12 changes: 6 additions & 6 deletions Source/Source.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -23,32 +23,32 @@
<ProjectGuid>{6B5DF051-A51A-48CB-8ACD-C6FAD726019F}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>Source</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0.18362.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
Expand Down Expand Up @@ -113,7 +113,7 @@
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<TreatWarningAsError>false</TreatWarningAsError>
<TreatWarningAsError>true</TreatWarningAsError>
<EnablePREfast>true</EnablePREfast>
<AdditionalIncludeDirectories>Archipelago\Client\asio\include;Archipelago\Client\websocketpp;Archipelago\Client\wswrap\include;Archipelago\Client\json\include;Archipelago\Client\valijson\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
Expand Down
23 changes: 23 additions & 0 deletions Source/Special.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,29 @@
#include "Quaternion.h"
#include "../App/Version.h"

void Special::generateSpecialSymMaze(std::shared_ptr<Generate> gen, int id) {
do {
gen->setFlagOnce(Generate::Config::DisableWrite);
generator->setSymbol(Decoration::Start, 0, 16);
generator->setSymbol(Decoration::Start, 22, 16);
generator->setSymbol(Decoration::Exit, 8, 0);
generator->setSymbol(Decoration::Exit, 14, 0);
generator->setFlagOnce(Generate::Config::ShortPath);
generator->generateMaze(0x0005C);
} while (generator->_path.count(Point(12, 16)));
std::shared_ptr<Panel> puzzle = gen->_panel;
for (int x = 0; x < puzzle->_width / 2; x++) {
for (int y = 0; y < puzzle->_height; y++) {
Point sp = puzzle->get_sym_point(x, y, Panel::Symmetry::Vertical);
if (puzzle->_grid[sp.first][sp.second] & Decoration::Gap) {
puzzle->_grid[x][y] = puzzle->_grid[sp.first][sp.second];
puzzle->_grid[sp.first][sp.second] = 0;
}
}
}
gen->write(id);
}

void Special::generateReflectionDotPuzzle(std::shared_ptr<Generate> gen, int id1, int id2, std::vector<std::pair<int, int>> symbols, Panel::Symmetry symmetry, bool split)
{
gen->setFlagOnce(Generate::Config::DisableWrite);
Expand Down
1 change: 1 addition & 0 deletions Source/Special.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class Special {
this->generator = generator;
}

void generateSpecialSymMaze(std::shared_ptr<Generate> gen, int id);
void generateReflectionDotPuzzle(std::shared_ptr<Generate> gen, int id1, int id2, std::vector<std::pair<int, int>> symbols, Panel::Symmetry symmetry, bool split);
void generateAntiPuzzle(int id);
void generateColorFilterPuzzle(int id, Point size, const std::vector<std::pair<int, int>>& symbols, const Color& filter);
Expand Down

0 comments on commit 57161ae

Please sign in to comment.