diff src/tool-hr.c @ 8:0836fb919dfa

First entry of Paradise Server 2.9 patch 10 Beta
author darius
date Sat, 06 Dec 1997 04:37:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tool-hr.c	Sat Dec 06 04:37:05 1997 +0000
@@ -0,0 +1,222 @@
+/*--------------------------------------------------------------------------
+NETREK II -- Paradise
+
+Permission to use, copy, modify, and distribute this software and its
+documentation, or any derivative works thereof, for any NON-COMMERCIAL
+purpose and without fee is hereby granted, provided that this copyright
+notice appear in all copies.  No representations are made about the
+suitability of this software for any purpose.  This software is provided
+"as is" without express or implied warranty.
+
+    Xtrek Copyright 1986                            Chris Guthrie
+    Netrek (Xtrek II) Copyright 1989                Kevin P. Smith
+                                                    Scott Silvey
+    Paradise II (Netrek II) Copyright 1993          Larry Denys
+                                                    Kurt Olsen
+                                                    Brandon Gillespie
+--------------------------------------------------------------------------*/
+
+#include "config.h"
+
+#include <stdio.h>
+#include <malloc.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include "defs.h"
+#include "data.h"
+#include "struct.h"
+#include "shmem.h"
+#include "path.h"
+
+#ifdef sparc
+extern char *sys_errlist[];
+#define strerror(EN)	sys_errlist[(EN)]
+#endif
+
+#define LINESPERPAGE 38
+
+struct statentry *database;
+struct statentry **playertab;
+int topn, motd = 0;
+
+void header();
+
+void
+printUsage(me)
+  char *me;
+{
+  int x;
+  char message[][255] = {
+    "\nHonor Roll of players in the current database.\n",
+    "\n\t'%s n [options]'\n\n",
+    "Where n is the number of scores to print (top n)\n",
+    "\nOptions:\n",
+    "\t-f file   Use \"file\" as player file (default: $NETREKDIR/etc/db.players)\n",
+    "\t-m        Format output for use in server MOTD\n\n",
+    ""
+  };
+
+  fprintf(stderr, "--- Netrek II (Paradise), %s ---\n", PARAVERS);
+  for (x = 0; *message[x] != '\0'; x++)
+    fprintf(stderr, message[x], me);
+
+  exit(1);
+}
+
+int
+cmp_func(a, b)
+  struct statentry **a, **b;
+{
+  float di_diff = (*a)->stats.st_di - (*b)->stats.st_di;
+  int rk_diff = (*a)->stats.st_rank - (*b)->stats.st_rank;
+
+  /* rank takes precedent over DI */
+  if (rk_diff < 0)
+    return 1;
+  else if (rk_diff > 0)
+    return -1;
+
+  if (di_diff < 0)
+    return 1;
+  else if (di_diff > 0)
+    return -1;
+
+  return strcmp((*a)->name, (*b)->name);
+}
+
+#if 0
+static char *rankh[] = {
+  "Recruits:",
+  "Specialists:",
+  "Cadets:",
+  "Midshipmen:",
+  "Ensigns, Junior Grade:",
+  "Ensigns:",
+  "Lieutenants, Junior Grade:",
+  "Lieutenants:",
+  "Lieutenant Commanders:",
+  "Commanders:",
+  "Captains:",
+  "Fleet Captains:",
+  "Commodores:",
+  "Moffs:",
+  "Grand Moffs:",
+  "Rear Admirals:",
+  "Admirals:",
+  "Grand Admirals:",
+};
+#endif
+
+int
+main(argc, argv)
+  int argc;
+  char *argv[];
+{
+  int i, nplayers, j, count = 0;
+  FILE *fp;
+  struct stat fstats;
+  char *fn;
+  struct stats *s;
+
+  if (argc < 2)
+    printUsage(argv[0]);
+
+  if (!(topn = atoi(argv[1])))
+    printUsage(argv[0]);
+
+  fn = build_path(PLAYERFILE);
+
+  for (i = 2; i < argc; i++)
+  {
+    if (!strcmp(argv[i], "-f"))
+    {
+      if (i + 1 == argc)
+	printUsage(argv[0]);
+      fn = argv[++i];
+    }
+    else if (!strcmp(argv[i], "-m"))
+    {
+      motd = 1;
+    }
+  }
+
+  if (!(fp = fopen(fn, "r")))
+  {
+    fprintf(stderr, "Couldn't open file %s: %s\n", fn, strerror(errno));
+    exit(1);
+  }
+
+  if (fstat(fileno(fp), &fstats) < 0)
+  {
+    fprintf(stderr, "Couldn't fstat file %s: %s\n", fn, strerror(errno));
+    exit(1);
+  }
+
+  nplayers = fstats.st_size / sizeof(*database);
+  database = malloc(sizeof(*database) * nplayers);
+
+  i = fread(database, sizeof(*database), nplayers, fp);
+  if (i != nplayers)
+  {
+    fprintf(stderr, "failed to read all player records from file %s (%d of %d)\n", fn, i, nplayers);
+    nplayers = i;
+  }
+
+  fclose(fp);
+
+  if (topn < 0 || topn > nplayers)
+    topn = nplayers;
+
+  /* Make an array of pointers to the database. */
+  playertab = malloc(sizeof(playertab) * nplayers);
+
+  for (i = 0; i < nplayers; i++)
+    playertab[i] = &(database[i]);
+
+  /* sort the pointers */
+  qsort(playertab, nplayers, sizeof(playertab), cmp_func);
+
+  header();
+  count = 1;
+
+  j = 18;
+  for (i = 0; i < topn; i++)
+  {
+    s = &(playertab[i]->stats);
+    if (j > s->st_rank)
+    {
+      j = s->st_rank;
+      if (motd)
+      {
+	count += 2;
+	if (count >= LINESPERPAGE)
+	{
+	  header();
+	  count = 3;
+	}
+      }
+      printf("\n%s\n", ranks[j].name);
+    }
+    if (motd && (++count > LINESPERPAGE))
+    {
+      header();
+      printf("\n");
+      count = 3;
+    }
+    printf("%4d. %15s %8.2f %6d %6d %6d  %4d  %5d %5d %7.2f\n", i + 1,
+	   playertab[i]->name, s->st_di, s->st_tkills, s->st_tlosses,
+	   s->st_tarmsbomb, s->st_tresbomb, s->st_tplanets,
+	   s->st_tdooshes, (float) (s->st_tticks / 36000.0));
+  }
+  exit(1);
+}
+
+void
+header()
+{
+  if (motd)
+    printf("\t@@b\n");
+  printf("TOP %-4d         Name     DI     Wins  Losses Armies Rsrcs  Plnts  Dshs  Hours\n", topn);
+  printf("-------------------------------------------------------------------------------");
+}