#pragma once #include #include "dbc.hpp" #include "point.hpp" #include #include "matrix.hpp" #include "pathing.hpp" namespace lighting { struct LightSource { int strength = 0; // lower is better int distance = 1; // higher is farther, in squares }; const int MIN = 50; const int MAX = 170; const int MID = 130; const std::array LEVELS{ MAX, 160, 150, 140, MID, 120, 110, 90, 70, MIN, }; class LightRender { public: size_t $width; size_t $height; Matrix $lightmap; Pathing $paths; LightRender(size_t width, size_t height) : $width(width), $height(height), $lightmap(height, matrix::Row(width, 0)), $paths(width, height) {} void reset_light(); void set_light_target(const Point &at, int value=0); void clear_light_target(const Point &at); void path_light(Matrix &walls); void light_box(LightSource source, Point from, Point &min_out, Point &max_out); int light_level(int level, size_t x, size_t y); void render_light(LightSource source, Point at); void render_square_light(LightSource source, Point at, PointList &has_light); void render_compass_light(LightSource source, Point at, PointList &has_light); void render_circle_light(LightSource source, Point at, PointList &has_light); Matrix &lighting() { return $lightmap; } }; }