/* * Hack -- read a string */ static void rd_string(char *str, int max) { int i; /* Read the string */ for (i = 0; TRUE; i++) { byte tmp8u; /* Read a byte */ rd_byte(&tmp8u); /* Collect string while legal */ if (i < max) str[i] = tmp8u; /* End of string */ if (!tmp8u) break; } /* Terminate */ str[max-1] = '\0'; #ifdef JP /* Convert Kanji code */ switch (kanji_code) { #ifdef SJIS case 2: /* EUC to SJIS */ euc2sjis(str); break; #endif #ifdef EUC case 3: /* SJIS to EUC */ sjis2euc(str); break; #endif case 0: { /* 不明の漢字コードからシステムの漢字コードに変換 */ byte code = codeconv(str); /* 漢字コードが判明したら、それを記録 */ if (code) kanji_code = code; break; } default: /* No conversion needed */ break; } #endif }
/* * Display the scores in a given range. * Assumes the high score list is already open. * Only five entries per line, too much info. * * Mega-Hack -- allow "fake" entry at the given position. */ void display_scores_aux(int from, int to, int note, high_score *score) { int i, j, k, n, place; byte attr; high_score the_score; char out_val[256]; char tmp_val[160]; int wid, hgt, per_screen; Term_get_size(&wid, &hgt); per_screen = (hgt - 4) / 4; /* Paranoia -- it may not have opened */ if (highscore_fd < 0) return; /* Assume we will show the first 10 */ if (from < 0) from = 0; if (to < 0) to = 10; if (to > MAX_HISCORES) to = MAX_HISCORES; /* Seek to the beginning */ if (highscore_seek(0)) return; /* Hack -- Count the high scores */ for (i = 0; i < MAX_HISCORES; i++) { if (highscore_read(&the_score)) break; } /* Hack -- allow "fake" entry to be last */ if ((note == i) && score) i++; /* Forget about the last entries */ if (i > to) i = to; /* Show per_screen per page, until "done" */ for (k = from, place = k+1; k < i; k += per_screen) { /* Clear screen */ Term_clear(); /* Title */ #ifdef JP put_str(" 変愚蛮怒: 勇者の殿堂", 0, 0); #else put_str(" Chengband Hall of Fame", 0, 0); #endif /* Indicate non-top scores */ if (k > 0) { #ifdef JP sprintf(tmp_val, "( %d 位以下 )", k + 1); #else sprintf(tmp_val, "(from position %d)", k + 1); #endif put_str(tmp_val, 0, 40); } /* Dump per_screen entries */ for (j = k, n = 0; j < i && n < per_screen; place++, j++, n++) { int pr, pc, pa, clev, mlev, cdun, mdun; cptr user, gold, when, aged; /* Hack -- indicate death in yellow */ attr = (j == note) ? TERM_YELLOW : TERM_WHITE; /* Mega-Hack -- insert a "fake" record */ if ((note == j) && score) { the_score = (*score); attr = TERM_L_GREEN; score = NULL; note = -1; j--; } /* Read a normal record */ else { /* Read the proper record */ if (highscore_seek(j)) break; if (highscore_read(&the_score)) break; } /* Extract the race/class */ pr = atoi(the_score.p_r); pc = atoi(the_score.p_c); pa = atoi(the_score.p_a); /* Extract the level info */ clev = atoi(the_score.cur_lev); mlev = atoi(the_score.max_lev); cdun = atoi(the_score.cur_dun); mdun = atoi(the_score.max_dun); /* Hack -- extract the gold and such */ for (user = the_score.uid; isspace(*user); user++) /* loop */; for (when = the_score.day; isspace(*when); when++) /* loop */; for (gold = the_score.gold; isspace(*gold); gold++) /* loop */; for (aged = the_score.turns; isspace(*aged); aged++) /* loop */; /* Clean up standard encoded form of "when" */ if ((*when == '@') && strlen(when) == 9) { sprintf(tmp_val, "%.4s-%.2s-%.2s", when + 1, when + 5, when + 7); when = tmp_val; } /* Dump some info */ sprintf(out_val, "%3d.%9s %s %s the %s %s, Level %d", place, the_score.pts, seikaku_info[pa].title, the_score.who, get_race_t_aux(pr, 0)->name, class_info[pc].title, clev); /* Append a "maximum level" */ #ifdef JP if (mlev > clev) strcat(out_val, format(" (最高%d)", mlev)); #else if (mlev > clev) strcat(out_val, format(" (Max %d)", mlev)); #endif /* Dump the first line */ c_put_str(attr, out_val, n*4 + 2, 0); /* Another line of info */ #ifdef JP if (mdun != 0) sprintf(out_val, " 最高%3d階", mdun); else sprintf(out_val, " "); /* 死亡原因をオリジナルより細かく表示 */ if (streq(the_score.how, "yet")) { sprintf(out_val+13, " まだ生きている (%d%s)", cdun, "階"); } else if (streq(the_score.how, "ripe")) { sprintf(out_val+13, " 勝利の後に引退 (%d%s)", cdun, "階"); } else if (streq(the_score.how, "Seppuku")) { sprintf(out_val+13, " 勝利の後に切腹 (%d%s)", cdun, "階"); } else { codeconv(the_score.how); /* Some people die outside of the dungeon */ if (!cdun) sprintf(out_val+13, " 地上で%sに殺された", the_score.how); else sprintf(out_val+13, " %d階で%sに殺された", cdun, the_score.how); } #else /* Some people die outside of the dungeon */ if (!cdun) sprintf(out_val, " Killed by %s on the surface", the_score.how); else sprintf(out_val, " Killed by %s on %s %d", the_score.how, "Dungeon Level", cdun); /* Append a "maximum level" */ if (mdun > cdun) strcat(out_val, format(" (Max %d)", mdun)); #endif /* Dump the info */ c_put_str(attr, out_val, n*4 + 3, 0); /* And still another line of info */ #ifdef JP { char buf[11]; /* 日付を 19yy/mm/dd の形式に変更する */ if (strlen(when) == 8 && when[2] == '/' && when[5] == '/') { sprintf(buf, "%d%s/%.5s", 19 + (when[6] < '8'), when + 6, when); when = buf; } sprintf(out_val, " (ユーザー:%s, 日付:%s, 所持金:%s, ターン:%s)", user, when, gold, aged); } #else sprintf(out_val, " (User %s, Date %s, Gold %s, Turn %s).", user, when, gold, aged); #endif c_put_str(attr, out_val, n*4 + 4, 0); } /* Wait for response */ #ifdef JP prt("[ ESCで中断, その他のキーで続けます ]", hgt - 1, 21); #else prt("[Press ESC to quit, any other key to continue.]", hgt - 1, 17); #endif j = inkey(); prt("", hgt - 1, 0); /* Hack -- notice Escape */ if (j == ESCAPE) break; } }