This is a simple puzzle game based on "The Floor Will be Lava".
Screen shot below.
You can either clone the repository and build it yourself (using Rider, Visual Studio or the command line tools), or download a pre-built version from the releases page.
You'll need the dotnet 8 runtime for your platform (Windows/macOS, X64/ARM64).
Other than the dotnet runtime, MonoGame requires some other dependencies. I have a script to install these here.
If that script doesn't work, try the following (which is what the script is attempting to automate).
- Make sure you have homebrew installed.
brew install freeimage
mkdir /usr/local/lib
(this folder may already exist, in which case this step is not needed).sudo ln -s /opt/homebrew/Cellar/freeimage/3.18.0/lib/libfreeimage.dylib /usr/local/lib/libfreeimage
brew install freetype
sudo ln -s /opt/homebrew/lib/libfreetype.6.dylib /usr/local/lib/libfreetype6
If you find the window is not a good size for you, you can change the size by altering ScaleFactor
in app-settings.json.
This need not bee an integer, if you want the window to be smaller, you can specify 0.5
or for larger 2
.
There is also a setting allowing you to skip levels by pressing N or reset a level with R.
Levels are defined in this JSON file.
It is an array of levels. Id
must start at 1
and increment by 1
.
[
{
"Id": 1,
"Starts": [ ],
"Ends": [ ],
"Blocked": [ ],
"Pieces": [ ],
"Mirrors": [ ]
},
{
"Id": 2,
etc...
}
]
The playing arena is 30 x 30
, so X
and Y
coordinates are in the range 0 .. 29
.
Starts
and Ends
take the same format. An X
and Y
coordination of the position, and a Direction
. For a Start
, this is the direction the laser will emit from.
For an End
, this is the direction the laser must hit the from. You can specify more than one of either.
"Starts": [ { "X": 2, "Y": 2, "Direction": "East" } ]
Blocked
specifies cells where the player cannot place a mirror, and the laser cannot pass through. This is just an array of coordinates.
"Blocked": [ { "X": 27, "Y": 2 } ]
Mirrors
is an array of mirrors already on the board when the level starts. It takes X
, Y
and Piece
properties.
Where Piece is |
, -
, /
or \\
(double backslash because of JSON escaping convention).
"Mirrors": [ { "X": 15, "Y": 15, "Piece": "/" }, { "X": 20, "Y": 15, "Piece": "\\" } ]
Lastly, Pieces
is an array of mirrors in the order the player will be presented with them. The same values are allowed as with Mirrors
.
"Pieces": [ "/", "-", "|", "\\", "/" ]
The level is complete when a beam is hitting all the Ends
.