mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-01-12 18:30:34 +00:00
save the YASC messages in save file, and display them in score list; also auto-width and zoom
This commit is contained in:
parent
55493cc364
commit
00b5fe3a22
@ -439,6 +439,7 @@ EX void checkmove() {
|
||||
achievement_final(true);
|
||||
if(cmode & sm::NORMAL) showMissionScreen();
|
||||
}
|
||||
else yasc_message = "";
|
||||
|
||||
if(canmove && timerstopped) {
|
||||
timerstart = time(NULL);
|
||||
|
77
scores.cpp
77
scores.cpp
@ -22,12 +22,16 @@ string csub(const string& str, int q) {
|
||||
return str.substr(0, i);
|
||||
}
|
||||
|
||||
vector<int> column_width(POSSCORE+1, 4);
|
||||
|
||||
int colwidth(int scoredisplay) {
|
||||
if(scoredisplay == 0) return 5;
|
||||
return column_width[scoredisplay];
|
||||
/* if(scoredisplay == 0) return 5;
|
||||
if(scoredisplay == 1) return 16;
|
||||
if(scoredisplay == 5) return 8;
|
||||
if(scoredisplay == POSSCORE) return 8;
|
||||
return 4;
|
||||
if(scoredisplay == 68) return yasc_width;
|
||||
return 4; */
|
||||
}
|
||||
|
||||
bool isHardcore(score *S) {
|
||||
@ -91,6 +95,7 @@ string displayfor(int scoredisplay, score* S, bool shorten = false) {
|
||||
if(scoredisplay == 67) return XLAT("cheats");
|
||||
if(scoredisplay == 66) return XLAT("saves");
|
||||
if(scoredisplay == 197) return XLAT("players");
|
||||
if(scoredisplay == 68) return XLAT("where");
|
||||
return csub(str, 5);
|
||||
}
|
||||
if(scoredisplay == 0 || scoredisplay == 65) {
|
||||
@ -103,6 +108,7 @@ string displayfor(int scoredisplay, score* S, bool shorten = false) {
|
||||
return buf;
|
||||
}
|
||||
if(scoredisplay == POSSCORE) return modedesc(S);
|
||||
if(scoredisplay == 68) return S->yasc_message + XLAT(" in %the1", eLand(S->box[68]));
|
||||
if(scoredisplay == 1) {
|
||||
time_t tim = S->box[1];
|
||||
char buf[128]; strftime(buf, 128, "%c", localtime(&tim));
|
||||
@ -162,27 +168,39 @@ void showPickScores() {
|
||||
};
|
||||
}
|
||||
|
||||
int scale = 2;
|
||||
|
||||
void show() {
|
||||
|
||||
if(columns.size() == 0) {
|
||||
columns.push_back(POSSCORE);
|
||||
for(int i=0; i<POSSCORE; i++) columns.push_back(i);
|
||||
for(int i=0; i<POSSCORE; i++) {
|
||||
if(i == 5) columns.push_back(68);
|
||||
else if(i == 68) columns.push_back(5);
|
||||
else columns.push_back(i);
|
||||
}
|
||||
}
|
||||
int y = vid.fsize * 5/2;
|
||||
int bx = vid.fsize;
|
||||
int score_size = vid.fsize / scale;
|
||||
int y = score_size * 5/2;
|
||||
int bx = score_size;
|
||||
getcstat = 0;
|
||||
|
||||
displaystr(bx*4, vid.fsize, 0, vid.fsize, "#", forecolor, 16);
|
||||
displaystr(bx*8, vid.fsize, 0, vid.fsize, XLAT("ver"), forecolor, 16);
|
||||
displaystr(bx*4, score_size, 0, vid.fsize, "#", forecolor, 16);
|
||||
displaystr(bx*8, score_size, 0, vid.fsize, XLAT("ver"), forecolor, 16);
|
||||
|
||||
int at = 9;
|
||||
for(int i=0; i<=POSSCORE; i++) {
|
||||
int c = columns[i];
|
||||
if(bx*at > vid.xres) break;
|
||||
if(displaystr(bx*at, vid.fsize, 0, vid.fsize, displayfor(c, NULL, true), i == curcol ? 0xFFD500 : forecolor, 0))
|
||||
string s = displayfor(c, NULL, true);
|
||||
auto& cw = column_width[c];
|
||||
cw = max(cw, textwidth(score_size, s) / bx + 1);
|
||||
if(displaystr(bx*at, score_size, 0, score_size, s, i == curcol ? 0xFFD500 : forecolor, 0))
|
||||
getcstat = 1000+i;
|
||||
at += colwidth(c);
|
||||
}
|
||||
|
||||
vector<int> next_column_width(POSSCORE+1, 0);
|
||||
|
||||
if(scorefrom < 0) scorefrom = 0;
|
||||
int id = 0;
|
||||
@ -205,28 +223,40 @@ void show() {
|
||||
|
||||
|
||||
rank++;
|
||||
displaystr(bx*4, y, 0, vid.fsize, its(rank), col, 16);
|
||||
displaystr(bx*4, y, 0, score_size, its(rank), col, 16);
|
||||
|
||||
displaystr(bx*8, y, 0, vid.fsize, S.ver, col, 16);
|
||||
displaystr(bx*8, y, 0, score_size, S.ver, col, 16);
|
||||
|
||||
int at = 9;
|
||||
for(int i=0; i<=POSSCORE; i++) {
|
||||
int c = columns[i];
|
||||
if(bx*at > vid.xres) break;
|
||||
at += colwidth(c);
|
||||
if(displaystr(bx*(at-1), y, 0, vid.fsize, displayfor(c, &S), col, 16))
|
||||
getcstat = 1000+i;
|
||||
string s = displayfor(c, &S);
|
||||
auto& ncw = next_column_width[c];
|
||||
ncw = max(ncw, textwidth(score_size, s) / bx + 1);
|
||||
if(c == 68) {
|
||||
if(displaystr(bx*at, y, 0, score_size, s, col, 0))
|
||||
getcstat = 1000+i;
|
||||
at += colwidth(c);
|
||||
}
|
||||
else {
|
||||
at += colwidth(c);
|
||||
if(displaystr(bx*(at-1), y, 0, score_size, s, col, 16))
|
||||
getcstat = 1000+i;
|
||||
}
|
||||
}
|
||||
|
||||
y += vid.fsize*5/4; id++;
|
||||
y += score_size*5/4; id++;
|
||||
}
|
||||
|
||||
column_width = next_column_width;
|
||||
int i0 = vid.yres - vid.fsize;
|
||||
int xr = vid.xres / 80;
|
||||
|
||||
displayButton(xr*10, i0, IFM("s - ") + XLAT("sort"), 's', 8);
|
||||
displayButton(xr*30, i0, IFM("t - ") + XLAT("choose"), 't', 8);
|
||||
displayButton(xr*50, i0, IFM(dialog::keyname(SDLK_ESCAPE) + " - ") + XLAT("go back"), '0', 8);
|
||||
displayButton(xr*50, i0, IFM("z - ") + XLAT("zoom"), 'z', 8);
|
||||
displayButton(xr*70, i0, IFM(dialog::keyname(SDLK_ESCAPE) + " - ") + XLAT("go back"), '0', 8);
|
||||
|
||||
keyhandler = [] (int sym, int uni) {
|
||||
if(DKEY == SDLK_LEFT || uni == 'h' || uni == 'a') {
|
||||
@ -246,6 +276,7 @@ void show() {
|
||||
scorefrom -= 5;
|
||||
else if(DKEY == SDLK_DOWN || uni == 'j' || uni == 'x')
|
||||
scorefrom += 5;
|
||||
else if(uni == 'z') scale = 3 - scale;
|
||||
else if(sym == PSEUDOKEY_WHEELUP)
|
||||
scorefrom--;
|
||||
else if(sym == PSEUDOKEY_WHEELDOWN)
|
||||
@ -289,9 +320,11 @@ void load() {
|
||||
addMessage(s0 + "Could not open the score file: " + scorefile);
|
||||
return;
|
||||
}
|
||||
string *yasc = nullptr;
|
||||
while(!feof(f)) {
|
||||
char buf[120];
|
||||
if(fgets(buf, 120, f) == NULL) break;
|
||||
const int buflen = 1200;
|
||||
char buf[buflen];
|
||||
if(fgets(buf, buflen, f) == NULL) break;
|
||||
if(buf[0] == 'H' && buf[1] == 'y') {
|
||||
score sc; bool ok = true;
|
||||
sc.box[MAXBOX-1] = 0;
|
||||
@ -320,7 +353,14 @@ void load() {
|
||||
if(sc.box[2] == 0) continue; // do not list zero scores
|
||||
sc.box[POSSCORE] = modediff(&sc);
|
||||
|
||||
if(ok && boxid > 20) scores.push_back(sc);
|
||||
if(ok && boxid > 20) {
|
||||
scores.push_back(sc);
|
||||
yasc = &scores.back().yasc_message;
|
||||
}
|
||||
}
|
||||
if(buf[0] == 'Y' && buf[1] == 'A' && buf[2] == 'S' && buf[3] == 'C' && buf[4] == ' ') {
|
||||
for(int i=5; i<buflen; i++) if(buf[i] == '\n' || buf[i] == '\r') buf[i] = 0;
|
||||
*yasc = buf+5;
|
||||
}
|
||||
}
|
||||
|
||||
@ -329,6 +369,7 @@ void load() {
|
||||
for(int i=0; i<POSSCORE; i++) sc.box[i] = save.box[i];
|
||||
sc.box[POSSCORE] = 0;
|
||||
sc.box[MAXBOX-1] = 1; sc.ver = "NOW";
|
||||
sc.yasc_message = canmove ? "on the run" : yasc_message;
|
||||
scores.push_back(sc);
|
||||
|
||||
fclose(f);
|
||||
|
@ -451,6 +451,8 @@ struct score {
|
||||
string ver;
|
||||
/** \brief all the data of the saved score, see applyBoxes() */
|
||||
int box[MAXBOX];
|
||||
/** \brief yasc message */
|
||||
string yasc_message;
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -620,7 +622,7 @@ EX void applyBoxes() {
|
||||
if(saving) savecount--;
|
||||
applyBoxNum(cheater, "number of cheats");
|
||||
|
||||
fakebox[boxid] = true;
|
||||
fakebox[boxid] = false;
|
||||
if(saving) applyBoxSave(items[itOrbSafety] ? safetyland : cwt.at->land, "@safetyland");
|
||||
else if(loading) firstland = safetyland = eLand(applyBoxLoad("@safetyland"));
|
||||
else lostin = eLand(save.box[boxid++]);
|
||||
@ -1139,6 +1141,7 @@ EX void saveStats(bool emergency IS(false)) {
|
||||
anticheat::save(f);
|
||||
|
||||
fprintf(f, "\n");
|
||||
if(yasc_message != "") fprintf(f, "YASC %s\n", yasc_message.c_str());
|
||||
}
|
||||
fprintf(f, "Played on: %s - %s (%d %s)\n", sbuf, buf, turncount,
|
||||
shmup::on ? "knives" : "turns");
|
||||
|
Loading…
Reference in New Issue
Block a user