1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-11-08 23:19:54 +00:00
hyperrogue/rogueviz/nilrider/nilrider.h
2023-01-30 01:20:12 +01:00

231 lines
6.2 KiB
C++

#include "../rogueviz.h"
namespace nilrider {
using namespace rogueviz;
struct level;
struct timestamp {
hyperpoint where; /**< the current position of the unicycle */
ld heading_angle; /**< the current heading angle */
ld vel; /**< the current velocity in units per second */
ld circpos; /**< controls the wheel graphics */
ld slope; /**< the current slope */
ld t; /**< planning spline parameter */
ld timer = 0; /**< the timer, in seconds */
flagtype collected_triangles; /**< a bitset which shows which triangles are collected */
flagtype goals; /**< a bitset which shows which goals are complete */
flagtype failed; /**< a bitset which shows which goals are failed */
bool tick(level*);/**< one tick of the simulation -- returns false if the unicycle has stopped or crashed */
void centerview(level*);
void draw_unilcycle(const shiftmatrix&);
void draw_instruments(level*);
ld energy_in_squares();
bool collect(level*);
void be_consistent();
};
struct planpoint {
hyperpoint at;
hyperpoint vel;
planpoint(hyperpoint a, hyperpoint v): at(a), vel(v) {};
};
using plan_t = vector<planpoint>;
constexpr flagtype nrlPolar = Flag(1);
constexpr flagtype nrlOrder = Flag(2);
struct statue {
transmatrix T;
hpcshape *shape;
color_t color;
};
struct triangledata {
int x, y;
hyperpoint where;
array<color_t, 7> colors;
};
struct manual_replay {
string name;
vector<int> headings;
};
struct plan_replay {
string name;
plan_t plan;
};
using xy_float = pair<ld, ld>;
using xy_int = pair<int, int>;
inline xy_int pfloor(xy_float p) { return {floor(p.first), floor(p.second)}; }
enum eGoalResult { grNone, grSuccess, grFailed };
struct checkerparam {
timestamp *t;
level *l;
int rev;
};
using goalchecker = std::function<eGoalResult(checkerparam)>;
struct goal {
color_t color;
string desc;
goalchecker check;
};
using surface_fun = std::function<ld(hyperpoint h)>;
ld heis_to_used_bonus(const hyperpoint&);
struct level {
string name;
char hotkey;
string longdesc;
flagtype flags;
ld minx, miny, maxx, maxy;
vector<string> map_tiles;
ld startx, starty;
ld scale;
surface_fun surface_heisenberg;
ld surface(hyperpoint h) { return surface_heisenberg(h) + heis_to_used_bonus(h); }
bool initialized;
level(string name, char hotkey, flagtype flags, string longdesc, ld minx, ld miny, ld maxx, ld maxy, const vector<string>& mt, ld sx, ld sy, const std::function<ld(hyperpoint h)>& surf, vector<goal> g) :
name(name), hotkey(hotkey), longdesc(longdesc), flags(flags), minx(minx), miny(miny), maxx(maxx), maxy(maxy), map_tiles(mt), startx(sx), starty(sy), surface_heisenberg(surf), goals(g) { initialized = false; }
ld real_minx, real_miny, real_maxx, real_maxy;
/* data */
hpcshape shFloor; /**< the 3D model of floor */
hpcshape shPlanFloor; /**< the 3D model of floor for planning */
hpcshape shStepFloor; /**< the 3D model of stepped floor */
hpcshape shField; /**< the 3D model of the 'field' */
hpcshape shCastle; /**< the 3D model of the 'castle' */
vector<statue> statues;
vector<triangledata> triangles;
vector<goal> goals;
/** the texture data used for the ground */
texture::texture_data *unil_texture;
/** the texture data used for the ground in the stepped mode */
texture::texture_data *unil_texture_stepped;
/** the texture data used for the ground with level lines */
texture::texture_data *unil_texture_levels;
/** the texture used for the ground */
basic_textureinfo uniltinf;
/** currently used point for levellines -- levellines[3]==0 means none */
hyperpoint levellines_for;
/** requested point for levellines (texture redrawn in init_textures) */
hyperpoint new_levellines_for;
/** the texture used for the castles */
basic_textureinfo castle_tinf;
/** the texture used for the ground in the stepped mode*/
basic_textureinfo uniltinf_stepped;
/** starting timestamp */
timestamp start;
/** current timestamp */
timestamp current;
/** initialize textures */
void init_textures();
/** initialize shapes */
void init_shapes();
/** initialize all */
void init();
vector<timestamp> history;
vector<manual_replay> manual_replays;
vector<plan_replay> plan_replays;
/* vector of records in no-planning and planning for each goal (0 = no record known) */
vector<ld> records[2];
/* vector of current time for each goal */
vector<ld> current_score;
/** plan for the planning mode */
plan_t plan;
void init_plan();
bool simulate();
void draw_planning_screen();
void draw_level(const shiftmatrix& V);
shiftmatrix plan_transform;
hyperpoint get_spline(ld t);
hyperpoint mappt(ld x, ld y, int s);
ld safe_alt(hyperpoint h, ld mul = 1, ld mulx = 1);
void compute_plan_transform();
bool handle_planning(int sym, int uni);
void solve();
xy_float get_xy_f(hyperpoint h);
xy_int get_xy_i(hyperpoint h) { return pfloor(get_xy_f(h)); }
char mapchar(xy_int p);
char mapchar(xy_float p) { return mapchar(pfloor(p)); }
char mapchar(hyperpoint h) { return mapchar(pfloor(get_xy_f(h))); }
};
/** ticks per second */
inline const ld tps = 1000;
/** wheel radius */
inline ld whrad = 0.05;
/** epsilon used to measure slope */
inline ld slope_eps = 0.01;
/** gravity acceleration constant, in units per second squared */
inline ld gravity = 1 / 16.;
/** the distance of camera from the wheel */
inline ld whdist = 0.5;
/** minimum slope for rendering */
inline ld min_gfx_slope = +90._deg;
/** current slope for rendering */
inline ld gfx_slope = 0;
/** default block unit */
inline double dft_block = 1;
extern map<char, color_t> bcols;
extern map<char, array<string, 16> > submaps;
hyperpoint sym_to_used(hyperpoint H);
extern int reversals;
extern bool loaded_or_planned;
extern bool planning_mode;
inline int reduce_quality = 0;
void save();
extern bool on;
extern void restart();
extern bool stepped_display;
}