From 22a5729d3572dc3820700c0e24f73b416b392668 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Mon, 26 Sep 2022 13:25:30 +0200 Subject: [PATCH] ads-game:: dsgame patterns --- rogueviz/ads/ds-game.cpp | 221 ++++++++++++++++++++++++++++++++++----- 1 file changed, 197 insertions(+), 24 deletions(-) diff --git a/rogueviz/ads/ds-game.cpp b/rogueviz/ads/ds-game.cpp index 3ad8d06c..4f5fcff4 100644 --- a/rogueviz/ads/ds-game.cpp +++ b/rogueviz/ads/ds-game.cpp @@ -17,37 +17,206 @@ bool mark_origin = false; ads_object *main_rock; +struct rock_generator { + ld cshift; + + ads_object* add(transmatrix T) { + auto r = std::make_unique (oRock, nullptr, ads_matrix(T, cshift), 0xFFFFFFFF); + r->shape = &shape_disk; + auto res = &*r; + rocks.emplace_back(std::move(r)); + return res; + }; + + void report(string s) { + println(hlog, lalign(10, format(tformat, cshift/time_unit)), ": ", s); + }; + + ld rand_range(ld a, ld b) { return lerp(a, b, randd()); }; + + transmatrix rand_place() { + geometry = gSphere; + hyperpoint h = random_spin3() * C0; + transmatrix T = gpushxto0(h); + geometry = gSpace435; + for(int i=0; i<4; i++) T[i][3] = T[3][i] = i == 3; + return T; + }; + + void death_cross(int qty) { + ld rapidity = rand_range(1, 3); + cshift += rand_range(0.5, 1); + ld alpha = randd() * TAU; + report(lalign(0, "Death Cross ", qty)); + for(int a=0; a inf */ + ld appr = 5; + transmatrix T = lorentz(2, 3, -appr) * cspin(0, 2, exp(-appr)) * lorentz(2, 3, appr); + /* all the entries happen to be multiples of .5 */ + for(int i=0; i<4; i++) for(int j=0; j<4; j++) { + auto& b = T[i][j]; + b = floor(b * 10 + .5) / 10; + } + return T; + } + + /* see div_matrix */ + transmatrix conv_matrix() { + ld appr = 5; + transmatrix T = lorentz(2, 3, appr) * cspin(0, 2, exp(-appr)) * lorentz(2, 3, -appr); + for(int i=0; i<4; i++) for(int j=0; j<4; j++) { + auto& b = T[i][j]; + b = floor(b * 10 + .5) / 10; + } + return T; + } + + void divergent_spiral() { + report("Divergent Spiral"); + cshift += rand_range(.3, .7); + ld alpha = randd() * TAU; + ld step = rand_range(0.17, 0.23); + for(int i=0; i<45; i++) { + cshift += step; + add(spin(alpha + i * TAU / 30) * div_matrix()); + } + cshift += rand_range(.3, .7); + } + + void convergent_spiral() { + report("Convergent Spiral"); + cshift += rand_range(.3, .7); + ld alpha = randd() * TAU; + ld step = rand_range(0.17, 0.23); + for(int i=0; i<45; i++) { + cshift += step; + add(spin(alpha + i * TAU / 30) * conv_matrix()); + } + cshift += rand_range(.3, .7); + } + + void rack() { + report("Rack"); + int qty = 3 + rand() % 4; + ld rapidity = rand_range(1, 3); + ld step = rand_range(.45, .75); + ld alpha = rand_range(0, TAU); + ld spinv = rand_range(0, TAU); + for(int i=0; i g(geometry, gSpace435); + + rockgen.cshift = 0; + /* create the main rock first */ - if(1) { - dynamicval g(geometry, gSpace435); - auto r = std::make_unique (oRock, nullptr, ads_matrix(Id, 0), 0xFFD500FF); - r->shape = &shape_gold; - main_rock = &*r; - rocks.emplace_back(std::move(r)); - } + main_rock = rockgen.add(Id); + main_rock->col = 0xFFD500FF; + main_rock->shape = &shape_gold; - for(int i=0; i<500; i++) { - hyperpoint h = random_spin3() * C0; - println(hlog, "h = ", h); - - transmatrix T = gpushxto0(h); - dynamicval g(geometry, gSpace435); - for(int i=0; i<4; i++) T[i][3] = T[3][i] = i == 3; - transmatrix worldline = inverse(T); - worldline = worldline * spin(randd() * TAU); - worldline = worldline * lorentz(0, 3, randd()); - - auto r = std::make_unique (oRock, nullptr, ads_matrix(worldline, 0), 0xFFFFFFFF); - r->shape = &shape_disk; - rocks.emplace_back(std::move(r)); - } + /* also create shape_disk */ shape_disk.clear(); for(int d=0; d<=360; d += 15) { shape_disk.push_back(sin(d*degree) * 0.1 * scale); shape_disk.push_back(cos(d*degree) * 0.1 * scale); } + + rockgen.cshift += 2; + rockgen.add_until(future_shown); } void ds_gen_particles(int qty, transmatrix from, ld shift, color_t col, ld spd, ld t, ld spread = 1) { @@ -180,6 +349,10 @@ bool ds_turn(int idelta) { } fixmatrix(current.T); + if(1) { + rockgen.add_until(current.shift + future_shown); + } + if(!paused) { ship_pt += pt; pdata.oxygen -= pt; @@ -240,8 +413,8 @@ void view_ds_game() { for(auto& r: rocks) { auto& rock = *r; poly_outline = 0xFF; - if(rock.at.shift < current.shift - 4 * TAU) continue; - if(rock.at.shift > current.shift + 4 * TAU) continue; + if(rock.at.shift < current.shift - future_shown) continue; + if(rock.at.shift > current.shift + future_shown) continue; if(1) { dynamicval g(geometry, gSpace435);