#ifndef JUMPARTIFACT_DOT_COM_DEMO_0_TANK_RUNNER_H_ #define JUMPARTIFACT_DOT_COM_DEMO_0_TANK_RUNNER_H_ #include "screen.h" // standard library includes #include #include #include #include // third party includes #include // local includes #include "common_constants.h" #include "electricity_effect.h" #include "spark_effect.h" #include "surface_triangle.h" #include "walker.h" constexpr float POS_VALUE_INC_RATE = 0.2F; constexpr float CAMERA_UPDATE_RATE = 1.0F; constexpr float SURFACE_HEIGHT_INTERVAL = 0.7F; constexpr int BUTTON_FONT_SIZE = 30; constexpr float SURFACE_RESET_TIME = 4.0F; constexpr float SURFACE_RESET_TIME_TRI_DRAW = 3.0F; constexpr float SURFACE_RESET_Y_OFFSET = 40.0F; constexpr int ELECTRICITY_EFFECT_LINE_COUNT = 35; constexpr float ELECTRICITY_EFFECT_RADIUS = 2.0F; constexpr float ELECTRICITY_EFFECT_LIFETIME = 3.0F; constexpr int SPARK_EFFECT_SPARK_COUNT = 30; constexpr float SPARK_EFFECT_RADIUS = 2.0F; constexpr float SPARK_EFFECT_XZ_VARIANCE = 0.5F; constexpr float SPARK_EFFECT_LIFETIME = ELECTRICITY_EFFECT_LIFETIME; class TRunnerScreen : public Screen { public: struct SurfaceUnit { float nw, ne, sw, se; }; TRunnerScreen(std::weak_ptr stack); ~TRunnerScreen() override; bool update(float dt, bool is_resized) override; bool draw(RenderTexture *render_texture) override; private: enum Pixel : unsigned char { PIXEL_BLANK, PIXEL_BLACK, PIXEL_RED, PIXEL_GREEN, PIXEL_BLUE, PIXEL_YELLOW, PIXEL_CYAN, PIXEL_MAGENTA, PIXEL_ORANGE, PIXEL_BROWN, PIXEL_TURQUOISE, PIXEL_SKY, PIXEL_WHITE }; static Color PixelToColor(Pixel p); using SurfaceArrT = std::array, SURFACE_UNIT_WIDTH * SURFACE_UNIT_HEIGHT>; std::unique_ptr surface; using SurfaceBBsArrT = std::array; std::unique_ptr surface_bbs; using WalkersArrT = std::array; std::unique_ptr walkers; Camera3D camera; /* * 0 - resetting surface * 1 - walker hack attempted */ std::bitset<64> flags; Model TEMP_cube_model; Texture2D TEMP_cube_texture; Matrix TEMP_matrix; RenderTexture2D bgRenderTexture; RenderTexture2D fgRenderTexture; Vector3 camera_pos; Vector3 camera_target; Vector3 mouse_hit; std::unique_ptr > surface_triangles; std::vector electricityEffects; std::vector sparkEffects; unsigned int idx_hit; std::optional controlled_walker_idx; const int left_text_width; const int right_text_width; const int forward_text_width; const int reset_surface_text_width; float surface_reset_anim_timer; bool walker_hack_success; void camera_to_targets(float dt); void generate_surface(); void generate_surface_with_triangles(); }; #endif