summary refs log tree commit diff homepage
diff options
context:
space:
mode:
-rw-r--r--play.c71
1 files changed, 46 insertions, 25 deletions
diff --git a/play.c b/play.c
index 3814d0f..2d8c462 100644
--- a/play.c
+++ b/play.c
@@ -94,31 +94,35 @@ static void curse(void) {
 }
 
 enum {
-	ScoresTop = 15,
+	RankWidth = 4,
+	ScoreWidth = 10,
+	NameWidth = 31,
+	DateWidth = 10,
+	ScoresWidth = RankWidth + 2 + ScoreWidth + 2 + NameWidth + 2 + DateWidth,
 	ScoresY = 0,
 	ScoresX = 2,
-	ScoreX = ScoresX + 5,
-	NameX = ScoreX + 12,
-	DateX = NameX + 33,
-	ScoresWidth = DateX + 11 - ScoresX,
+	NameX = ScoresX + RankWidth + 2 + ScoreWidth + 2,
+	ScoresTop = 15,
 };
 static const char ScoresTitle[] = "TOP SCORES";
 
-static void drawScore(int y, size_t i) {
-	char buf[11];
-	snprintf(buf, sizeof(buf), "%3zu.", 1 + i);
-	mvaddstr(y, ScoresX, buf);
-
-	snprintf(buf, sizeof(buf), "%10d", scores[i].score);
-	mvaddstr(y, ScoreX, buf);
-
-	mvaddstr(y, NameX, scores[i].name);
-
+static const char *formatScore(size_t i) {
 	struct tm *time = localtime(&scores[i].date);
 	if (!time) err(EX_SOFTWARE, "localtime");
-	char date[sizeof("YYYY-MM-DD")];
+
+	char date[DateWidth + 1];
 	strftime(date, sizeof(date), "%F", time);
-	mvaddstr(y, DateX, date);
+
+	static char buf[ScoresWidth + 1];
+	snprintf(
+		buf, sizeof(buf),
+		"%*zu. %*u  %-*s  %*s",
+		RankWidth, 1 + i,
+		ScoreWidth, scores[i].score,
+		NameWidth, scores[i].name,
+		DateWidth, date
+	);
+	return buf;
 }
 
 static void draw(size_t new) {
@@ -133,32 +137,49 @@ static void draw(size_t new) {
 		if (!scores[i].score) break;
 		if (i == new) newY = ScoresY + 2 + i;
 		attr_set(i == new ? A_BOLD : A_NORMAL, 0, NULL);
-		drawScore(ScoresY + 2 + i, i);
+		mvaddstr(ScoresY + 2 + i, ScoresX, formatScore(i));
 	}
 	if (new == ScoresLen) return;
 
 	if (new >= ScoresTop) {
 		newY = ScoresY + ScoresTop + 5;
 		mvhline(newY - 3, ScoresX, '=', ScoresWidth);
-		drawScore(newY - 2, new - 2);
-		drawScore(newY - 1, new - 1);
+		mvaddstr(newY - 2, ScoresX, formatScore(new - 2));
+		mvaddstr(newY - 1, ScoresX, formatScore(new - 1));
 		attr_set(A_BOLD, 0, NULL);
-		drawScore(newY, new);
+		mvaddstr(newY, ScoresX, formatScore(new));
 		attr_set(A_NORMAL, 0, NULL);
 		if (new + 1 < ScoresLen && scores[new + 1].score) {
-			drawScore(newY + 1, new + 1);
+			mvaddstr(newY + 1, ScoresX, formatScore(new + 1));
 		}
 		if (new + 2 < ScoresLen && scores[new + 2].score) {
-			drawScore(newY + 2, new + 2);
+			mvaddstr(newY + 2, ScoresX, formatScore(new + 2));
 		}
 	}
 	move(newY, NameX);
 }
 
-int main(void) {
-	curse();
+int main(int argc, char *argv[]) {
 	FILE *file = scoresOpen("2048.scores");
 
+	if (argc > 1 && !strcmp(argv[1], "-t")) {
+		scoresRead(file);
+		printf(
+			"%*s\n",
+			ScoresWidth / 2 + (int)(sizeof(ScoresTitle) + 2) / 2,
+			ScoresTitle
+		);
+		for (uint i = 0; i < ScoresWidth; ++i) putchar('=');
+		putchar('\n');
+		for (size_t i = 0; i < ScoresLen; ++i) {
+			if (!scores[i].score) break;
+			printf("%s\n", formatScore(i));
+		}
+		return EX_OK;
+	}
+
+	curse();
+
 #ifdef __FreeBSD__
 	int error = cap_enter();
 	if (error) err(EX_OSERR, "cap_enter");