From 8a35e6facb4483b4444dd56642e4ffa99c424812 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sun, 18 Sep 2022 10:21:13 +0200 Subject: [PATCH] ads-game:: made the game easier to (re)start, also more settings --- rogueviz/ads/ads-game.cpp | 69 +++++++++++++++++++++++++++++++------- rogueviz/ads/resources.cpp | 30 ++++++++++++++++- 2 files changed, 85 insertions(+), 14 deletions(-) diff --git a/rogueviz/ads/ads-game.cpp b/rogueviz/ads/ads-game.cpp index d6e8fbe1..33619c45 100644 --- a/rogueviz/ads/ads-game.cpp +++ b/rogueviz/ads/ads-game.cpp @@ -21,6 +21,24 @@ void change_default_key(int key, int val) { #endif } +void restart() { + cell *c; + + hybrid::in_actual([&] { + vctr = new_vctr = starting_point; + vctrV = new_vctrV = ads_matrix(Id, 0); + init_rsrc(); + c = hybrid::get_where(vctr).first; + }); + + ci_at.clear(); + + gen_terrain(c, ci_at[c], -2); + forCellEx(c1, c) ci_at[c1].type = wtNone; + ci_at[c].type = wtNone; + ci_at[c].rocks.clear(); + } + void run_ads_game() { change_default_key('s', 16 + 0); @@ -36,22 +54,20 @@ void run_ads_game() { change_default_key('k', 16 + 10); change_default_key('l', 16 + 11); - nomap = true; - no_find_player = true; - vctr = new_vctr = cwt.at; - cell *c = hybrid::get_where(vctr).first; - hybrid::in_underlying_geometry([&] { - gen_terrain(c, ci_at[c], -2); - forCellEx(c1, c) ci_at[c1].type = wtNone; - ci_at[c].type = wtNone; - ci_at[c].rocks.clear(); - }); - vctrV = new_vctrV = ads_matrix(Id, 0); + if(!sl2) set_geometry(gRotSpace); + if(hybrid::csteps) { + stop_game(); + hybrid::csteps = 0; + hybrid::reconfigure(); + } + start_game(); + + starting_point = cwt.at; + rogueviz::rv_hook(hooks_frame, 100, view_ads_game); rogueviz::rv_hook(hooks_prestats, 100, display_rsrc); rogueviz::rv_hook(hooks_handleKey, 0, handleKey); rogueviz::rv_hook(shmup::hooks_turn, 0, ads_turn); - init_rsrc(); cgi.use_count++; hybrid::in_underlying_geometry([] { @@ -68,19 +84,46 @@ void run_ads_game() { currentmap = umap; pmodel = mdDisk; cwt.at = centerover = currentmap->gamestart(); + + rogueviz::rv_change(nohelp, true); + rogueviz::rv_change(nomenukey, true); + rogueviz::rv_change(nomap, true); + rogueviz::rv_change(no_find_player, true); + + restart(); + } + +void run_ads_game_std() { + set_geometry(gNormal); + set_variation(eVariation::pure); + run_ads_game(); + showstartmenu = false; } auto shot_hooks = - arg::add3("-ads-game", run_ads_game) + arg::add3("-ads-game1", run_ads_game) ++ arg::add3("-ads-game", run_ads_game_std) + addHook(hooks_configfile, 100, [] { + param_f(how_much_invincibility, "ads_invinc") + -> editable(0, TAU, TAU/4, "invincibility time", "How long does the period of invincibility after crashing last, in absolute units.", 'i'); + param_b(auto_angle, "ads_auto_angle") + -> editable("automatically rotate the projection", 'a'); param_f(simspeed, "ads_game_simspeed") -> editable(0, 2*TAU, TAU/4, "game speed", "Controls the speed of the game.", 's'); param_f(accel, "ads_game_accel") -> editable(0, 30, 1, "acceleration", "Controls the speed of your ship's acceleration.", 'a'); + param_f(time_unit, "ads_time_unit") + -> editable(0, 2*TAU, 1, "time unit", + "Controls the unit used when the 'display the proper times' option is on.\n\n" + "It takes tau(=2π) units to go the full circle, so the default time unit is tau. You can also use the absolute units (1)." + , 'a'); + param_f(pause_speed, "ads_pause_speed") + -> editable(0, 30, 1, "movement speed while paused", "Controls the speed of camera movement while paused and holding the 'move switch' key.", 'v'); 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'); + rsrc_config(); }); } diff --git a/rogueviz/ads/resources.cpp b/rogueviz/ads/resources.cpp index 42e33d82..f9b98290 100644 --- a/rogueviz/ads/resources.cpp +++ b/rogueviz/ads/resources.cpp @@ -9,7 +9,7 @@ color_t rsrc_color[6] = {0, 0xC0C0C0FF, 0xFFD500FF, 0xFF0000FF, 0x00FF00FF, 0x00 vector* rsrc_shape[6] = { nullptr, &shape_heart, &shape_gold, &shape_weapon, &shape_fuel, &shape_airtank }; -void init_rsrc() { +void rsrc_config() { max_pdata.hitpoints = 3; max_pdata.score = 0; max_pdata.ammo = 50; @@ -22,7 +22,35 @@ void init_rsrc() { tank_pdata.fuel = 4 * TAU; tank_pdata.oxygen = 5 * TAU; + auto all = [] (player_data& d, string s, string t, string u) { + param_i(d.hitpoints, s+"hp") + ->editable(0, 10, 3, t + (": hitpoints"), u + ("Hitpoints are drained whenever you are hit."), '1'); + param_i(d.ammo, s+"ammo") + ->editable(0, 10, 3, t + (": ammo"), u + ("Ammo is drained whenever you shoot."), '1'); + param_f(d.fuel, s+"fuel") + ->editable(0, 10, 3, t + (": fuel"), u + ("Fuel is drained whenever you thrust."), '1'); + param_f(d.oxygen, s+"oxygen") + ->editable(0, 10, 3, t + (": oxygen"), u + ("Oxygen is drained whenever continuously."), '1'); + }; + + all(max_pdata, "ads_max_", "maximum", "These control the maximum and initial values of your resources. "); + all(tank_pdata, "ads_tank_", "bonus", "These control the amount of resource in a bonus tank. "); + } + +void edit_rsrc() { + auto all = [] (player_data& d) { + add_edit(d.hitpoints); + add_edit(d.ammo); + add_edit(d.fuel); + add_edit(d.oxygen); + }; + all(max_pdata); + all(tank_pdata); + } + +void init_rsrc() { pdata = max_pdata; + game_over = false; } void display(int id, int y, ld val, ld maxv, ld tank, ld unit) {