diff options
author | christos <christos@NetBSD.org> | 1999-05-15 23:56:35 +0000 |
---|---|---|
committer | christos <christos@NetBSD.org> | 1999-05-15 23:56:35 +0000 |
commit | 36e0b3e5fe951ef4265a0da56201960d52ed7ee6 (patch) | |
tree | 6b71e3215f92724a7dac1883a247d5b15aba483c /robots/score.c | |
parent | 8da3d5189a9a79e6cd764ad062df763e1cb5a962 (diff) | |
download | bsdgames-darwin-36e0b3e5fe951ef4265a0da56201960d52ed7ee6.tar.gz bsdgames-darwin-36e0b3e5fe951ef4265a0da56201960d52ed7ee6.tar.zst bsdgames-darwin-36e0b3e5fe951ef4265a0da56201960d52ed7ee6.zip |
Add -A for automatic playing mode.
Make the score file MI
Diffstat (limited to 'robots/score.c')
-rw-r--r-- | robots/score.c | 113 |
1 files changed, 84 insertions, 29 deletions
diff --git a/robots/score.c b/robots/score.c index c43e4011..7781e3ad 100644 --- a/robots/score.c +++ b/robots/score.c @@ -1,4 +1,4 @@ -/* $NetBSD: score.c,v 1.5 1997/10/12 14:16:28 lukem Exp $ */ +/* $NetBSD: score.c,v 1.6 1999/05/15 23:56:36 christos Exp $ */ /* * Copyright (c) 1980, 1993 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)score.c 8.1 (Berkeley) 5/31/93"; #else -__RCSID("$NetBSD: score.c,v 1.5 1997/10/12 14:16:28 lukem Exp $"); +__RCSID("$NetBSD: score.c,v 1.6 1999/05/15 23:56:36 christos Exp $"); #endif #endif /* not lint */ @@ -51,6 +51,62 @@ int Max_per_uid = MAX_PER_UID; static SCORE Top[MAXSCORES]; +static u_int32_t numscores, max_uid; + +/* + * read_score: + * Read the score file in MI format + */ +static void +read_score(inf) + int inf; +{ + SCORE *scp; + + if (read(inf, &max_uid, sizeof max_uid) == sizeof max_uid) { + max_uid = ntohl(max_uid); + + read(inf, Top, sizeof Top); + for (scp = Top; scp < &Top[MAXSCORES]; scp++) { + scp->s_uid = ntohl(scp->s_uid); + scp->s_score = ntohl(scp->s_score); + scp->s_auto = ntohl(scp->s_auto); + scp->s_level = ntohl(scp->s_level); + } + } + else { + for (scp = Top; scp < &Top[MAXSCORES]; scp++) + scp->s_score = 0; + max_uid = Max_per_uid; + } +} + +/* + * write_score: + * Write the score file in MI format + */ +static void +write_score(inf) + int inf; +{ + SCORE *scp; + + lseek(inf, 0L, 0); + + max_uid = htonl(max_uid); + write(inf, &max_uid, sizeof max_uid); + + for (scp = Top; scp < &Top[MAXSCORES]; scp++) { + scp->s_uid = htonl(scp->s_uid); + scp->s_score = htonl(scp->s_score); + scp->s_auto = htonl(scp->s_auto); + scp->s_level = htonl(scp->s_level); + } + + write(inf, Top, sizeof Top); +} + + /* * score: * Post the player's score, if reasonable, and then print out the @@ -59,11 +115,10 @@ static SCORE Top[MAXSCORES]; void score() { - int inf; - SCORE *scp; - int uid; - bool done_show = FALSE; - static int numscores, max_uid; + int inf; + SCORE *scp; + int uid; + bool done_show = FALSE; Newscore = FALSE; if ((inf = open(Scorefile, O_RDWR)) < 0) { @@ -71,13 +126,7 @@ score() return; } - if (read(inf, &max_uid, sizeof max_uid) == sizeof max_uid) - read(inf, Top, sizeof Top); - else { - for (scp = Top; scp < &Top[MAXSCORES]; scp++) - scp->s_score = -1; - max_uid = Max_per_uid; - } + read_score(inf); uid = getuid(); if (Top[MAXSCORES-1].s_score <= Score) { @@ -89,6 +138,8 @@ score() break; scp->s_score = Score; scp->s_uid = uid; + scp->s_auto = Auto_bot; + scp->s_level = Level; set_name(scp); Newscore = TRUE; break; @@ -96,6 +147,8 @@ score() if (scp == &Top[MAXSCORES]) { Top[MAXSCORES-1].s_score = Score; Top[MAXSCORES-1].s_uid = uid; + Top[MAXSCORES-1].s_auto = Auto_bot; + Top[MAXSCORES-1].s_level = Level; set_name(&Top[MAXSCORES-1]); Newscore = TRUE; } @@ -111,13 +164,19 @@ score() else Full_clear = TRUE; + move(1, 15); + printw("%5.5s %5.5s %-9.9s %-8.8s %5.5s", "Rank", "Score", "User", + " ", "Level"); + for (scp = Top; scp < &Top[MAXSCORES]; scp++) { - if (scp->s_score < 0) + if (scp->s_score == 0) break; - move((scp - Top) + 1, 15); + move((scp - Top) + 2, 15); if (!done_show && scp->s_uid == uid && scp->s_score == Score) standout(); - printw(" %d\t%d\t%-8.8s ", (scp - Top) + 1, scp->s_score, scp->s_name); + printw("%5.5d %5.5d %-8.8s %-9.9s %5.5d", + (scp - Top) + 1, scp->s_score, scp->s_name, + Auto_bot ? "(autobot)" : "", scp->s_level); if (!done_show && scp->s_uid == uid && scp->s_score == Score) { standend(); done_show = TRUE; @@ -127,9 +186,7 @@ score() refresh(); if (Newscore) { - lseek(inf, 0L, 0); - write(inf, &max_uid, sizeof max_uid); - write(inf, Top, sizeof Top); + write_score(inf); } close(inf); } @@ -165,22 +222,20 @@ show_score() { SCORE *scp; int inf; - static int max_score; if ((inf = open(Scorefile, O_RDONLY)) < 0) { warn("opening `%s'", Scorefile); return; } - for (scp = Top; scp < &Top[MAXSCORES]; scp++) - scp->s_score = -1; - - read(inf, &max_score, sizeof max_score); - read(inf, Top, sizeof Top); + read_score(inf); close(inf); inf = 1; + printf("%5.5s %5.5s %-9.9s %-8.8s %5.5s\n", "Rank", "Score", "User", + " ", "Level"); for (scp = Top; scp < &Top[MAXSCORES]; scp++) - if (scp->s_score >= 0) - printf("%d\t%d\t%.*s\n", inf++, scp->s_score, - (int)(sizeof(scp->s_name)), scp->s_name); + if (scp->s_score > 0) + printf("%5.5d %5.5d %-8.8s %-9.9s %5.5d\n", + inf++, scp->s_score, scp->s_name, + scp->s_auto ? "(autobot)" : "", scp->s_level); } |