From 80ba9b4835e729f53755856de958c884b194ddbd Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Fri, 6 May 2022 02:53:36 +0200 Subject: [PATCH] nilrider:: two projection styles --- rogueviz/nilrider/nilrider.cpp | 32 +++++++++++++++++++++++++++++++- rogueviz/nilrider/timestamp.cpp | 6 +++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/rogueviz/nilrider/nilrider.cpp b/rogueviz/nilrider/nilrider.cpp index 926d7e99..34d5ce5d 100644 --- a/rogueviz/nilrider/nilrider.cpp +++ b/rogueviz/nilrider/nilrider.cpp @@ -217,6 +217,32 @@ void pick_game() { dialog::display(); } +void nil_set_geodesic() { + pmodel = mdGeodesic; + nisot::geodesic_movement = true; + popScreen(); + } + +void nil_set_perspective() { + pmodel = mdPerspective; + nisot::geodesic_movement = false; + pconf.rotational_nil = 0; + } + +void nil_projection() { + dialog::init(XLAT("projection of Nil"), 0xC0C0FFFF, 150, 100); + dialog::addBoolItem("geodesics", pmodel == mdGeodesic, 'g'); + dialog::add_action([] { popScreen(); nil_set_geodesic(); }); + dialog::addInfo("In this mode, the light is assumed to travel along the geodesics (the shortest paths in Nil)."); + dialog::addBreak(100); + dialog::addBoolItem("constant direction", pmodel == mdPerspective, 'c'); + dialog::add_action([] { popScreen(); nil_set_perspective(); }); + dialog::addInfo("In this mode, the light is assumed to travel along the lines of constant direction."); + dialog::addBreak(100); + dialog::addBack(); + dialog::display(); + } + void settings() { dialog::init(XLAT("settings"), 0xC0C0FFFF, 150, 100); add_edit(aimspeed_key_x); @@ -227,6 +253,8 @@ void settings() { add_edit(whdist); add_edit(min_gfx_slope); add_edit(stepped_display); + dialog::addItem("projection", 'P'); + dialog::add_action_push(nil_projection); dialog::addItem("configure keys", 'k'); dialog::add_action_push(multi::get_key_configurer(1, move_names, "Nilrider keys")); dialog::addItem("RogueViz settings", 'r'); @@ -234,8 +262,8 @@ void settings() { pushScreen(showSettings); }); dialog::addBreak(100); - dialog::display(); dialog::addBack(); + dialog::display(); } bool deleting = false; @@ -401,6 +429,8 @@ auto celldemo = arg::add3("-unilcycle", initialize) + arg::add3("-unilplan", [] arg::shift(); goal_id = arg::argi(); curlev->solve(); }) + arg::add3("-nilsolve", [] { curlev->solve(); }) + + arg::add3("-nilgeo", nil_set_geodesic) + + arg::add3("-nilper", nil_set_perspective) + addHook(hooks_configfile, 100, [] { param_f(aimspeed_key_x, "nilrider_key_x") ->editable(-5, 5, 0.1, "navigation sensitivity (keyboard)", "press Left/Right to navigate (lCtrl to fine-tune)", 'n'); diff --git a/rogueviz/nilrider/timestamp.cpp b/rogueviz/nilrider/timestamp.cpp index 883de7d9..42ea3724 100644 --- a/rogueviz/nilrider/timestamp.cpp +++ b/rogueviz/nilrider/timestamp.cpp @@ -2,10 +2,14 @@ namespace nilrider { ld timestamp::energy_in_squares() { return vel * vel / (2 * gravity); } +EX ld sym_to_heis_bonus(const hyperpoint& H) { + return H[0] * H[1] / 2; + } + /** convert rotationally symmetric to Heisenberg model */ EX hyperpoint sym_to_heis(hyperpoint H) { if(nil) { - H[2] += H[0] * H[1] / 2; + H[2] += sym_to_heis_bonus(H); } return H; }