mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 14:02:59 +00:00 
			
		
		
		
	ads-game:: you can now shoot rocks
This commit is contained in:
		| @@ -14,7 +14,7 @@ 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(rockinfo{1, S1, 0xC0C0FFFF }); |   ro.emplace_back(rockinfo{oMissile, c, S1, 0xC0C0FFFF }); | ||||||
|   auto& r = ro.back(); |   auto& r = ro.back(); | ||||||
|  |  | ||||||
|   ads_matrix Scell(Id, 0);     |   ads_matrix Scell(Id, 0);     | ||||||
| @@ -106,6 +106,8 @@ bool ads_turn(int idelta) { | |||||||
|    |    | ||||||
|   if(!(cmode & sm::NORMAL)) return false; |   if(!(cmode & sm::NORMAL)) return false; | ||||||
|  |  | ||||||
|  |   handle_crashes(); | ||||||
|  |  | ||||||
|   auto& a = multi::actionspressed; |   auto& a = multi::actionspressed; | ||||||
|   auto& la = multi::lactionpressed; |   auto& la = multi::lactionpressed; | ||||||
|    |    | ||||||
|   | |||||||
| @@ -92,33 +92,35 @@ void draw_game_cell(cell *cs, ads_matrix V, ld plev) { | |||||||
|  |  | ||||||
|   for(auto& rock: ci.rocks) { |   for(auto& rock: ci.rocks) { | ||||||
|      |      | ||||||
|     vector<hyperpoint> pts; |     hybrid::in_actual([&]{ | ||||||
|      |  | ||||||
|     vector<ld>& shape = rock.type ? shape_missile : shape_rock; |  | ||||||
|      |  | ||||||
|     flatresult fr_main; |  | ||||||
|     if(1) hybrid::in_actual([&]{ |  | ||||||
|       dynamicval<eGeometry> b(geometry, gRotSpace); |       dynamicval<eGeometry> b(geometry, gRotSpace); | ||||||
|       auto h = V * rock.at; |       auto h = V * rock.at; | ||||||
|       fr_main = cross0(current * h); |       rock.pt_main = cross0(current * h); | ||||||
|       }); |       }); | ||||||
|     if(fr_main.shift < rock.life_start || fr_main.shift > rock.life_end) continue; |      | ||||||
|  |     if(rock.pt_main.shift < rock.life_start || rock.pt_main.shift > rock.life_end) continue; | ||||||
|  |     displayed.push_back(&rock); | ||||||
|  |  | ||||||
|  |     rock.pts.clear();         | ||||||
|  |     vector<ld>& shape = rock.type ? shape_missile : shape_rock;     | ||||||
|     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]); | ||||||
|         flatresult f = cross0(current * h); |         flatresult f = cross0(current * h); | ||||||
|         pts.push_back(f.h); |         rock.pts.push_back(f); | ||||||
|         }); |         }); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|     for(auto h: pts) curvepoint(h); |     for(auto h: rock.pts) curvepoint(h.h); | ||||||
|     curvepoint(pts[0]); |     curvepoint(rock.pts[0].h); | ||||||
|     queuecurve(shiftless(Id), rock.type == 1 ? 0xFF0000FF : 0x000000FF, rock.col, PPR::LINE); |     queuecurve(shiftless(Id),  | ||||||
|  |       rock.type == oMissile ? missile_color :  | ||||||
|  |       rock.type == oParticle ? rock.col : | ||||||
|  |       0x000000FF, rock.col, PPR::LINE); | ||||||
|  |  | ||||||
|     if(view_proper_times) { |     if(view_proper_times) { | ||||||
|       string str = format(tformat, fr_main.shift / TAU); |       string str = format(tformat, rock.pt_main.shift / TAU); | ||||||
|       queuestr(shiftless(rgpushxto0(fr_main.h)), .1, str, 0xFFFFFF, 8); |       queuestr(shiftless(rgpushxto0(rock.pt_main.h)), .1, str, 0xFFFFFF, 8); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|    |    | ||||||
| @@ -127,6 +129,7 @@ void draw_game_cell(cell *cs, ads_matrix V, ld plev) { | |||||||
| bool view_ads_game() { | bool view_ads_game() { | ||||||
|   auto plev = cgi.plevel; /* we are in another CGI so we have no access to that... */ |   auto plev = cgi.plevel; /* we are in another CGI so we have no access to that... */ | ||||||
|   gen_budget = 5; |   gen_budget = 5; | ||||||
|  |   displayed.clear(); | ||||||
|    |    | ||||||
|   flatresult base; |   flatresult base; | ||||||
|   if(1) {   |   if(1) {   | ||||||
|   | |||||||
| @@ -40,4 +40,9 @@ const char *tformat = "%.2f"; | |||||||
|  |  | ||||||
| void game_menu(); | void game_menu(); | ||||||
|  |  | ||||||
|  | /** all the missiles and objects currently displayed */ | ||||||
|  | vector<struct rockinfo*> displayed; | ||||||
|  |  | ||||||
|  | color_t missile_color = 0xFF0000FF; | ||||||
|  |  | ||||||
| }} | }} | ||||||
|   | |||||||
| @@ -2,14 +2,19 @@ namespace hr { | |||||||
|  |  | ||||||
| namespace ads_game { | namespace ads_game { | ||||||
|  |  | ||||||
|  | enum eObjType { oRock, oMissile, oParticle }; | ||||||
|  |  | ||||||
| struct rockinfo { | struct rockinfo { | ||||||
|   int type; |   eObjType type; | ||||||
|  |   cell *owner; | ||||||
|   ads_matrix at; |   ads_matrix at; | ||||||
|   color_t col; |   color_t col; | ||||||
|    |    | ||||||
|   ld life_start, life_end; |   ld life_start, life_end; | ||||||
|  |   flatresult pt_main; | ||||||
|  |   vector<flatresult> pts; | ||||||
|    |    | ||||||
|   rockinfo(int t, const ads_matrix& T, color_t _col) : type(t), at(T), col(_col) {  |   rockinfo(eObjType t, cell *_owner, const ads_matrix& T, color_t _col) : type(t), owner(_owner), at(T), col(_col) {  | ||||||
|     life_start = -HUGE_VAL; |     life_start = -HUGE_VAL; | ||||||
|     life_end = HUGE_VAL; |     life_end = HUGE_VAL; | ||||||
|     } |     } | ||||||
| @@ -112,7 +117,7 @@ void gen_rocks(cell *c, cellinfo& ci, int radius) { | |||||||
|  |  | ||||||
|   if(radius == 0) { |   if(radius == 0) { | ||||||
|     hybrid::in_actual([&] { |     hybrid::in_actual([&] { | ||||||
|       int q = rpoisson(.05); |       int q = rpoisson(.25); | ||||||
|        |        | ||||||
|       auto add_rock = [&] (rockinfo&& r) { |       auto add_rock = [&] (rockinfo&& r) { | ||||||
|         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); } | ||||||
| @@ -128,14 +133,60 @@ void gen_rocks(cell *c, cellinfo& ci, int radius) { | |||||||
|       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(rockinfo(0, ads_matrix(rots::uxpush(randd() * .6 - .3) * rots::uypush(randd() * .6 - .3)), 0xC0C0C0FF)); |           add_rock(rockinfo(oRock, c, ads_matrix(rots::uxpush(randd() * .6 - .3) * rots::uypush(randd() * .6 - .3)), 0xC0C0C0FF)); | ||||||
|         else |         else | ||||||
|           add_rock(rockinfo(0, ads_matrix(rots::uypush(randd() * .6 - .3) * lorentz(0, 3, 0.5 + randd() * 1)), 0xC04040FF)); |           add_rock(rockinfo(oRock, c, ads_matrix(rots::uypush(randd() * .6 - .3) * lorentz(0, 3, 0.5 + randd() * 1)), 0xC04040FF)); | ||||||
|         }         |         }         | ||||||
|       }); |       }); | ||||||
|     } |     } | ||||||
|   ci.rock_dist = radius; |   ci.rock_dist = radius; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | void gen_particles(int qty, cell *c, shiftmatrix from, color_t col, ld t) { | ||||||
|  |   auto& ro = ci_at[c].rocks; | ||||||
|  |   for(int i=0; i<qty; i++) { | ||||||
|  |     ro.emplace_back(rockinfo{oParticle, c, from * spin(randd() * TAU) * lorentz(0, 2, 1 + randd()), col }); | ||||||
|  |     auto& r = ro.back(); | ||||||
|  |     r.life_end = randd() * t; | ||||||
|  |     r.life_start = 0; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | void handle_crashes() { | ||||||
|  |   vector<rockinfo*> missiles; | ||||||
|  |   vector<rockinfo*> rocks; | ||||||
|  |   for(auto m: displayed) { | ||||||
|  |     if(m->type == oMissile) | ||||||
|  |       missiles.push_back(m); | ||||||
|  |     if(m->type == oRock) | ||||||
|  |       rocks.push_back(m); | ||||||
|  |     } | ||||||
|  |   hybrid::in_underlying_geometry([&] { | ||||||
|  |     for(auto m: missiles) { | ||||||
|  |       hyperpoint h = kleinize(m->pt_main.h); | ||||||
|  |       for(auto r: rocks) { | ||||||
|  |         int winding = 0; | ||||||
|  |         vector<hyperpoint> kleins; | ||||||
|  |         for(auto& p: r->pts) kleins.push_back(kleinize(p.h) - h); | ||||||
|  |         auto take = [&] (hyperpoint& a, hyperpoint& b) { | ||||||
|  |           if(asign(a[1], b[1]) && xcross(b[0], b[1], a[0], a[1]) < 1e-6) | ||||||
|  |             winding++; | ||||||
|  |           }; | ||||||
|  |         for(int i=1; i<isize(kleins); i++) take(kleins[i-1], kleins[i]); | ||||||
|  |         take(kleins.back(), kleins[0]); | ||||||
|  |         if(winding & 1) { | ||||||
|  |           println(hlog, "winding = ", winding); | ||||||
|  |           println(hlog, "kleins = ", kleins); | ||||||
|  |           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); | ||||||
|  |             }); | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |  | ||||||
| }} | }} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue