diff src/tool-promo.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-promo.c	Sat Dec 06 04:37:05 1997 +0000
@@ -0,0 +1,213 @@
+/*--------------------------------------------------------------------------
+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 "struct.h"
+#include "data.h"
+
+int nplayers;
+struct statentry *database;
+
+struct highscore
+{
+  char name[32];
+  int advance, newrank;
+  float didiff;
+};
+
+struct highscore *scores;
+int scoresize, nscores;
+
+int
+cmp_score(a, b)
+  struct highscore *a, *b;
+{
+  float diff = a->newrank - b->newrank;
+
+  if (diff < 0)
+    return 1;
+  else if (diff > 0)
+    return -1;
+
+  diff = a->advance - b->advance;
+
+  if (diff < 0)
+    return 1;
+  else if (diff > 0)
+    return -1;
+
+  diff = a->didiff - b->didiff;
+
+  if (diff < 0)
+    return 1;
+  else if (diff > 0)
+    return -1;
+  else
+    return 0;
+}
+
+struct statentry zeroplayer;
+
+int
+main(argc, argv)
+  int argc;
+  char **argv;
+{
+  struct stat fstats;
+  FILE *fp;
+  int i;
+  int threshold;
+  struct statentry currplayer;
+
+  if (argc != 4)
+  {
+    int x;
+    char message[][255] = {
+      "\n\t'%s n oldfile newfile'\n",
+      "\nLists all players who have been promoted more than n ranks.\n",
+      ""
+    };
+
+    fprintf(stderr, "-- Netrek II (Paradise), %s --\n", PARAVERS);
+    for (i = 0; *message[i] != '\0'; i++)
+      fprintf(stderr, message[i], argv[0]);
+
+    exit(1);
+  }
+
+  threshold = atoi(argv[1]);
+
+
+  fp = fopen(argv[2], "r");
+  if (fp == 0)
+  {
+    fprintf(stderr, "Couldn't open file %s for read", argv[1]);
+    perror("");
+    exit(1);
+  }
+
+  if (fstat(fileno(fp), &fstats) < 0)
+  {
+    fprintf(stderr, "Couldn't fstat file %s", argv[1]);
+    perror("");
+    exit(1);
+  }
+
+  nplayers = fstats.st_size / sizeof(*database);
+  database = (struct statentry *) malloc(sizeof(*database) * nplayers);
+
+  i = fread(database, sizeof(*database), nplayers, fp);
+
+  if (i == 0)
+  {
+    fprintf(stderr, "failed to read any player records from file %s\n", argv[1]);
+    exit(1);
+  }
+  if (i != nplayers)
+  {
+    fprintf(stderr, "failed to read all player records from file %s (%d of %d)\n", argv[1], i, nplayers);
+    nplayers = i;
+  }
+
+  fclose(fp);
+
+  fp = fopen(argv[3], "r");
+  if (fp == 0)
+  {
+    fprintf(stderr, "Couldn't open file %s for read", argv[2]);
+    perror("");
+    exit(1);
+  }
+
+
+  scores = (struct highscore *) malloc(sizeof(*scores) * (scoresize = 256));
+  nscores = 0;
+
+  while (1)
+  {
+    int delta;
+    int dt;
+    struct statentry *prevplayer;
+    struct highscore *currscore;
+
+    i = fread(&currplayer, sizeof(currplayer), 1, fp);
+    if (i < 0)
+    {
+      fprintf(stderr, "error reading player record, aborting loop\n");
+      perror("");
+    }
+    if (i <= 0)
+      break;
+
+    for (i = 0; i < nplayers; i++)
+    {
+      if (0 == strcmp(database[i].name, currplayer.name))
+	break;
+    }
+    if (i < nplayers)
+      prevplayer = &database[i];
+    else
+      prevplayer = &zeroplayer;
+
+    if (currplayer.stats.st_rank - prevplayer->stats.st_rank <= threshold)
+      continue;			/* didn't advance enough */
+
+    if (nscores >= scoresize)
+    {
+      scores = (struct highscore *) realloc(scores, sizeof(*scores) * (scoresize *= 2));
+    }
+    currscore = &scores[nscores++];
+    strcpy(currscore->name, currplayer.name);
+    currscore->newrank = currplayer.stats.st_rank;
+    currscore->advance = currplayer.stats.st_rank - prevplayer->stats.st_rank;
+    currscore->didiff = currplayer.stats.st_di - prevplayer->stats.st_di;
+  }
+
+
+#define offset(field) ( (int)&(((struct highscore*)0)->field) )
+
+  qsort(scores, nscores, sizeof(*scores), cmp_score);
+
+  printf("Congratulations to the following warriors:\n");
+  for (i = 0; i < nscores; i++)
+  {
+    struct highscore *curr = &scores[i];
+    int j;
+
+    printf("%s ", curr->name);
+    for (j = strlen(curr->name); j < 18; j++)
+      putchar(0x1f);
+    printf(" promoted from %s to %s", ranks[curr->newrank - curr->advance].name,
+	   ranks[curr->newrank].name);
+    if (curr->advance > 1)
+    {
+      printf(" (%d ranks)", curr->advance);
+    }
+    printf("\n");
+  }
+  printf("(Your new insignia will be provided as soon as we get\n\
+ enough scrap plastic donations.)");
+
+  exit(0);
+}