diff --git a/rogueviz/ads/ads-game.cpp b/rogueviz/ads/ads-game.cpp index f2fa8eca..7bc14910 100644 --- a/rogueviz/ads/ads-game.cpp +++ b/rogueviz/ads/ads-game.cpp @@ -95,6 +95,13 @@ void run_ads_game_hooks() { rogueviz::rv_hook(hooks_nextland, 0, ads_nextland); } +void srun_size_hooks() { + rogueviz::rv_hook(hooks_scalefactor, 100, [] (geometry_information *i) { + i->scalefactor = vid.creature_scale / 3; + }); + rogueviz::rv_hook(hooks_cgi_string, 100, [] (string& s) { s += " ads"; }); + } + void run_ads_game() { if(!sl2) set_geometry(gTwistedProduct); @@ -103,6 +110,7 @@ void run_ads_game() { hybrid::csteps = 0; hybrid::reconfigure(); } + run_size_hooks(); run_ads_game_hooks(); start_game(); @@ -175,6 +183,12 @@ void default_settings() { lps_add(lps_relhell_ads_spacetime, vid.grid, false); lps_add(lps_relhell_ads_spacetime, slr::range_xy, 2.); lps_add(lps_relhell_ads_spacetime, slr::range_z, 2.); + + charstyle& cs = getcs(); + lps_add(lps_relhell, cs.skincolor, 0xFFFFFFFF); + lps_add(lps_relhell, cs.eyecolor, 0x8080FFFF); + lps_add(lps_relhell, cs.dresscolor, 0xFFC0C0FF); + lps_add(lps_relhell, cs.haircolor, 0xC0FFC0FF); } void gamedata(hr::gamedata* gd) { @@ -213,7 +227,7 @@ void run_ads_game_std() { } void change_scale(ld s) { - ads_scale *= s; + vid.creature_scale *= s; rock_density /= (s * s); rock_max_rapidity *= s; ads_simspeed *= s; @@ -244,10 +258,10 @@ auto shot_hooks = -> editable(0, 2*TAU, TAU/4, "AdS game speed", "Controls the speed of the game, in absolute units per second.", 's'); param_f(ds_simspeed, "ds_game_simspeed") -> editable(0, 2*TAU, TAU/4, "dS game speed", "Controls the speed of the game, in absolute units per second.", 's'); - param_f(ads_scale, "ads_game_scale") + /*param_f(ads_scale, "ads_game_scale") -> editable(0, 2, 0.1, "AdS game scale", "Controls the scaling of game objects.", 'c'); param_f(ds_scale, "ds_game_scale") - -> editable(0, 2, 0.1, "dS game scale", "Controls the scaling of game objects.", 'c'); + -> editable(0, 2, 0.1, "dS game scale", "Controls the scaling of game objects.", 'c'); */ param_f(ads_accel, "ads_game_accel") -> editable(0, 30, 1, "AdS acceleration", "Controls your ship's acceleration, in absolute units per second squared.", 'a'); param_f(ds_accel, "ds_game_accel") diff --git a/rogueviz/ads/control.cpp b/rogueviz/ads/control.cpp index efdfa475..814785d0 100644 --- a/rogueviz/ads/control.cpp +++ b/rogueviz/ads/control.cpp @@ -183,7 +183,7 @@ bool ads_turn(int idelta) { if(!paused) { pdata.fuel -= dv; - gen_particles(rpoisson(dv*fuel_particle_qty), vctr, ads_inverse(current * vctrV) * spin(ang*degree+M_PI) * twist::uxpush(0.06 * ads_scale), rsrc_color[rtFuel], fuel_particle_rapidity, fuel_particle_life, 0.02); + gen_particles(rpoisson(dv*fuel_particle_qty), vctr, ads_inverse(current * vctrV) * spin(ang*degree+M_PI) * twist::uxpush(0.06 * get_scale()), rsrc_color[rtFuel], fuel_particle_rapidity, fuel_particle_life, 0.02); } ld tc = 0; diff --git a/rogueviz/ads/display.cpp b/rogueviz/ads/display.cpp index b260ddf6..34caf148 100644 --- a/rogueviz/ads/display.cpp +++ b/rogueviz/ads/display.cpp @@ -99,6 +99,8 @@ void draw_game_cell(const cell_to_draw& cd) { queuecurve(shiftless(Id), out, col, PPR::WALL); } + ld ads_scale = get_scale(); + if(view_proper_times) { string str = hr::format(tformat, cd.center.shift / ads_time_unit); queuestr(shiftless(rgpushxto0(cd.center.h)), time_scale * ads_scale, str, 0xFF4040, 8); @@ -180,20 +182,20 @@ void draw_game_cell(const cell_to_draw& cd) { if(paused) for(auto& rock: ci.shipstates) { cross_result cr; - if(hv) { - auto& shape = shape_ship; - for(int i=0; i b(geometry, gTwistedProduct); @@ -202,19 +204,21 @@ void draw_game_cell(const cell_to_draw& cd) { }); if(cr.shift < -1e-6 || cr.shift > rock.duration + 1e-6) continue; - vector pts; - auto& shape = shape_ship; - for(int i=0; i pts; + for(int i=sh.s; ipts)) ds_crash_ship(); @@ -364,6 +367,7 @@ bool ds_turn(int idelta) { } if(!paused) { + ld ds_scale = get_scale(); pdata.fuel -= dv; ds_gen_particles(rpoisson(dv*fuel_particle_qty), inverse(current.T) * spin(ang*degree+M_PI) * twist::uxpush(0.06 * ds_scale), current.shift, rsrc_color[rtFuel], fuel_particle_rapidity, fuel_particle_life, 0.02); } @@ -477,8 +481,13 @@ cross_result ds_cross0_light(transmatrix T) { return res; } +transmatrix tpt_scaled(ld x, ld y) { + return cspin(0, 2, x) * cspin(1, 2, y); + } + transmatrix tpt(ld x, ld y) { - return cspin(0, 2, x * ds_scale) * cspin(1, 2, y * ds_scale); + ld ds_scale = get_scale(); + return tpt_scaled(x * ds_scale, y * ds_scale); } // sometimes the result may be incorrect due to numerical precision -- don't show that then in this case @@ -582,6 +591,7 @@ void view_ds_game() { if(view_proper_times && rock.type != oParticle) { ld t = rock.pt_main.shift; + ld ds_scale = get_scale(); if(rock.type == oMainRock) t += current.shift; string str = hr::format(tformat, t / ds_time_unit); queuestr(shiftless(sphereflip * rgpushxto0(rock.pt_main.h)), time_scale * ds_scale, str, 0xFFFF00, 8); @@ -597,46 +607,52 @@ void view_ds_game() { if(ss.at.shift < current.shift - 4 * TAU) continue; if(ss.at.shift > current.shift + 4 * TAU) continue; - auto& shape = shape_ship; - - if(hv) { - for(int i=0; i g(geometry, gSpace435); cross_result cr = ds_cross0(current.T * lorentz(2, 3, ss.at.shift - current.shift) * ss.at.T); if(cr.shift < delta) continue; if(cr.shift > ss.duration + delta) continue; transmatrix at = current.T * lorentz(2, 3, cr.shift) * ss.at.T; - vector pts; - - for(int i=0; i pts; + int dx = sym ? -1 : 1; + + for(int i=sh.s; i g(geometry, gSpace435); current = cspin(0, 2, 0.2 * ds_scale); invincibility_pt = ds_how_much_invincibility; @@ -724,6 +745,7 @@ void run_ds_game_hooks() { void run_ds_game() { stop_game(); + run_size_hooks(); set_geometry(gSphere); start_game(); diff --git a/rogueviz/ads/globals.cpp b/rogueviz/ads/globals.cpp index ccfbaade..70a57f57 100644 --- a/rogueviz/ads/globals.cpp +++ b/rogueviz/ads/globals.cpp @@ -65,10 +65,6 @@ void change_scale(ld s); /** all the missiles and objects currently displayed */ vector displayed; -/** how much should be the objects scaled */ -ld ads_scale = 1; -ld ds_scale = 1; - ld time_scale = .1; color_t missile_color = 0xFF0000FF; @@ -111,6 +107,8 @@ cell *starting_point; int max_gen_per_frame = 3; int draw_per_frame = 200; +bool simple_ship = false; + /* for DS */ ads_object *main_rock; @@ -126,6 +124,7 @@ void init_textures(); void pick_textures(); void draw_textures(); void reset_textures(); +void run_size_hooks(); void ds_restart(); void run_ads_game_std(); diff --git a/rogueviz/ads/map.cpp b/rogueviz/ads/map.cpp index 7b3735db..16b71d0e 100644 --- a/rogueviz/ads/map.cpp +++ b/rogueviz/ads/map.cpp @@ -234,7 +234,7 @@ void gen_rocks(cell *c, cellinfo& ci, int radius) { hybrid::in_actual([&] { add_turret(c, ci, p.get()); for(int r=0; r<6; r++) - add_rsrc(c, ci, p.get(spin(r * 60._deg) * twist::uxpush(turret_dist * ads_scale))); + add_rsrc(c, ci, p.get(spin(r * 60._deg) * twist::uxpush(turret_dist * get_scale()))); turrets++; }); } @@ -410,7 +410,7 @@ void handle_turret(ads_object *t, ld& angle_at_time) { if(t->last_shot >= t->life_end) return; ld angle = lerp(it0->second.angle, nts.angle, ilerp(it0->first, ctime, t->last_shot)); // println(hlog, "shooting at angle ", angle, " at time ", t->last_shot); - ads_matrix S0 = ads_inverse(p->V) * t1 * spin(angle) * twist::uxpush(turret_length * ads_scale) * lorentz(0, 2, ads_missile_rapidity); + ads_matrix S0 = ads_inverse(p->V) * t1 * spin(angle) * twist::uxpush(turret_length * get_scale()) * lorentz(0, 2, ads_missile_rapidity); auto r = std::make_unique (oTurretMissile, t->owner, S0, rsrc_color[rtAmmo]); r->shape = &shape_missile; r->life_start = 0; r->life_end = M_PI; @@ -464,6 +464,7 @@ void handle_crashes() { } } if(!game_over) for(int i=0; ipts)) ads_crash_ship(); diff --git a/rogueviz/ads/menu.cpp b/rogueviz/ads/menu.cpp index ad707e12..78e6d02c 100644 --- a/rogueviz/ads/menu.cpp +++ b/rogueviz/ads/menu.cpp @@ -3,6 +3,7 @@ namespace hr { namespace ads_game { void adjust_for_scale() { + ld ads_scale = get_scale(); if(ads_scale < 0.3) max_gen_per_frame = 1, draw_per_frame = 30; else if(ads_scale < 0.8) max_gen_per_frame = 2, draw_per_frame = 100; else max_gen_per_frame = 3, draw_per_frame = 1000; @@ -16,7 +17,7 @@ void edit_difficulty() { add_edit(DS_(simspeed)); add_edit(DS_(accel)); add_edit(DS_(how_much_invincibility)); - add_edit(DS_(scale)); + add_edit(vid.creature_scale); add_edit(DS_(missile_rapidity)); if(!main_rock) { diff --git a/rogueviz/ads/shapes.cpp b/rogueviz/ads/shapes.cpp index 9f509d4c..b070f644 100644 --- a/rogueviz/ads/shapes.cpp +++ b/rogueviz/ads/shapes.cpp @@ -21,12 +21,17 @@ struct ship_model: gi_extension { map ship_at_scale; }; +/** how much should be the objects scaled */ +ld get_scale() { + return cgi.scalefactor * 3; + } + const hpcshape& make_shape() { auto& mmd = (unique_ptr&) cgi.ext["ship_model"]; if(!mmd) mmd = std::make_unique (); - auto scale = DS_(scale); + auto scale = get_scale(); auto sas = at_or_null(mmd->ship_at_scale, scale); if(sas) return *sas; @@ -46,4 +51,20 @@ const hpcshape& make_shape() { return shShip; } +extern color_t shipcolor; + +template void render_ship_parts(const T& render_ship_part) { + if(simple_ship) { + render_ship_part(make_shape(), shipcolor, 0); + return; + } + charstyle& cs = getcs(); + render_ship_part(cgi.shSpaceshipBase, cs.skincolor, 0); + render_ship_part(cgi.shSpaceshipEngine, cs.haircolor, 0); + render_ship_part(cgi.shSpaceshipEngine, cs.haircolor, 1); + render_ship_part(cgi.shSpaceshipGun, cs.dresscolor, 0); + render_ship_part(cgi.shSpaceshipGun, cs.dresscolor, 1); + render_ship_part(cgi.shSpaceshipCockpit, cs.eyecolor, 0); + } + }} diff --git a/rogueviz/ads/tour.cpp b/rogueviz/ads/tour.cpp index ffd2347d..c8d8d294 100644 --- a/rogueviz/ads/tour.cpp +++ b/rogueviz/ads/tour.cpp @@ -79,6 +79,15 @@ void straight_line_viz(presmode mode) { }); } +void set_spacerocks_ship() { + auto& cs = getcs(); + tour::slide_backup(cs.charid, 10); + tour::slide_backup(cs.skincolor, 0xFFFFFFFF); + tour::slide_backup(cs.eyecolor, 0x8080FFFF); + tour::slide_backup(cs.dresscolor, 0xFFC0C0FF); + tour::slide_backup(cs.haircolor, 0xC0FFC0FF); + } + slide relhell_tour[] = { {"Intro", 10, LEGAL::ANY | QUICKGEO | NOTITLE, "Relative Hell is a game taking place in relativistic analogs of spherical and hyperbolic geometries. " @@ -86,6 +95,7 @@ slide relhell_tour[] = { "if you accelerate, you move forever in that direction, unless you deaccelerate.", [] (presmode mode) { setCanvas(mode, &ccolor::plain, [] { + set_spacerocks_ship(); set_geometry(gEuclidSquare); set_variation(eVariation::pure); tour::slide_backup(land_structure, lsSingle); @@ -111,7 +121,7 @@ slide relhell_tour[] = { const ld sca = 100; tour::slide_backup(ds_simspeed, M_PI / 10 / sca * 5); tour::slide_backup(ds_missile_rapidity, 0.1); - tour::slide_backup(ds_scale, 1 / sca); + tour::slide_backup(vid.creature_scale, vid.creature_scale / sca); tour::slide_backup(pconf.scale, sca); tour::slide_backup(texture_off, true); dynamicval fs(future_shown, -10); @@ -149,7 +159,7 @@ slide relhell_tour[] = { tour::slide_backup(ds_simspeed, M_PI / 10 / sca * 5); tour::slide_backup(ds_missile_rapidity, 0.5); tour::slide_backup(ds_accel, ds_accel * 10); - tour::slide_backup(ds_scale, 1 / sca); + tour::slide_backup(vid.creature_scale, vid.creature_scale / sca); tour::slide_backup(pconf.scale, sca); tour::slide_backup(texture_off, true); dynamicval fs(future_shown, -10); @@ -190,7 +200,7 @@ slide relhell_tour[] = { tour::slide_backup(ds_simspeed, M_PI / 10 / sca * 5); tour::slide_backup(ds_missile_rapidity, 0.5); tour::slide_backup(ds_accel, ds_accel * 10); - tour::slide_backup(ds_scale, 5 / sca); + tour::slide_backup(vid.creature_scale, vid.creature_scale * 5 / sca); tour::slide_backup(pconf.scale, sca); tour::slide_backup(texture_off, true); tour::slide_backup(view_proper_times, true); @@ -212,6 +222,7 @@ slide relhell_tour[] = { "stereographic projection so that a big part of the sphere can be seen. (You can press '5' to switch to and from the orthogonal projection.)", [] (presmode mode) { setCanvas(mode, &ccolor::plain, [] { + set_spacerocks_ship(); set_geometry(gSphere); set_variation(eVariation::bitruncated); tour::slide_backup(land_structure, lsSingle); @@ -244,6 +255,7 @@ slide relhell_tour[] = { [] (presmode mode) { setCanvas(mode, &ccolor::plain, [] { + set_spacerocks_ship(); set_geometry(gSphere); set_variation(eVariation::bitruncated); tour::slide_backup(land_structure, lsSingle); @@ -271,7 +283,7 @@ slide relhell_tour[] = { setCanvas(mode, &ccolor::plain, [] { ads_game::run_ds_game_std(); tour::slide_backup(ds_simspeed, M_PI / 10); - tour::slide_backup(ds_scale, 1); + // tour::slide_backup(ds_scale, 1); tour::slide_backup(pconf.scale, 1); dynamicval fs(future_shown, -10); ds_restart(); @@ -309,6 +321,7 @@ slide relhell_tour[] = { [] (presmode mode) { setCanvas(mode, &ccolor::plain, [] { + set_spacerocks_ship(); set_geometry(gKleinQuartic); set_variation(eVariation::bitruncated); tour::slide_backup(land_structure, lsSingle); @@ -331,6 +344,7 @@ slide relhell_tour[] = { [] (presmode mode) { setCanvas(mode, &ccolor::plain, [] { + set_spacerocks_ship(); set_geometry(gKleinQuartic); set_variation(eVariation::bitruncated); tour::slide_backup(land_structure, lsSingle);