TODAY'S GOAL:

* Create a move function for iterators that recalculates their position to make it easy to move them inside the matrix.  This can then be used in lighting. Just make an iterator once, and move it around after.
* Components::Tile must also die.
* MapConfig must die.
* Tile component needs to go, use the Tiles from the json.
* Fire icon \u2034
* Water icon \u224b
* Flame pillars icon \u2e3e
* Room should always be found.
* matrix::in_box needs a rectangle alternative
* DinkyECS needs to detect when a requested fact is missing and make a default.

* Study https://github.com/hirdrac/gx_lib/blob/main/gx/Unicode.hh
* Study this https://en.cppreference.com/w/cpp/language/explicit
* Study https://en.cppreference.com/w/cpp/language/member_functions#Special_member_functions

-1. Learn std::initializer_list by using it.
0. \ua3fd causes the character immediately after to vanish. Make a test and solve it.
1. Why do Sliders only have to be kept around forever and can't go in containers like everything else?

TODO:

* Add a char lookup input to the designer.

* Make the light directional.

* Hot key for debug view.

* Refine the event handling to pass most of them to the gui panels and then I can intercept them.

* Resolve fmt::format vs std::format from hirdrac when using clang or gcc latest.

* Fix " room should always be found"

* Fix BUG markers as much as possible.

* Make room generation have "texture" or state like mossy, flooded, etc.

* A condition map that indicates what each tile's condition is, so it can have "watery", "wet", "mossy", "burned", and that changes the color of the foreground/background but not the actual tile.
* A tile will then denote a kind of surface, so stone, water, lava, etc.
* Lua integration

* Enemies stuck in walls after generation.

* Save file needs work, it's not saving gold and lights.

* Move all keyboard and mouse events into SFMLRender so it's completely abstracted away and can be changed to a different backend if I want.

* When fighting two enemies with lots of attacks it crashes because one dies and isn't there.  Test by making enemies immortal.
* LightRender can just use the Dijkstra map paths to calculate light strenght from the point rather than doing the box thing.
* $paths.$paths is annoying.
* Format of pre/post in dbc isn't consistent with the rest of the lib but I also maybe don't need the function version?
* I can do headless windows in renderer for testing.
  - renderer.$window.setVisible(false);
* Think up an enemy system.
* Write a method for renderer that can translate coordinates.
* Can std::any be defaulted to a noop in the events?
* Inventory needs to be better, but need some kinds of "weapons" or other loot to get and not just gold.
* Create a few more enemy types to fight.
* Devise a more complete map/world generator that can use the loot and enemies better.
* Maybe an LOS system, but the hearing version works pretty well so far.
* Probably a system for mapping collision types to sound effects, rather than having the GUI do it.
* Write a test that generates a ton of maps then confirms there's a path from one room to every other room?

* check out SoLoud.

* BUG: When enemies die they can be overlapping another enemy.
