mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-01-11 18:00:34 +00:00
replaced chosenDown with a better set of functions
This commit is contained in:
parent
08e6990d23
commit
dee2b23991
58
bigstuff.cpp
58
bigstuff.cpp
@ -648,38 +648,6 @@ cell *randomDown(cell *c) {
|
|||||||
return tab[hrand(q)];
|
return tab[hrand(q)];
|
||||||
}
|
}
|
||||||
|
|
||||||
// which=1 => right, which=-1 => left
|
|
||||||
|
|
||||||
typedef int cellfunction(cell*);
|
|
||||||
|
|
||||||
int chosenDownId(cell *c, int which, cellfunction* cf) {
|
|
||||||
int d = (*cf)(c)-1;
|
|
||||||
for(int i=0; i<c->type; i++) {
|
|
||||||
if(!c->move(i)) createMov(c, i);
|
|
||||||
if(c->move(i)->mpdist > BARLEV && cf == coastvalEdge) setdist(c->move(i), BARLEV, c);
|
|
||||||
|
|
||||||
if((*cf)(c->move(i)) == d) {
|
|
||||||
again:
|
|
||||||
int i2 = (i+which+MODFIXER)%c->type;
|
|
||||||
createMov(c, i2);
|
|
||||||
if((*cf)(c->move(i2)) == d) {
|
|
||||||
i = i2; goto again;
|
|
||||||
}
|
|
||||||
else return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// set which=1,bonus=1 to get right neighbor on level
|
|
||||||
|
|
||||||
cell *chosenDown(cell *c, int which, int bonus, cellfunction* cf) {
|
|
||||||
int id = chosenDownId(c, which, cf);
|
|
||||||
if(id == -1) return NULL;
|
|
||||||
return createMovR(c, id + bonus);
|
|
||||||
}
|
|
||||||
|
|
||||||
int edgeDepth(cell *c) {
|
int edgeDepth(cell *c) {
|
||||||
if(c->land == laIvoryTower || c->land == laEndorian || c->land == laDungeon)
|
if(c->land == laIvoryTower || c->land == laEndorian || c->land == laDungeon)
|
||||||
return coastvalEdge(c);
|
return coastvalEdge(c);
|
||||||
@ -698,28 +666,12 @@ int getHauntedDepth(cell *c) {
|
|||||||
return -100;
|
return -100;
|
||||||
}
|
}
|
||||||
|
|
||||||
int towerval(cell *c, cellfunction* cf) {
|
int towerval(cell *c, const cellfunction& cf) {
|
||||||
// if(c->land != laEdge) return 0;
|
cell *cp1 = ts::left_of(c, cf);
|
||||||
cell *cp1 = chosenDown(c, 1, 1, cf);
|
if(!cp1) return 0;
|
||||||
if(!cp1) return 0;
|
|
||||||
/* cell *cp2 = chosenDown(cp1, 1, 1);
|
|
||||||
if(!cp2) return 0;
|
|
||||||
cell *cm1 = chosenDown(c, -1, -1);
|
|
||||||
if(!cm1) return 0;
|
|
||||||
cell *cm2 = chosenDown(cm1, -1, -1);
|
|
||||||
if(!cm2) return 0; */
|
|
||||||
|
|
||||||
/* return
|
|
||||||
(c->type-6)
|
|
||||||
+ 2*(cp1->type-6) + 4*(cp2->type-6)
|
|
||||||
+ 8*(cm1->type-6) +16*(cm2->type-6); */
|
|
||||||
|
|
||||||
int under = 0;
|
int under = 0;
|
||||||
int cfc = (*cf)(c);
|
int cfc = cf(c);
|
||||||
for(int i=0; i<c->type; i++) {
|
forCellEx(c2, c) if(cf(c2) < cfc) under++;
|
||||||
if(c->move(i) && (*cf)(c->move(i)) < cfc)
|
|
||||||
under++;
|
|
||||||
}
|
|
||||||
return (c->type-6) + 2*(cp1->type-6) + 4*under;
|
return (c->type-6) + 2*(cp1->type-6) + 4*under;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
44
complex.cpp
44
complex.cpp
@ -3590,8 +3590,10 @@ namespace dungeon {
|
|||||||
c4 = c2->move(i);
|
c4 = c2->move(i);
|
||||||
}
|
}
|
||||||
rdepths[i] = c2 && c3 && c4 && (c2->landflags == 3 || c3->landflags == 3 || c4->landflags == 3);
|
rdepths[i] = c2 && c3 && c4 && (c2->landflags == 3 || c3->landflags == 3 || c4->landflags == 3);
|
||||||
c2 = chosenDown(c2, 1, 0); // if(!c2) break;
|
if(c2) generate_around(c2);
|
||||||
c3 = chosenDown(c3, -1, 0);
|
if(c3) generate_around(c3);
|
||||||
|
c2 = ts::left_parent(c2, coastvalEdge);
|
||||||
|
c3 = ts::right_parent(c3, coastvalEdge);
|
||||||
if(!c2) { towerError(c); return; }
|
if(!c2) { towerError(c); return; }
|
||||||
if(!c3) { towerError(c); return; }
|
if(!c3) { towerError(c); return; }
|
||||||
}
|
}
|
||||||
@ -3604,19 +3606,22 @@ namespace dungeon {
|
|||||||
else if(!rdepths[2] && !rdepths[4] && !rdepths[1]) {
|
else if(!rdepths[2] && !rdepths[4] && !rdepths[1]) {
|
||||||
c2 = c;
|
c2 = c;
|
||||||
c3 = c;
|
c3 = c;
|
||||||
cell *c4 = chosenDown(c, 1, 1);
|
generate_around(c);
|
||||||
cell *c5 = chosenDown(c, -1, -1);
|
cell *c4 = ts::left_of(c, coastvalEdge);
|
||||||
|
cell *c5 = ts::right_of(c, coastvalEdge);
|
||||||
for(int i=0; i<3; i++) {
|
for(int i=0; i<3; i++) {
|
||||||
if(coastvalEdge(c2) == 0) break;
|
if(coastvalEdge(c2) == 0) break;
|
||||||
if(c2 && c4 && c4->landflags == 3 && c2->landflags != 3 && c4 == chosenDown(c2, 1, 1))
|
for(cell *cx: {c2, c3, c4, c5}) if(cx) generate_around(cx);
|
||||||
|
|
||||||
|
if(c2 && c4 && c4->landflags == 3 && c2->landflags != 3 && c4 == ts::left_of(c2, coastvalEdge))
|
||||||
c->wall = waLadder;
|
c->wall = waLadder;
|
||||||
if(c3 && c5 && c5->landflags == 3 && c3->landflags != 3 && c5 == chosenDown(c3, -1, -1))
|
if(c3 && c5 && c5->landflags == 3 && c3->landflags != 3 && c5 == ts::right_of(c3, coastvalEdge))
|
||||||
c->wall = waLadder;
|
c->wall = waLadder;
|
||||||
buildEquidistant(c4); buildEquidistant(c5);
|
buildEquidistant(c4); buildEquidistant(c5);
|
||||||
if(c2) c2 = chosenDown(c2, 1, 0);
|
if(c2) c2 = ts::left_parent(c2, coastvalEdge);
|
||||||
if(c3) c3 = chosenDown(c3, -1, 0);
|
if(c3) c3 = ts::right_parent(c3, coastvalEdge);
|
||||||
if(c4) c4 = chosenDown(c4, 1, 0);
|
if(c4) c4 = ts::left_parent(c4, coastvalEdge);
|
||||||
if(c5) c5 = chosenDown(c5, -1, 0);
|
if(c5) c5 = ts::right_parent(c5, coastvalEdge);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3645,8 +3650,10 @@ namespace dungeon {
|
|||||||
rdepths[i] = c2 && c3 && c4 && (c2->landflags == 3 || c3->landflags == 3 || c4->landflags == 3);
|
rdepths[i] = c2 && c3 && c4 && (c2->landflags == 3 || c3->landflags == 3 || c4->landflags == 3);
|
||||||
if((c2&&c2->landflags == 1) || (c3&&c3->landflags == 1) || (c4&&c4->landflags == 1))
|
if((c2&&c2->landflags == 1) || (c3&&c3->landflags == 1) || (c4&&c4->landflags == 1))
|
||||||
switchcount++;
|
switchcount++;
|
||||||
c2 = chosenDown(c2, 1, 0); // if(!c2) break;
|
generate_around(c2);
|
||||||
c3 = chosenDown(c3, -1, 0);
|
generate_around(c3);
|
||||||
|
c2 = ts::left_parent(c2, coastvalEdge);
|
||||||
|
c3 = ts::right_parent(c3, coastvalEdge);
|
||||||
if(!c2) { towerError(c); return 0; }
|
if(!c2) { towerError(c); return 0; }
|
||||||
if(!c3) { towerError(c); return 0; }
|
if(!c3) { towerError(c); return 0; }
|
||||||
}
|
}
|
||||||
@ -3696,8 +3703,9 @@ namespace dungeon {
|
|||||||
int df = dungeonFlags(c);
|
int df = dungeonFlags(c);
|
||||||
|
|
||||||
if(df&1) {
|
if(df&1) {
|
||||||
int df1 = dungeonFlags(chosenDown(c,1,1));
|
generate_around(c);
|
||||||
int df2 = dungeonFlags(chosenDown(c,-1,-1));
|
int df1 = dungeonFlags(ts::left_of(c, coastvalEdge));
|
||||||
|
int df2 = dungeonFlags(ts::right_of(c, coastvalEdge));
|
||||||
|
|
||||||
c->wparam = 0;
|
c->wparam = 0;
|
||||||
if(hrand(100) < (c->landparam % 5 == 0 ? 80 : 20)) {
|
if(hrand(100) < (c->landparam % 5 == 0 ? 80 : 20)) {
|
||||||
@ -3725,10 +3733,10 @@ namespace dungeon {
|
|||||||
if(q) downs[hrand(q)]->wall = waLadder;
|
if(q) downs[hrand(q)]->wall = waLadder;
|
||||||
*/
|
*/
|
||||||
cell *c2 =
|
cell *c2 =
|
||||||
c->wparam == 1 ? chosenDown(c, 1, 2) :
|
c->wparam == 1 ? ts::add(c, 1, 2, coastvalEdge) :
|
||||||
c->wparam == 2 ? chosenDown(c, -1, -2) :
|
c->wparam == 2 ? ts::add(c, -1, -2, coastvalEdge) :
|
||||||
c->wparam == 3 ? chosenDown(c, 1, 3) :
|
c->wparam == 3 ? ts::add(c, 1, 3, coastvalEdge) :
|
||||||
c->wparam == 4 ? chosenDown(c, -1, -3) :
|
c->wparam == 4 ? ts::add(c, -1, -3, coastvalEdge) :
|
||||||
NULL;
|
NULL;
|
||||||
|
|
||||||
if(c2) {
|
if(c2) {
|
||||||
|
@ -315,7 +315,7 @@ void expansion_analyzer::reset() {
|
|||||||
descendants.clear();
|
descendants.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class T> int type_in(expansion_analyzer& ea, cell *c, const T& f) {
|
int type_in(expansion_analyzer& ea, cell *c, const cellfunction& f) {
|
||||||
if(!ea.N) ea.preliminary_grouping(), ea.reduce_grouping();
|
if(!ea.N) ea.preliminary_grouping(), ea.reduce_grouping();
|
||||||
vector<int> res;
|
vector<int> res;
|
||||||
res.push_back(subtype(c) * 4 + 2);
|
res.push_back(subtype(c) * 4 + 2);
|
||||||
@ -336,7 +336,7 @@ template<class T> int type_in(expansion_analyzer& ea, cell *c, const T& f) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class T> int type_in_quick(expansion_analyzer& ea, cell *c, const T& f) {
|
int type_in_quick(expansion_analyzer& ea, cell *c, const cellfunction& f) {
|
||||||
vector<int> res;
|
vector<int> res;
|
||||||
res.push_back(subtype(c) * 4 + 2);
|
res.push_back(subtype(c) * 4 + 2);
|
||||||
int d = f(c);
|
int d = f(c);
|
||||||
@ -409,7 +409,7 @@ int curr_dist(cell *c) {
|
|||||||
|
|
||||||
int position;
|
int position;
|
||||||
|
|
||||||
template<class T> int type_in_reduced(expansion_analyzer& ea, cell *c, const T& f) {
|
int type_in_reduced(expansion_analyzer& ea, cell *c, const cellfunction& f) {
|
||||||
int a = ea.N;
|
int a = ea.N;
|
||||||
int t = type_in(ea, c, f);
|
int t = type_in(ea, c, f);
|
||||||
if(expansion.N != a) {
|
if(expansion.N != a) {
|
||||||
@ -419,6 +419,69 @@ template<class T> int type_in_reduced(expansion_analyzer& ea, cell *c, const T&
|
|||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// which=1 => right, which=-1 => left
|
||||||
|
|
||||||
|
int parent_id(cell *c, int which, const cellfunction& cf) {
|
||||||
|
int d = cf(c)-1;
|
||||||
|
for(int i=0; i<c->type; i++) {
|
||||||
|
|
||||||
|
if(cf(c->cmove(i)) == d) {
|
||||||
|
again:
|
||||||
|
int i2 = c->c.fix(i+which);
|
||||||
|
if(cf(c->cmove(i2)) == d) {
|
||||||
|
i = i2; goto again;
|
||||||
|
}
|
||||||
|
else return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set which=1,bonus=1 to get right neighbor on level
|
||||||
|
|
||||||
|
void generate_around(cell *c) {
|
||||||
|
forCellCM(c2, c) if(c2->mpdist > BARLEV) setdist(c2, BARLEV, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace ts {
|
||||||
|
cell *verified_add(cell *c, int which, int bonus, const cellfunction& cf) {
|
||||||
|
int id = parent_id(c, which, cf);
|
||||||
|
if(id == -1) return NULL;
|
||||||
|
return c->cmodmove(id + bonus);
|
||||||
|
}
|
||||||
|
|
||||||
|
cell *verified_add_gen(cell *c, int which, int bonus, const cellfunction& cf) {
|
||||||
|
return verified_add(c, which, bonus, cf);
|
||||||
|
}
|
||||||
|
|
||||||
|
cell *add(cell *c, int which, int bonus, const cellfunction& cf) {
|
||||||
|
int pid = parent_id(c, which, cf);
|
||||||
|
if(pid == -1) pid = 0;
|
||||||
|
return c->cmodmove(pid + bonus);
|
||||||
|
}
|
||||||
|
|
||||||
|
cell *left_of(cell *c, const cellfunction& cf) {
|
||||||
|
int pid = parent_id(c, 1, cf);
|
||||||
|
if(pid == -1) return c;
|
||||||
|
if(VALENCE == 3) return c->cmodmove(pid+1);
|
||||||
|
else return (cellwalker(c, pid) + wstep - 1).cpeek();
|
||||||
|
}
|
||||||
|
|
||||||
|
cell *right_of(cell *c, const cellfunction& cf) {
|
||||||
|
int pid = parent_id(c, -1, cf);
|
||||||
|
if(pid == -1) return c;
|
||||||
|
if(VALENCE == 3) return c->cmodmove(pid-1);
|
||||||
|
else return (cellwalker(c, pid) + wstep + 1).cpeek();
|
||||||
|
}
|
||||||
|
|
||||||
|
cell *child_number(cell *c, int id, const cellfunction& cf) {
|
||||||
|
int pid = parent_id(c, 1, cf);
|
||||||
|
if(pid == -1) return c->cmove(id);
|
||||||
|
return c->cmodmove(pid + (VALENCE == 3 ? 2 : 1) + id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool viewdists = false, use_color_codes = true, use_analyzer = true, show_distance_lists = true;
|
bool viewdists = false, use_color_codes = true, use_analyzer = true, show_distance_lists = true;
|
||||||
|
|
||||||
int first_distance = 0, scrolltime = 0;
|
int first_distance = 0, scrolltime = 0;
|
||||||
@ -526,7 +589,7 @@ void viewdist_configure_dialog() {
|
|||||||
bool is_descendant(cell *c) {
|
bool is_descendant(cell *c) {
|
||||||
if(c == cwt.at) return true;
|
if(c == cwt.at) return true;
|
||||||
if(curr_dist(c) < curr_dist(cwt.at)) return false;
|
if(curr_dist(c) < curr_dist(cwt.at)) return false;
|
||||||
return is_descendant(chosenDown(c, -1, 0, curr_dist));
|
return is_descendant(ts::right_parent(c, curr_dist));
|
||||||
}
|
}
|
||||||
|
|
||||||
const int scrollspeed = 100;
|
const int scrollspeed = 100;
|
||||||
@ -763,9 +826,7 @@ bool in_segment(cell *left, cell *mid, cell *right) {
|
|||||||
while(true) {
|
while(true) {
|
||||||
if(mid == left) return true;
|
if(mid == left) return true;
|
||||||
if(left == right) return false;
|
if(left == right) return false;
|
||||||
int v = chosenDownId(left, 1, celldist);
|
left = ts::right_of(left, celldist);
|
||||||
if(S3 == 3) left = (cellwalker(left, v) + 1).cpeek();
|
|
||||||
else left = (cellwalker(left, v) + wstep - 1).cpeek();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -775,7 +836,7 @@ int sibling_distance(cell *a, cell *b, int limit) {
|
|||||||
if(a == b) return counting;
|
if(a == b) return counting;
|
||||||
if(limit == 0) return INF;
|
if(limit == 0) return INF;
|
||||||
counting++; limit--;
|
counting++; limit--;
|
||||||
a = chosenDown(a, 1, 1, celldist);
|
a = ts::right_of(a, celldist);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -828,18 +889,20 @@ int hyperbolic_celldistance(cell *c1, cell *c2) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(d >= found_distance) {
|
if(d >= found_distance) {
|
||||||
if(sl_used == sibling_limit) { printf("sibling_limit used: %d\n", sibling_limit); sibling_limit++; }
|
if(sl_used == sibling_limit && IRREGULAR) {
|
||||||
|
printf("sibling_limit used: %d\n", sibling_limit); sibling_limit++;
|
||||||
|
}
|
||||||
return found_distance;
|
return found_distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(d1 >= d2) {
|
if(d1 >= d2) {
|
||||||
cl1 = chosenDown(cl1, -1, 0, celldist);
|
cl1 = ts::left_parent(cl1, celldist);
|
||||||
cr1 = chosenDown(cr1, 1, 0, celldist);
|
cr1 = ts::right_parent(cr1, celldist);
|
||||||
d++; d1--;
|
d++; d1--;
|
||||||
}
|
}
|
||||||
if(d1 < d2) {
|
if(d1 < d2) {
|
||||||
cl2 = chosenDown(cl2, -1, 0, celldist);
|
cl2 = ts::left_parent(cl2, celldist);
|
||||||
cr2 = chosenDown(cr2, 1, 0, celldist);
|
cr2 = ts::right_parent(cr2, celldist);
|
||||||
d++; d2--;
|
d++; d2--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2424,11 +2424,11 @@ transmatrix applyPatterndir(cell *c, const patterns::patterninfo& si) {
|
|||||||
return V * iddspin(c, 0, M_PI);
|
return V * iddspin(c, 0, M_PI);
|
||||||
}
|
}
|
||||||
|
|
||||||
transmatrix applyDowndir(cell *c, cellfunction *cf) {
|
transmatrix applyDowndir(cell *c, const cellfunction& cf) {
|
||||||
return ddspin(c, patterns::downdir(c, cf), M_PI);
|
return ddspin(c, patterns::downdir(c, cf), M_PI);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_towerfloor(cell *c, cellfunction *cf = coastvalEdge) {
|
void set_towerfloor(cell *c, const cellfunction& cf = coastvalEdge) {
|
||||||
if(weirdhyperbolic || sphere) {
|
if(weirdhyperbolic || sphere) {
|
||||||
set_floor(shFloor);
|
set_floor(shFloor);
|
||||||
return;
|
return;
|
||||||
@ -2436,7 +2436,7 @@ void set_towerfloor(cell *c, cellfunction *cf = coastvalEdge) {
|
|||||||
int j = -1;
|
int j = -1;
|
||||||
|
|
||||||
if(masterless) j = 10;
|
if(masterless) j = 10;
|
||||||
else if((*cf)(c) > 1) {
|
else if(cf(c) > 1) {
|
||||||
int i = towerval(c, cf);
|
int i = towerval(c, cf);
|
||||||
if(i == 4) j = 0;
|
if(i == 4) j = 0;
|
||||||
if(i == 5) j = 1;
|
if(i == 5) j = 1;
|
||||||
@ -4007,7 +4007,8 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
|
|||||||
// queuepoly(Vf, shLeafFloor[ct6], darkena(fcol, fd, 0xFF));
|
// queuepoly(Vf, shLeafFloor[ct6], darkena(fcol, fd, 0xFF));
|
||||||
|
|
||||||
/* else if(c->land == laPrairie && prairie::isriver(c))
|
/* else if(c->land == laPrairie && prairie::isriver(c))
|
||||||
set_towerfloor(Vf, c, darkena(fcol, fd, 0xFF),
|
|
||||||
|
set_towerfloor(Vf, c, darkena(fcol, fd, 0xFF),
|
||||||
prairie::isleft(c) ? river::towerleft : river::towerright); */
|
prairie::isleft(c) ? river::towerleft : river::towerright); */
|
||||||
|
|
||||||
else switch(c->land) {
|
else switch(c->land) {
|
||||||
|
30
hyper.h
30
hyper.h
@ -518,6 +518,7 @@ struct heptagon {
|
|||||||
heptagon () { heptacount++; }
|
heptagon () { heptacount++; }
|
||||||
~heptagon () { heptacount--; }
|
~heptagon () { heptacount--; }
|
||||||
heptagon *cmove(int d) { return createStep(this, d); }
|
heptagon *cmove(int d) { return createStep(this, d); }
|
||||||
|
heptagon *cmodmove(int d) { return createStep(this, c.fix(d)); }
|
||||||
inline int degree();
|
inline int degree();
|
||||||
|
|
||||||
// prevent accidental copying
|
// prevent accidental copying
|
||||||
@ -541,6 +542,7 @@ struct cell : gcell {
|
|||||||
cell*& move(int d) { return c.move(d); }
|
cell*& move(int d) { return c.move(d); }
|
||||||
cell*& modmove(int d) { return c.modmove(d); }
|
cell*& modmove(int d) { return c.modmove(d); }
|
||||||
cell* cmove(int d) { return createMov(this, d); }
|
cell* cmove(int d) { return createMov(this, d); }
|
||||||
|
cell* cmodmove(int d) { return createMov(this, c.fix(d)); }
|
||||||
cell() {}
|
cell() {}
|
||||||
|
|
||||||
// prevent accidental copying
|
// prevent accidental copying
|
||||||
@ -643,8 +645,6 @@ int numplayers();
|
|||||||
void removeIvy(cell *c);
|
void removeIvy(cell *c);
|
||||||
bool cellEdgeUnstable(cell *c, flagtype flags = 0);
|
bool cellEdgeUnstable(cell *c, flagtype flags = 0);
|
||||||
int coastvalEdge(cell *c);
|
int coastvalEdge(cell *c);
|
||||||
typedef int cellfunction(cell*);
|
|
||||||
int towerval(cell *c, cellfunction* cf = &coastvalEdge);
|
|
||||||
#define HRANDMAX 0x7FFFFFFF
|
#define HRANDMAX 0x7FFFFFFF
|
||||||
int hrandpos(); // 0 to HRANDMAX
|
int hrandpos(); // 0 to HRANDMAX
|
||||||
|
|
||||||
@ -1064,6 +1064,8 @@ extern string mouseovers;
|
|||||||
|
|
||||||
extern struct SDL_Surface *s;
|
extern struct SDL_Surface *s;
|
||||||
|
|
||||||
|
typedef function<int(cell*)> cellfunction;
|
||||||
|
|
||||||
namespace patterns {
|
namespace patterns {
|
||||||
extern char whichShape;
|
extern char whichShape;
|
||||||
extern int canvasback;
|
extern int canvasback;
|
||||||
@ -1128,7 +1130,7 @@ namespace patterns {
|
|||||||
void showPattern();
|
void showPattern();
|
||||||
void val38(cell *c, patterninfo &si, int sub, int pat);
|
void val38(cell *c, patterninfo &si, int sub, int pat);
|
||||||
|
|
||||||
int downdir(cell *c, cellfunction *cf = coastvalEdge);
|
int downdir(cell *c, const cellfunction& cf = coastvalEdge);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace mapeditor {
|
namespace mapeditor {
|
||||||
@ -1372,7 +1374,6 @@ extern bool buggyGeneration;
|
|||||||
int buildIvy(cell *c, int children, int minleaf);
|
int buildIvy(cell *c, int children, int minleaf);
|
||||||
int celldistAltRelative(cell *c);
|
int celldistAltRelative(cell *c);
|
||||||
int roundTableRadius(cell *c);
|
int roundTableRadius(cell *c);
|
||||||
cell *chosenDown(cell *c, int which, int bonus, cellfunction* cf = &coastvalEdge);
|
|
||||||
eLand pickLandRPM(eLand old);
|
eLand pickLandRPM(eLand old);
|
||||||
bool bearsCamelot(eLand l);
|
bool bearsCamelot(eLand l);
|
||||||
|
|
||||||
@ -4203,7 +4204,26 @@ struct expansion_analyzer {
|
|||||||
|
|
||||||
extern expansion_analyzer expansion;
|
extern expansion_analyzer expansion;
|
||||||
|
|
||||||
int chosenDownId(cell *c, int which, cellfunction* cf);
|
int towerval(cell *c, const cellfunction& cf);
|
||||||
|
|
||||||
|
int parent_id(cell *c, int which, const cellfunction& cf);
|
||||||
|
|
||||||
|
extern int sibling_limit;
|
||||||
|
extern void set_sibling_limit();
|
||||||
|
int type_in_reduced(expansion_analyzer& ea, cell *c, const function<int(cell*)>& f);
|
||||||
|
|
||||||
|
namespace ts {
|
||||||
|
cell *verified_add(cell *c, int which, int bonus, const cellfunction& cf);
|
||||||
|
cell *add(cell *c, int which, int bonus, const cellfunction& cf);
|
||||||
|
|
||||||
|
inline cell *left_parent(cell *c, const cellfunction& cf) { return verified_add(c, 1, 0, cf); }
|
||||||
|
inline cell *right_parent(cell *c, const cellfunction& cf) { return verified_add(c, -1, 0, cf); }
|
||||||
|
cell *left_of(cell *c, const cellfunction& cf);
|
||||||
|
cell *right_of(cell *c, const cellfunction& cf);
|
||||||
|
cell *child_number(cell *c, int id, const cellfunction& cf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void generate_around(cell *c);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
14
pattern2.cpp
14
pattern2.cpp
@ -543,10 +543,8 @@ namespace patterns {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int downdir(cell *c, cellfunction *cf) {
|
int downdir(cell *c, const cellfunction& cf) {
|
||||||
cell *c2 = chosenDown(c, 1, 1, cf);
|
return parent_id(c, 1, cf) + 1;
|
||||||
if(!c2) return 0;
|
|
||||||
return neighborId(c, c2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void applySym0123(int& i, int sub) {
|
void applySym0123(int& i, int sub) {
|
||||||
@ -1025,8 +1023,8 @@ namespace patterns {
|
|||||||
}
|
}
|
||||||
|
|
||||||
else if(pat == PAT_DOWN) {
|
else if(pat == PAT_DOWN) {
|
||||||
si.id = towerval(c);
|
si.id = towerval(c, coastvalEdge);
|
||||||
si.dir = downdir(c);
|
si.dir = downdir(c, coastvalEdge);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(pat == PAT_FIELD) {
|
else if(pat == PAT_FIELD) {
|
||||||
@ -2082,14 +2080,14 @@ namespace linepatterns {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case patTriTree: {
|
case patTriTree: {
|
||||||
cell *parent = chosenDown(c, -1, 0, curr_dist);
|
cell *parent = ts::right_parent(c, curr_dist);
|
||||||
if(gmatrix.count(parent))
|
if(gmatrix.count(parent))
|
||||||
queuelinef(tC0(V), gmatrix[parent]*C0, col, 2 + vid.linequality);
|
queuelinef(tC0(V), gmatrix[parent]*C0, col, 2 + vid.linequality);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case patTriOther: {
|
case patTriOther: {
|
||||||
cell *parent = chosenDown(c, -1, 0, curr_dist);
|
cell *parent = ts::right_parent(c, curr_dist);
|
||||||
forCellEx(c2, c) if(gmatrix.count(c2) && curr_dist(c2) < curr_dist(c) && c2 != parent)
|
forCellEx(c2, c) if(gmatrix.count(c2) && curr_dist(c2) < curr_dist(c) && c2 != parent)
|
||||||
queuelinef(tC0(V), gmatrix[c2]*C0, col, 2 + vid.linequality);
|
queuelinef(tC0(V), gmatrix[c2]*C0, col, 2 + vid.linequality);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user