namespace hr { namespace ads_game { enum eResourceType { rtNone, rtHull, rtGold, rtAmmo, rtFuel, rtOxygen }; color_t rock_color[6] = { 0x703800FF, 0xC0A080FF, 0xC08010FF, 0xC04000FF, 0x408000FF, 0x8040A0FF, }; color_t rsrc_color[6] = { 0x404040FF, 0x40C0C0FF, 0xFFD500FF, 0xFF0000FF, 0x00FF00FF, 0x0000FFFF }; vector* rsrc_shape[6] = { &shape_particle, &shape_heart, &shape_gold, &shape_weapon, &shape_fuel, &shape_airtank }; string rsrc_sound[6] = {"", "pickup-potion", "pickup-gold", "pickup-scroll", "pickup-speed", "seen-air" }; void rsrc_config() { ads_max_pdata.hitpoints = 3; ads_max_pdata.score = 0; ads_max_pdata.ammo = 50; ads_max_pdata.fuel = 12 * TAU; ads_max_pdata.oxygen = 20 * TAU; ads_tank_pdata.hitpoints = 1; ads_tank_pdata.score = 1; ads_tank_pdata.ammo = 20; ads_tank_pdata.fuel = 4 * TAU; ads_tank_pdata.oxygen = 5 * TAU; ds_max_pdata.hitpoints = 5; ds_max_pdata.score = 0; ds_max_pdata.ammo = 10; ds_max_pdata.fuel = 12 * TAU; ds_max_pdata.oxygen = 20 * TAU; ds_tank_pdata.hitpoints = 1; ds_tank_pdata.score = 1; ds_tank_pdata.ammo = 2; ds_tank_pdata.fuel = 8 * TAU; ds_tank_pdata.oxygen = 15 * 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(ads_max_pdata, "ads_max_", "AdS maximum", "These control the maximum and initial values of your resources. "); all(ads_tank_pdata, "ads_tank_", "AdS bonus", "These control the amount of resource in a bonus tank. "); all(ds_max_pdata, "ds_max_", "dS maximum", "These control the maximum and initial values of your resources. "); all(ds_tank_pdata, "ds_tank_", "dS 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(DS_(max_pdata)); all(DS_(tank_pdata)); } void init_rsrc() { pdata = DS_(max_pdata); game_over = false; } void display(int id, int y, ld val, ld maxv, ld tank, ld unit) { auto sId = shiftless(Id); // ld pix = 1 / (2 * cgi.hcrossf / cgi.crossf); color_t col = rsrc_color[id]; auto& shape = rsrc_shape[id][0]; int N = isize(shape); ld ctr = max(20*y+10, current_display->ycenter - current_display->radius + 20 * y); ld sta = max(20, current_display->xcenter - current_display->radius + 20); if(true) ctr = 20*y+10, sta = 20; for(int i=0; i> 8, 1, 0); return; } curvepoint(atscreenpos(sta, top, 1) * C0); curvepoint(atscreenpos(fen, top, 1) * C0); curvepoint(atscreenpos(fen, bot, 1) * C0); curvepoint(atscreenpos(sta, bot, 1) * C0); curvepoint(atscreenpos(sta, top, 1) * C0); queuecurve(sId, col, col - 128, PPR::ZERO); if(val > 0) { ld end = sta + siz * val / maxv; curvepoint(atscreenpos(sta, top, 1) * C0); curvepoint(atscreenpos(end, top, 1) * C0); curvepoint(atscreenpos(end, bot, 1) * C0); curvepoint(atscreenpos(sta, bot, 1) * C0); curvepoint(atscreenpos(sta, top, 1) * C0); queuecurve(sId, col, col, PPR::ZERO); } if(unit > 0 && maxv / unit <= siz/2 + 1e-6) for(ld u=unit; u 0 && maxv / tank <= siz/2 + 1e-6) for(ld u=tank; u g(geometry, gEuclid); dynamicval pm(pmodel, mdDisk); dynamicval ga(vid.always3, false); dynamicval ou(poly_outline); dynamicval gi(ginf[gEuclid].g, giEuclid2); initquickqueue(); check_cgi(); cgi.require_shapes(); #define D(id, y, field, unit) display(id, y, pdata.field, DS_(max_pdata).field, DS_(tank_pdata).field, unit) D(1, 1, hitpoints, 1); D(3, 2, ammo, 1); D(4, 3, fuel, TAU); D(5, 4, oxygen, TAU); D(2, 5, score, 10); #undef D quickqueue(); return true; } void gain_resource(eResourceType rsrc) { auto& tank_pdata = DS_(tank_pdata); auto& max_pdata = DS_(max_pdata); #define D(id, field) if(rsrc == id) { pdata.field += tank_pdata.field; if(max_pdata.field && pdata.field > max_pdata.field) pdata.field = max_pdata.field; } println(hlog, "gain resource ", int(rsrc)); D(1, hitpoints) D(2, score) D(3, ammo) D(4, fuel) D(5, oxygen) playSound(nullptr, rsrc_sound[rsrc]); } }}