diff src/death.c @ 2:2719a89505ba

First entry of Paradise Server 2.9 patch 10 Beta
author darius
date Sat, 06 Dec 1997 04:37:01 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/death.c	Sat Dec 06 04:37:01 1997 +0000
@@ -0,0 +1,181 @@
+/*--------------------------------------------------------------------------
+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 <signal.h>
+#include <setjmp.h>
+#include <sys/types.h>
+#include <sys/time.h>
+
+#include "defs.h"
+#include "struct.h"
+#include "data.h"
+#include "shmem.h"
+
+#if 0
+extern jmp_buf env;
+#endif
+
+
+/* Figure out ratings for player p.  Computed ratings are filled into r */
+void
+compute_ratings(p, r)
+  struct player *p;
+  struct rating *r;
+{
+  struct stats *s;
+  float t, t2;
+
+  s = &p->p_stats;
+
+  r->ratio = (s->st_tlosses != 0) ? (float) s->st_tkills /
+    (float) s->st_tlosses : s->st_tkills;
+
+  if (status->timeprod == 0)
+    status->timeprod = 1;
+
+  t = (float) s->st_tticks / (float) status->timeprod;	/* hour ratio */
+  if (t == 0.0)
+    t = 1.0;
+
+  t2 = t * (float) status->kills;	/* get expected kills */
+  t2 /= 2;			/* lower expectation */
+  printf("ticks %f timeprod %u %f %f %d\n", (float) s->st_tticks, status->timeprod, t2, t, status->kills);
+  r->offrat = s->st_tkills / t2;/* calc offense rating */
+
+  t2 = t * (float) status->dooshes;	/* expected armies dooshed */
+  r->dooshrat = (float) s->st_tdooshes / t2;	/* doosh rating */
+
+  r->battle = r->offrat + r->dooshrat;	/* get battle rating */
+
+  t2 = t * (float) status->armsbomb;	/* expected armies bombed */
+  r->bombrat = (float) s->st_tarmsbomb / t2;	/* bomb rating */
+
+  t2 = t * (float) status->resbomb;	/* expected resources bombed */
+  r->resrat = (float) s->st_tresbomb / t2;	/* resource bombed rating */
+
+  t2 = t * (float) status->planets;	/* expected planets */
+  r->planetrat = (float) s->st_tplanets / t2;	/* get planet rating */
+
+  printf("planetrat %f tplanets %f t2 %f\n", (float) r->planetrat, (float) s->st_tplanets, (float) t2);
+
+  r->strategy = r->bombrat + r->resrat + r->planetrat;	/* strategy rating */
+
+  t2 = (float) status->sbkills / (float) status->sblosses;
+  if (s->st_sblosses == 0)
+    r->sbrat = (float) s->st_sbkills / t2;
+  else
+    r->sbrat = ((float) s->st_sbkills / (float) s->st_sblosses) / t2;
+
+  t2 = (float) status->wbkills / (float) status->wblosses;
+  if (s->st_wblosses == 0)
+    r->wbrat = (float) s->st_wbkills / t2;
+  else
+    r->wbrat = ((float) s->st_wbkills / (float) s->st_wblosses) / t2;
+
+  t = (float) s->st_jsticks / (float) status->jstime;
+  t2 = t * (float) status->jsplanets;	/* get expected js planets */
+  if (t2 == 0.0)
+    r->jsrat = 0.0;
+  else
+    r->jsrat = (float) s->st_jsplanets / t2;	/* js rating */
+
+  r->special = r->sbrat + r->wbrat + r->jsrat;	/* get special ship rating */
+}
+
+
+/*-----------------------------------DEATH---------------------------------*/
+/*
+ * This function is called when the player dies.  It checks to see if the
+ * player has been promoted.
+ */
+
+
+extern int savestats();
+
+void
+death()
+{
+  struct stats *s;		/* to point to player's stats */
+  struct rating r;		/* filled in by compute_ratings() */
+  int genocides;		/* player's genocides */
+  float di;			/* player's di */
+
+#if 0
+  stop_interruptor();
+#endif
+  me->p_status = POUTFIT;	/* Stop the ghost buster */
+  switch (me->p_whydead)
+  {				/* determine whether the player */
+   case KTORP:			/* should be forced out of the */
+   case KPLASMA:		/* game or not */
+   case KPHASER:
+   case KPLANET:
+   case KSHIP:
+   case KGENOCIDE:
+   case KGHOST:
+   case KPROVIDENCE:
+   case KASTEROID:
+   default:
+    break;
+   case KQUIT:
+   case KDAEMON:
+   case KWINNER:
+    mustexit = 1;		/* set global var to force player out */
+    break;
+  }
+  me->p_flags &= ~(PFWAR | PFREFITTING);	/* turn off most flags */
+  if (me->p_stats.st_rank < NUMRANKS - 1)
+  {				/* should we try to promote */
+    s = &(me->p_stats);		/* get player's stat struct */
+    genocides = s->st_genocides;/* get # genocides */
+    di = s->st_di;		/* get player's DI */
+
+    compute_ratings(me, &r);
+
+    /*--[ check for promotion ]--*/
+    if (configvals->bronco_ranks)
+    {
+      if ((di >= ranks[s->st_rank + 1].di)
+	  && (r.battle >= ranks[s->st_rank + 1].battle)
+	  && (r.strategy * 3 / 2 >= ranks[s->st_rank + 1].strategy)
+	  && (r.special * 3 >= ranks[s->st_rank + 1].specship))
+	s->st_rank++;		/* we have a promotion */
+    }
+    else
+    {
+      if ((genocides >= ranks[s->st_rank + 1].genocides)
+	  && (di >= ranks[s->st_rank + 1].di)
+	  && (r.battle >= ranks[s->st_rank + 1].battle)
+	  && (r.strategy >= ranks[s->st_rank + 1].strategy)
+	  && (r.special >= ranks[s->st_rank + 1].specship))
+	s->st_rank++;		/* we have a promotion */
+    }
+  }
+  updateClient();		/* update the client */
+  savestats();			/* save players stats */
+#if 0
+  longjmp(env, 0);		/* jump to start of ntserv */
+#endif
+}
+
+/*-------------------------------------------------------------------------*/
+
+
+/*----END OF FILE-----*/