mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 14:02:59 +00:00 
			
		
		
		
	gp:: adjm to fix the confusion in quotient spaces
This commit is contained in:
		
							
								
								
									
										1
									
								
								cell.cpp
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								cell.cpp
									
									
									
									
									
								
							| @@ -1168,6 +1168,7 @@ EX void clearCellMemory() { | |||||||
|   dists_computed.clear(); |   dists_computed.clear(); | ||||||
|   keep_distances_from.clear(); perma_distances = 0; |   keep_distances_from.clear(); perma_distances = 0; | ||||||
|   pd_from = NULL; |   pd_from = NULL; | ||||||
|  |   gp::gp_adj.clear(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| auto cellhooks = addHook(clearmemory, 500, clearCellMemory); | auto cellhooks = addHook(clearmemory, 500, clearCellMemory); | ||||||
|   | |||||||
| @@ -337,13 +337,27 @@ EX transmatrix iddspin(cell *c, int d, ld bonus IS(0)) { return currentmap->spin | |||||||
| EX ld cellgfxdist(cell *c, int d) { return currentmap->spacedist(c, d); } | EX ld cellgfxdist(cell *c, int d) { return currentmap->spacedist(c, d); } | ||||||
|      |      | ||||||
| double hrmap_standard::spacedist(cell *c, int i) { | double hrmap_standard::spacedist(cell *c, int i) { | ||||||
|   if(NONSTDVAR) return hrmap::spacedist(c, i); |   if(NONSTDVAR || WDIM == 3) return hrmap::spacedist(c, i); | ||||||
|   if(!BITRUNCATED) return cgi.tessf; |   if(!BITRUNCATED) return cgi.tessf; | ||||||
|   if(c->type == S6 && (i&1)) return cgi.hexhexdist; |   if(c->type == S6 && (i&1)) return cgi.hexhexdist; | ||||||
|   return cgi.crossf; |   return cgi.crossf; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | int neighborId(heptagon *h1, heptagon *h2) { | ||||||
|  |   for(int i=0; i<h1->type; i++) if(h1->move(i) == h2) return i; | ||||||
|  |   return -1; | ||||||
|  |   } | ||||||
|  |  | ||||||
| transmatrix hrmap_standard::adj(cell *c, int i) { | transmatrix hrmap_standard::adj(cell *c, int i) { | ||||||
|  |   if(GOLDBERG && gp::do_adjm) { | ||||||
|  |     transmatrix T = master_relative(c, true); | ||||||
|  |     transmatrix U = master_relative(c->cmove(i), false); | ||||||
|  |     if(gp::gp_adj.count({c,i})) { | ||||||
|  |       return T * gp::gp_adj[{c, i}] * U; | ||||||
|  |       } | ||||||
|  |     else | ||||||
|  |       println(hlog, "gpadj not found"); | ||||||
|  |     } | ||||||
|   if(NONSTDVAR) return calc_relative_matrix(c->cmove(i), c, C0); |   if(NONSTDVAR) return calc_relative_matrix(c->cmove(i), c, C0); | ||||||
|   double d = cellgfxdist(c, i); |   double d = cellgfxdist(c, i); | ||||||
|   transmatrix T = ddspin(c, i) * xpush(d); |   transmatrix T = ddspin(c, i) * xpush(d); | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								goldberg.cpp
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								goldberg.cpp
									
									
									
									
									
								
							| @@ -82,6 +82,7 @@ EX namespace gp { | |||||||
|     signed char rdir; |     signed char rdir; | ||||||
|     signed char mindir; |     signed char mindir; | ||||||
|     loc start; |     loc start; | ||||||
|  |     transmatrix adjm; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|   EX int fixg6(int x) { return (x + MODFIXER) % SG6; } |   EX int fixg6(int x) { return (x + MODFIXER) % SG6; } | ||||||
| @@ -198,6 +199,8 @@ EX namespace gp { | |||||||
|     return false; |     return false; | ||||||
|     } |     } | ||||||
|    |    | ||||||
|  |   EX bool do_adjm; | ||||||
|  |  | ||||||
|   void conn1(loc at, int dir, int dir1) { |   void conn1(loc at, int dir, int dir1) { | ||||||
|     auto& wc = get_mapping(at); |     auto& wc = get_mapping(at); | ||||||
|     auto wcw = get_localwalk(wc, dir); |     auto wcw = get_localwalk(wc, dir); | ||||||
| @@ -209,11 +212,13 @@ EX namespace gp { | |||||||
|       if(peek(wcw)) { |       if(peek(wcw)) { | ||||||
|         DEBB0(DF_GP, ("(pulled) "); ) |         DEBB0(DF_GP, ("(pulled) "); ) | ||||||
|         set_localwalk(wc1, dir1, wcw + wstep); |         set_localwalk(wc1, dir1, wcw + wstep); | ||||||
|  |         if(do_adjm) wc1.adjm = wc.adjm * gp_adj[{wcw.at, wcw.spin}]; | ||||||
|         } |         } | ||||||
|       else { |       else { | ||||||
|         peek(wcw) = newCell(SG6, wc.cw.at->master); |         peek(wcw) = newCell(SG6, wc.cw.at->master); | ||||||
|         wcw.at->c.setspin(wcw.spin, 0, false); |         wcw.at->c.setspin(wcw.spin, 0, false); | ||||||
|         set_localwalk(wc1, dir1, wcw + wstep); |         set_localwalk(wc1, dir1, wcw + wstep); | ||||||
|  |         if(do_adjm) wc1.adjm = wc.adjm; | ||||||
|         spawn++; |         spawn++; | ||||||
|         DEBB0(DF_GP, ("(created) "); ) |         DEBB0(DF_GP, ("(created) "); ) | ||||||
|         } |         } | ||||||
| @@ -237,6 +242,10 @@ EX namespace gp { | |||||||
|         exit(1); |         exit(1); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|  |     if(do_adjm) { | ||||||
|  |       gp_adj[{wcw.at, wcw.spin}] = inverse(wc.adjm) * wc1.adjm; | ||||||
|  |       gp_adj[{wcw1.at, wcw1.spin}] = inverse(wc1.adjm) * wc.adjm; | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   void conn(loc at, int dir) { |   void conn(loc at, int dir) { | ||||||
| @@ -244,6 +253,8 @@ EX namespace gp { | |||||||
|     conn1(at + eudir(dir), fixg6(dir+SG3), fixg6(dir)); |     conn1(at + eudir(dir), fixg6(dir+SG3), fixg6(dir)); | ||||||
|     } |     } | ||||||
|    |    | ||||||
|  |   EX map<pair<cell*, int>, transmatrix> gp_adj; | ||||||
|  |  | ||||||
|   goldberg_mapping_t& set_heptspin(loc at, heptspin hs) { |   goldberg_mapping_t& set_heptspin(loc at, heptspin hs) { | ||||||
|     auto& ac0 = get_mapping(at); |     auto& ac0 = get_mapping(at); | ||||||
|     ac0.cw = cellwalker(hs.at->c7, hs.spin, hs.mirrored); |     ac0.cw = cellwalker(hs.at->c7, hs.spin, hs.mirrored); | ||||||
| @@ -300,6 +311,18 @@ EX namespace gp { | |||||||
|       set_heptspin(vc[2], hs + wstep - 1 + wstep + 1).mindir = -3; |       set_heptspin(vc[2], hs + wstep - 1 + wstep + 1).mindir = -3; | ||||||
|       } |       } | ||||||
|  |  | ||||||
|  |     do_adjm = quotient; | ||||||
|  |     if(do_adjm) { | ||||||
|  |       auto m = (hrmap_standard*)currentmap; | ||||||
|  |       get_mapping(vc[0]).adjm = Id; | ||||||
|  |       get_mapping(vc[1]).adjm = m->adj(c->master, d); | ||||||
|  |       get_mapping(vc[S3-1]).adjm = m->adj(c->master, (d+1)%c->master->type); | ||||||
|  |       if(S3 == 4) { | ||||||
|  |         heptspin hs1 = hs + wstep - 1; | ||||||
|  |         get_mapping(vc[2]).adjm = m->adj(c->master, d) * m->adj(hs1.at, hs1.spin); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |      | ||||||
|     if(S3 == 4 && param == loc(1,1)) { |     if(S3 == 4 && param == loc(1,1)) { | ||||||
|       conn(loc(0,0), 1); |       conn(loc(0,0), 1); | ||||||
|       conn(loc(0,1), 0); |       conn(loc(0,1), 0); | ||||||
|   | |||||||
| @@ -1526,6 +1526,7 @@ addHook(hooks_gamedata, 0, [] (gamedata* gd) { | |||||||
|   gd->store(last_gravity_state); |   gd->store(last_gravity_state); | ||||||
|   gd->store(shpos); |   gd->store(shpos); | ||||||
|   gd->store(cshpos); |   gd->store(cshpos); | ||||||
|  |   gd->store(gp::do_adjm); | ||||||
|   }) + |   }) + | ||||||
| addHook(hooks_removecells, 0, [] () { | addHook(hooks_removecells, 0, [] () { | ||||||
|   eliminate_if(crush_next, is_cell_removed); |   eliminate_if(crush_next, is_cell_removed); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue