1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-08-06 05:43:56 +00:00

rewritten scores.cpp more elegantly using lambdas

This commit is contained in:
Zeno Rogue 2018-02-01 03:07:01 +01:00
parent 996c6cf5f7
commit 84980e55fc

View File

@ -5,26 +5,16 @@ namespace scores {
vector<score> scores; vector<score> scores;
score *currentgame; score *currentgame;
int scoresort = 2;
int scoredisplay = 1;
int scorefrom = 0; int scorefrom = 0;
bool scorerev = false; bool scorerev = false;
bool scorecompare(const score& s1, const score &s2) {
return s1.box[scoresort] > s2.box[scoresort];
}
bool fakescore() {
return fakebox[scoredisplay];
}
string csub(const string& str, int q) { string csub(const string& str, int q) {
int i = 0; int i = 0;
for(int j=0; j<q && i<size(str); j++) getnext(str.c_str(), i); for(int j=0; j<q && i<size(str); j++) getnext(str.c_str(), i);
return str.substr(0, i); return str.substr(0, i);
} }
int colwidth() { int colwidth(int scoredisplay) {
if(scoredisplay == 0) return 5; if(scoredisplay == 0) return 5;
if(scoredisplay == 1) return 16; if(scoredisplay == 1) return 16;
if(scoredisplay == 5) return 8; if(scoredisplay == 5) return 8;
@ -70,7 +60,7 @@ string modedesc(score *S) {
return s; return s;
} }
string displayfor(score* S, bool shorten = false) { string displayfor(int scoredisplay, score* S, bool shorten = false) {
// printf("S=%p, scoredisplay = %d\n", S, scoredisplay); // printf("S=%p, scoredisplay = %d\n", S, scoredisplay);
if(S == NULL) { if(S == NULL) {
if(scoredisplay == POSSCORE) return "mode"; if(scoredisplay == POSSCORE) return "mode";
@ -106,15 +96,6 @@ string displayfor(score* S, bool shorten = false) {
vector<pair<string, int> > pickscore_options; vector<pair<string, int> > pickscore_options;
void sortScores() {
if(scorerev) reverse(scores.begin(), scores.end());
else {
scorerev = true;
scoresort = scoredisplay;
stable_sort(scores.begin(), scores.end(), scorecompare);
}
}
int curcol; int curcol;
vector<int> columns; vector<int> columns;
@ -123,16 +104,14 @@ bool monsterpage = false;
void showPickScores() { void showPickScores() {
int d = scoredisplay = columns[curcol];
pickscore_options.clear(); pickscore_options.clear();
scorerev = false; scorerev = false;
for(int i=0; i<=POSSCORE; i++) { for(int i=0; i<=POSSCORE; i++) {
scoredisplay = i; int scoredisplay = i;
if(!fakescore()) { if(!fakebox[scoredisplay]) {
string s = displayfor(NULL); string s = displayfor(scoredisplay, NULL);
if(dialog::hasInfix(s)) if(dialog::hasInfix(s))
if(monsbox[scoredisplay] == monsterpage) if(monsbox[scoredisplay] == monsterpage)
pickscore_options.push_back(make_pair(s, i)); pickscore_options.push_back(make_pair(s, i));
@ -148,23 +127,21 @@ void showPickScores() {
int x = 16 + (vid.xres * (i/percolumn)) / qcolumns; int x = 16 + (vid.xres * (i/percolumn)) / qcolumns;
int y = (vid.fsize+3) * (i % percolumn) + vid.fsize*2; int y = (vid.fsize+3) * (i % percolumn) + vid.fsize*2;
scoredisplay = pickscore_options[i].second; int scoredisplay = pickscore_options[i].second;
if(q <= 9) if(q <= 9)
pickscore_options[i].first = pickscore_options[i].first + " [" + its(i+1) + "]"; pickscore_options[i].first = pickscore_options[i].first + " [" + its(i+1) + "]";
if(!fakescore()) if(!fakebox[scoredisplay])
displayButton(x, y, pickscore_options[i].first, 1000+i, 0); displayButton(x, y, pickscore_options[i].first, 1000+i, 0);
} }
displayButton(vid.xres/2, vid.yres - vid.fsize*2, "kills", '/', 8); displayButton(vid.xres/2, vid.yres - vid.fsize*2, "kills", '/', 8);
scoredisplay = d;
mouseovers = dialog::infix; mouseovers = dialog::infix;
keyhandler = [] (int sym, int uni) { keyhandler = [] (int sym, int uni) {
if(uni == '/' && dialog::infix == "") monsterpage = !monsterpage; else if(uni == '/' && dialog::infix == "") monsterpage = !monsterpage; else
if(uni >= '1' && uni <= '9') uni = uni + 1000 - '1'; if(uni >= '1' && uni <= '9') uni = uni + 1000 - '1';
else if(uni >= 1000 && uni < 1000 + size(pickscore_options)) { else if(uni >= 1000 && uni < 1000 + size(pickscore_options)) {
scoredisplay = pickscore_options[uni - 1000].second; int scoredisplay = pickscore_options[uni - 1000].second;
for(int i=0; i<=POSSCORE; i++) for(int i=0; i<=POSSCORE; i++)
if(columns[i] == scoredisplay) swap(columns[i], columns[curcol]); if(columns[i] == scoredisplay) swap(columns[i], columns[curcol]);
popScreen(); popScreen();
@ -189,11 +166,11 @@ void show() {
int at = 9; int at = 9;
for(int i=0; i<=POSSCORE; i++) { for(int i=0; i<=POSSCORE; i++) {
scoredisplay = columns[i]; int c = columns[i];
if(bx*at > vid.xres) break; if(bx*at > vid.xres) break;
if(displaystr(bx*at, vid.fsize, 0, vid.fsize, displayfor(NULL, true), i == curcol ? 0xFFD500 : forecolor, 0)) if(displaystr(bx*at, vid.fsize, 0, vid.fsize, displayfor(c, NULL, true), i == curcol ? 0xFFD500 : forecolor, 0))
getcstat = 1000+i; getcstat = 1000+i;
at += colwidth(); at += colwidth(c);
} }
if(scorefrom < 0) scorefrom = 0; if(scorefrom < 0) scorefrom = 0;
@ -223,10 +200,10 @@ void show() {
int at = 9; int at = 9;
for(int i=0; i<=POSSCORE; i++) { for(int i=0; i<=POSSCORE; i++) {
scoredisplay = columns[i]; int c = columns[i];
if(bx*at > vid.xres) break; if(bx*at > vid.xres) break;
at += colwidth(); at += colwidth(c);
if(displaystr(bx*(at-1), y, 0, vid.fsize, displayfor(&S), col, 16)) if(displaystr(bx*(at-1), y, 0, vid.fsize, displayfor(c, &S), col, 16))
getcstat = 1000+i; getcstat = 1000+i;
} }
@ -242,13 +219,17 @@ void show() {
keyhandler = [] (int sym, int uni) { keyhandler = [] (int sym, int uni) {
if(sym == SDLK_LEFT || sym == SDLK_KP4 || sym == 'h' || sym == 'a') { if(sym == SDLK_LEFT || sym == SDLK_KP4 || sym == 'h' || sym == 'a') {
scorerev = false;
if(curcol > 0) curcol--; if(curcol > 0) curcol--;
} }
else if(sym == SDLK_RIGHT || sym == SDLK_KP6 || sym == 'l' || sym == 'd') { else if(sym == SDLK_RIGHT || sym == SDLK_KP6 || sym == 'l' || sym == 'd') {
scorerev = false;
if(curcol < POSSCORE) curcol++; if(curcol < POSSCORE) curcol++;
} }
else if(sym >= 1000 && sym <= 1000+POSSCORE) else if(sym >= 1000 && sym <= 1000+POSSCORE) {
scorerev = false;
curcol = sym - 1000; curcol = sym - 1000;
}
else if(sym == 't') { dialog::infix = ""; pushScreen(showPickScores); } else if(sym == 't') { dialog::infix = ""; pushScreen(showPickScores); }
else if(sym == SDLK_UP || sym == 'k' || sym == 'w') else if(sym == SDLK_UP || sym == 'k' || sym == 'w')
scorefrom -= 5; scorefrom -= 5;
@ -258,7 +239,15 @@ void show() {
scorefrom--; scorefrom--;
else if(sym == PSEUDOKEY_WHEELDOWN) else if(sym == PSEUDOKEY_WHEELDOWN)
scorefrom++; scorefrom++;
else if(sym == 's') sortScores(); else if(sym == 's') {
if(scorerev) reverse(scores.begin(), scores.end());
else {
scorerev = true;
stable_sort(scores.begin(), scores.end(), [] (const score& s1, const score &s2) {
return s1.box[columns[curcol]] > s2.box[columns[curcol]];
});
}
}
else if(doexiton(sym, uni)) popScreen(); else if(doexiton(sym, uni)) popScreen();
static int scoredragy; static int scoredragy;
@ -337,8 +326,9 @@ void load() {
boxid = 0; applyBoxes(); boxid = 0; applyBoxes();
reverse(scores.begin(), scores.end()); reverse(scores.begin(), scores.end());
scorefrom = 0; scorefrom = 0;
scoresort = 2; stable_sort(scores.begin(), scores.end(), scorecompare); stable_sort(scores.begin(), scores.end(), [] (const score& s1, const score& s2) {
scoresort = POSSCORE; stable_sort(scores.begin(), scores.end(), scorecompare); return tie(s1.box[POSSCORE], s1.box[2]) > tie(s2.box[POSSCORE], s2.box[2]);
});
} }
} }