diff --git a/rogueviz/ads/ads-game.cpp b/rogueviz/ads/ads-game.cpp index 5a3df9ef..f616f3e9 100644 --- a/rogueviz/ads/ads-game.cpp +++ b/rogueviz/ads/ads-game.cpp @@ -125,10 +125,26 @@ auto shot_hooks = -> editable(0, 5, 0.05, "rock density", "how many rocks to generate", 'd'); param_f(rock_max_rapidity, "ads_rock_rapidity") -> editable(0, 5, 0.05, "rock rapidity", "how fast should the rocks be relative to the map", 'w'); + param_f(missile_rapidity, "ads_missile_rapidity") + -> editable(0, 5, 0.05, "missile rapidity", "how fast should the missiles go relative to the ship", 'm'); param_b(auto_rotate, "ads_auto_rotate") -> editable("automatically rotate the screen", 'r'); param_b(view_proper_times, "ads_display") -> editable("display the proper times", 't'); + + param_f(crash_particle_rapidity, "ads_crash_rapidity") + -> editable(0, 5, 0.1, "crash particle rapidity", "how fast should the crash particles be", 'r'); + param_f(crash_particle_qty, "ads_crash_qty") + -> editable(0, 5, 0.1, "crash particle quantity", "how many crash particles", 'q'); + param_f(crash_particle_life, "ads_crash_life") + -> editable(0, 5, 0.1, "crash particle lifetime", "how long should the crash particles live", 'l'); + param_f(fuel_particle_rapidity, "ads_fuel_rapidity") + -> editable(0, 5, 0.1, "fuel particle rapidity", "how fast should the fuel particles be", 'R'); + param_f(fuel_particle_qty, "ads_fuel_qty") + -> editable(0, 5, 0.1, "fuel particle quantity", "how many fuel particles", 'Q'); + param_f(fuel_particle_life, "ads_fuel_life") + -> editable(0, 5, 0.1, "fuel particle lifetime", "how long should the fuel particles live", 'L'); + rsrc_config(); }); diff --git a/rogueviz/ads/control.cpp b/rogueviz/ads/control.cpp index 2eb4dfac..e6bae4a4 100644 --- a/rogueviz/ads/control.cpp +++ b/rogueviz/ads/control.cpp @@ -13,7 +13,7 @@ void fire() { ads_matrix S0 = ads_inverse(current * vctrV) * spin(ang*degree); - ads_matrix S1 = S0 * lorentz(0, 2, 3); // 0.995c + ads_matrix S1 = S0 * lorentz(0, 2, missile_rapidity); auto& ro = ci_at[c].rocks; auto r = std::make_unique (oMissile, c, S1, 0xC0C0FFFF); @@ -173,7 +173,7 @@ bool ads_turn(int idelta) { if(!paused) { pdata.fuel -= delta*accel*mul; cell *c = hybrid::get_where(vctr).first; - gen_particles(rpoisson(delta*accel*mul*20), c, ads_inverse(current * vctrV) * spin(ang*degree+M_PI) * rots::uxpush(0.06), rsrc_color[rtFuel], 0.15, 0.02); + gen_particles(rpoisson(delta*accel*mul*fuel_particle_qty), c, ads_inverse(current * vctrV) * spin(ang*degree+M_PI) * rots::uxpush(0.06), rsrc_color[rtFuel], fuel_particle_rapidity, fuel_particle_life, 0.02); } ld tc = 0; diff --git a/rogueviz/ads/globals.cpp b/rogueviz/ads/globals.cpp index e63a2aa2..53588113 100644 --- a/rogueviz/ads/globals.cpp +++ b/rogueviz/ads/globals.cpp @@ -86,6 +86,16 @@ bool auto_angle = true; ld rock_density = 0.25; ld rock_max_rapidity = 1.5; +ld missile_rapidity = 3; // speed is tanh(3) = about 0.95c + +ld crash_particle_rapidity = 1; +ld crash_particle_qty = 8; +ld crash_particle_life = .5; + +ld fuel_particle_rapidity = 1; +ld fuel_particle_qty = 20; +ld fuel_particle_life = .15; + cell *starting_point; }} diff --git a/rogueviz/ads/map.cpp b/rogueviz/ads/map.cpp index 047a2647..4bb0c0a5 100644 --- a/rogueviz/ads/map.cpp +++ b/rogueviz/ads/map.cpp @@ -181,10 +181,10 @@ void gen_rocks(cell *c, cellinfo& ci, int radius) { ci.rock_dist = radius; } -void gen_particles(int qty, cell *c, shiftmatrix from, color_t col, ld t, ld spread = 1) { +void gen_particles(int qty, cell *c, shiftmatrix from, color_t col, ld spd, ld t, ld spread = 1) { auto& ro = ci_at[c].rocks; for(int i=0; i(oParticle, c, from * spin(randd() * TAU * spread) * lorentz(0, 2, 1 + randd()), col ); + auto r = std::make_unique(oParticle, c, from * spin(randd() * TAU * spread) * lorentz(0, 2, (.5 + randd() * .5) * spd), col ); r->shape = &shape_particle; r->life_end = randd() * t; r->life_start = 0; @@ -222,7 +222,7 @@ void crash_ship() { if(pdata.hitpoints <= 0) game_over = true; hybrid::in_actual([&] { cell *c = hybrid::get_where(vctr).first; - gen_particles(16, c, ads_inverse(current * vctrV) * spin(ang*degree), rsrc_color[rtHull], 0.5); + gen_particles(rpoisson(crash_particle_qty * 2), c, ads_inverse(current * vctrV) * spin(ang*degree), rsrc_color[rtHull], crash_particle_rapidity, crash_particle_life); }); } @@ -247,8 +247,8 @@ void handle_crashes() { m->life_end = m->pt_main.shift; r->life_end = r->pt_main.shift; hybrid::in_actual([&] { - gen_particles(8, m->owner, m->at * ads_matrix(Id, m->life_end), missile_color, 0.1); - gen_particles(8, r->owner, r->at * ads_matrix(Id, r->life_end), r->col, 0.5); + gen_particles(rpoisson(crash_particle_qty), m->owner, m->at * ads_matrix(Id, m->life_end), missile_color, crash_particle_rapidity, crash_particle_life); + gen_particles(rpoisson(crash_particle_qty), r->owner, r->at * ads_matrix(Id, r->life_end), r->col, crash_particle_rapidity, crash_particle_life); gen_resource(r->owner, r->at * ads_matrix(Id, r->life_end), r->resource); }); } diff --git a/rogueviz/ads/menu.cpp b/rogueviz/ads/menu.cpp index 74ee793f..0ffb7233 100644 --- a/rogueviz/ads/menu.cpp +++ b/rogueviz/ads/menu.cpp @@ -21,6 +21,24 @@ void edit_difficulty() { dialog::display(); } +void edit_particles() { + cmode = sm::SIDE | sm::MAYDARK; + gamescreen(); + + dialog::init(XLAT("AdS particle settings"), 0xC0C0FFFF, 150, 100); + + add_edit(crash_particle_rapidity); + add_edit(crash_particle_qty); + add_edit(crash_particle_life); + add_edit(fuel_particle_rapidity); + add_edit(fuel_particle_qty); + add_edit(fuel_particle_life); + + dialog::addBreak(100); + dialog::addBack(); + dialog::display(); + } + void game_menu() { cmode = sm::SIDE | sm::MAYDARK; gamescreen(); @@ -36,6 +54,9 @@ void game_menu() { add_edit(auto_rotate); add_edit(auto_angle); + dialog::addItem(XLAT("particle settings"), 'p'); + dialog::add_action_push(edit_particles); + dialog::addItem(XLAT("restart game"), 'r'); dialog::add_action([] { ads_game::restart(); popScreen(); });