mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-02-08 23:20:12 +00:00
shapes used, unique_ptrs, resources generated
This commit is contained in:
parent
9545796a1d
commit
b056b5c153
@ -14,8 +14,8 @@ void fire() {
|
|||||||
ads_matrix S1 = S0 * lorentz(0, 2, 3); // 0.995c
|
ads_matrix S1 = S0 * lorentz(0, 2, 3); // 0.995c
|
||||||
|
|
||||||
auto& ro = ci_at[c].rocks;
|
auto& ro = ci_at[c].rocks;
|
||||||
ro.emplace_back(ads_object{oMissile, c, S1, 0xC0C0FFFF });
|
auto r = std::make_unique<ads_object> (oMissile, c, S1, 0xC0C0FFFF);
|
||||||
auto& r = ro.back();
|
r->shape = &shape_missile;
|
||||||
|
|
||||||
ads_matrix Scell(Id, 0);
|
ads_matrix Scell(Id, 0);
|
||||||
cell *lcell = vctr;
|
cell *lcell = vctr;
|
||||||
@ -23,7 +23,7 @@ void fire() {
|
|||||||
|
|
||||||
int steps = 0;
|
int steps = 0;
|
||||||
|
|
||||||
compute_life(vctr, unshift(r.at), [&] (cell *c1, ld t) {
|
compute_life(vctr, unshift(r->at), [&] (cell *c1, ld t) {
|
||||||
if(true) for(int i=0; i<lcell->type; i++) {
|
if(true) for(int i=0; i<lcell->type; i++) {
|
||||||
auto lcell1 = lcell->cmove(i);
|
auto lcell1 = lcell->cmove(i);
|
||||||
auto wcell1 = hybrid::get_where(lcell1);
|
auto wcell1 = hybrid::get_where(lcell1);
|
||||||
@ -51,18 +51,18 @@ void fire() {
|
|||||||
gen_rocks(c1, ci, 2);
|
gen_rocks(c1, ci, 2);
|
||||||
});
|
});
|
||||||
if(among(ci.type, wtSolid, wtDestructible)) {
|
if(among(ci.type, wtSolid, wtDestructible)) {
|
||||||
r.life_end = t;
|
r->life_end = t;
|
||||||
|
|
||||||
auto Scell_inv = ads_inverse(Scell);
|
auto Scell_inv = ads_inverse(Scell);
|
||||||
Scell_inv = Scell_inv * r.at;
|
Scell_inv = Scell_inv * r->at;
|
||||||
Scell_inv = Scell_inv * ads_matrix(Id, t);
|
Scell_inv = Scell_inv * ads_matrix(Id, t);
|
||||||
optimize_shift(Scell_inv);
|
optimize_shift(Scell_inv);
|
||||||
|
|
||||||
auto X = ads_inverse(Scell);
|
auto X = ads_inverse(Scell);
|
||||||
X = X * (r.at * ads_matrix(Id, t));
|
X = X * (r->at * ads_matrix(Id, t));
|
||||||
optimize_shift(X);
|
optimize_shift(X);
|
||||||
|
|
||||||
ads_matrix prel = ads_inverse(S0) * r.at * ads_matrix(Id, t);
|
ads_matrix prel = ads_inverse(S0) * r->at * ads_matrix(Id, t);
|
||||||
|
|
||||||
println(hlog, "crashed: proper time = ", t/TAU, " wall time = ", Scell_inv.shift / TAU, " player time = ", (prel.shift+ship_pt) / TAU, " start = ", ship_pt / TAU);
|
println(hlog, "crashed: proper time = ", t/TAU, " wall time = ", Scell_inv.shift / TAU, " player time = ", (prel.shift+ship_pt) / TAU, " start = ", ship_pt / TAU);
|
||||||
if(abs(X.shift - Scell_inv.shift) > .2) {
|
if(abs(X.shift - Scell_inv.shift) > .2) {
|
||||||
@ -74,6 +74,7 @@ void fire() {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
ro.emplace_back(std::move(r));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool handleKey(int sym, int uni) {
|
bool handleKey(int sym, int uni) {
|
||||||
|
@ -90,7 +90,8 @@ void draw_game_cell(cell *cs, ads_matrix V, ld plev) {
|
|||||||
queuestr(shiftless(rgpushxto0(center.h)), .1, str, 0xFF4040, 8);
|
queuestr(shiftless(rgpushxto0(center.h)), .1, str, 0xFF4040, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(auto& rock: ci.rocks) {
|
for(auto& r: ci.rocks) {
|
||||||
|
auto& rock = *r;
|
||||||
|
|
||||||
hybrid::in_actual([&]{
|
hybrid::in_actual([&]{
|
||||||
dynamicval<eGeometry> b(geometry, gRotSpace);
|
dynamicval<eGeometry> b(geometry, gRotSpace);
|
||||||
@ -102,7 +103,7 @@ void draw_game_cell(cell *cs, ads_matrix V, ld plev) {
|
|||||||
displayed.push_back(&rock);
|
displayed.push_back(&rock);
|
||||||
|
|
||||||
rock.pts.clear();
|
rock.pts.clear();
|
||||||
vector<ld>& shape = rock.type ? shape_missile : shape_rock;
|
auto& shape = *rock.shape;
|
||||||
for(int i=0; i<isize(shape); i += 2) {
|
for(int i=0; i<isize(shape); i += 2) {
|
||||||
hybrid::in_actual([&]{
|
hybrid::in_actual([&]{
|
||||||
auto h = V * rock.at * rots::uxpush(shape[i]) * rots::uypush(shape[i+1]);
|
auto h = V * rock.at * rots::uxpush(shape[i]) * rots::uypush(shape[i+1]);
|
||||||
|
@ -2,13 +2,22 @@ namespace hr {
|
|||||||
|
|
||||||
namespace ads_game {
|
namespace ads_game {
|
||||||
|
|
||||||
enum eObjType { oRock, oMissile, oParticle };
|
enum eObjType { oRock, oMissile, oParticle, oResource };
|
||||||
|
|
||||||
|
enum eResourceType { rtNone, rtHull, rtGold, rtEnergy, rtFuel, rtOxygen };
|
||||||
|
|
||||||
|
color_t rock_color[6] = { 0x703800FF, 0xC0A080FF, 0xC08010FF, 0xC04000FF, 0x408000FF, 0x8040A0FF, };
|
||||||
|
color_t rsrc_color[6] = {0, 0xC0C0C0FF, 0xFFD500FF, 0xFF0000FF, 0x00FF00FF, 0x0000FFFF };
|
||||||
|
|
||||||
|
vector<ld>* rsrc_shape[6] = { nullptr, &shape_heart, &shape_gold, &shape_weapon, &shape_fuel, &shape_airtank };
|
||||||
|
|
||||||
struct ads_object {
|
struct ads_object {
|
||||||
eObjType type;
|
eObjType type;
|
||||||
|
eResourceType resource;
|
||||||
cell *owner;
|
cell *owner;
|
||||||
ads_matrix at;
|
ads_matrix at;
|
||||||
color_t col;
|
color_t col;
|
||||||
|
vector<ld>* shape;
|
||||||
|
|
||||||
ld life_start, life_end;
|
ld life_start, life_end;
|
||||||
cross_result pt_main;
|
cross_result pt_main;
|
||||||
@ -25,7 +34,7 @@ enum eWalltype { wtNone, wtDestructible, wtSolid, wtGate };
|
|||||||
struct cellinfo {
|
struct cellinfo {
|
||||||
int mpd_terrain; /* 0 = fully generated terrain */
|
int mpd_terrain; /* 0 = fully generated terrain */
|
||||||
int rock_dist; /* rocks generated in this radius */
|
int rock_dist; /* rocks generated in this radius */
|
||||||
vector<ads_object> rocks;
|
vector<std::unique_ptr<ads_object>> rocks;
|
||||||
eWalltype type;
|
eWalltype type;
|
||||||
cellinfo() {
|
cellinfo() {
|
||||||
mpd_terrain = 4;
|
mpd_terrain = 4;
|
||||||
@ -119,23 +128,27 @@ void gen_rocks(cell *c, cellinfo& ci, int radius) {
|
|||||||
hybrid::in_actual([&] {
|
hybrid::in_actual([&] {
|
||||||
int q = rpoisson(.25);
|
int q = rpoisson(.25);
|
||||||
|
|
||||||
auto add_rock = [&] (ads_object&& r) {
|
auto add_rock = [&] (ads_matrix T) {
|
||||||
|
eResourceType rt = eResourceType(rand() % 6);
|
||||||
|
auto r = std::make_unique<ads_object> (oRock, c, T, rock_color[rt]);
|
||||||
|
r->resource = rt;
|
||||||
|
r->shape = &(rand() % 2 ? shape_rock2 : shape_rock);
|
||||||
if(geometry != gRotSpace) { println(hlog, "wrong geometry detected in gen_rocks 2!"); exit(1); }
|
if(geometry != gRotSpace) { println(hlog, "wrong geometry detected in gen_rocks 2!"); exit(1); }
|
||||||
compute_life(hybrid::get_at(c, 0), unshift(r.at), [&] (cell *c, ld t) {
|
compute_life(hybrid::get_at(c, 0), unshift(r->at), [&] (cell *c, ld t) {
|
||||||
auto& ci = ci_at[c];
|
auto& ci = ci_at[c];
|
||||||
hybrid::in_underlying_geometry([&] { gen_terrain(c, ci); });
|
hybrid::in_underlying_geometry([&] { gen_terrain(c, ci); });
|
||||||
ci.type = wtNone;
|
ci.type = wtNone;
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
ci.rocks.emplace_back(r);
|
ci.rocks.emplace_back(std::move(r));
|
||||||
};
|
};
|
||||||
|
|
||||||
for(int i=0; i<q; i++) {
|
for(int i=0; i<q; i++) {
|
||||||
int kind = hrand(100);
|
int kind = hrand(100);
|
||||||
if(kind < 50)
|
if(kind < 50)
|
||||||
add_rock(ads_object(oRock, c, ads_matrix(rots::uxpush(randd() * .6 - .3) * rots::uypush(randd() * .6 - .3)), 0xC0C0C0FF));
|
add_rock(ads_matrix(rots::uxpush(randd() * .6 - .3) * rots::uypush(randd() * .6 - .3)));
|
||||||
else
|
else
|
||||||
add_rock(ads_object(oRock, c, ads_matrix(rots::uypush(randd() * .6 - .3) * lorentz(0, 3, 0.5 + randd() * 1)), 0xC04040FF));
|
add_rock(ads_matrix(rots::uypush(randd() * .6 - .3) * lorentz(0, 3, 0.5 + randd() * 1)));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -145,13 +158,23 @@ void gen_rocks(cell *c, cellinfo& ci, int radius) {
|
|||||||
void gen_particles(int qty, cell *c, shiftmatrix from, color_t col, ld t) {
|
void gen_particles(int qty, cell *c, shiftmatrix from, color_t col, ld t) {
|
||||||
auto& ro = ci_at[c].rocks;
|
auto& ro = ci_at[c].rocks;
|
||||||
for(int i=0; i<qty; i++) {
|
for(int i=0; i<qty; i++) {
|
||||||
ro.emplace_back(ads_object{oParticle, c, from * spin(randd() * TAU) * lorentz(0, 2, 1 + randd()), col });
|
auto r = std::make_unique<ads_object>(oParticle, c, from * spin(randd() * TAU) * lorentz(0, 2, 1 + randd()), col );
|
||||||
auto& r = ro.back();
|
r->shape = &shape_particle;
|
||||||
r.life_end = randd() * t;
|
r->life_end = randd() * t;
|
||||||
r.life_start = 0;
|
r->life_start = 0;
|
||||||
|
ro.emplace_back(std::move(r));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gen_resource(cell *c, shiftmatrix from, eResourceType rsrc) {
|
||||||
|
if(!rsrc) return;
|
||||||
|
auto r = std::make_unique<ads_object>(oResource, c, from, rsrc_color[rsrc]);
|
||||||
|
r->shape = rsrc_shape[rsrc];
|
||||||
|
r->life_end = HUGE_VAL;
|
||||||
|
r->life_start = 0;
|
||||||
|
ci_at[c].rocks.emplace_back(std::move(r));
|
||||||
|
}
|
||||||
|
|
||||||
void handle_crashes() {
|
void handle_crashes() {
|
||||||
vector<ads_object*> missiles;
|
vector<ads_object*> missiles;
|
||||||
vector<ads_object*> rocks;
|
vector<ads_object*> rocks;
|
||||||
@ -182,6 +205,7 @@ void handle_crashes() {
|
|||||||
hybrid::in_actual([&] {
|
hybrid::in_actual([&] {
|
||||||
gen_particles(8, m->owner, m->at * ads_matrix(Id, m->life_end), missile_color, 0.1);
|
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(8, r->owner, r->at * ads_matrix(Id, r->life_end), r->col, 0.5);
|
||||||
|
gen_resource(r->owner, r->at * ads_matrix(Id, r->life_end), r->resource);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user