Update of /cvsroot/netrek/client/netrekxp/include
In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv14506/include
Modified Files:
data.h packets.h proto.h
Added Files:
ltd_stats.h
Log Message:
Add support for SP_LTD, still buggy.
Added include/ltd_stats.h to source.
Some minor formatting and fprintf fixes.
Change unknown ranks to blank.
--- NEW FILE: ltd_stats.h ---
/*
*
* Dave Ahn
*
* Leonard/Tom/Dave (LTD) Extended statistics. For detailed info, read
* the README.LTD file.
*
* For inline optimization details, read the README.LTD and
* ltd_stats.c files.
*
* struct ltd_stats is a per-ship statistics group for each player.
* This means that the player DB will increase by several factors in
* size at the benefit of detailed stats that can be used to analyze
* individual play for clued games.
*
*/
#ifndef __INCLUDED_ltd_stats_h__
#define __INCLUDED_ltd_stats_h__
#include "defs.h" /* We need defines from this file */
#define LTD_VERSION 'a' /* version for SP_LTD packet */
typedef enum {
LTD_TZONE_0 = 0, /* Zone 0 = backfield */
LTD_TZONE_1 = 1, /* Zone 1 = core + 2 open side */
LTD_TZONE_2 = 2, /* Zone 2 = front line */
LTD_TZONE_3 = 3, /* Zone 3 = enemy front line */
LTD_TZONE_4 = 4, /* Zone 4 = enemy core + 2 open side */
LTD_TZONE_5 = 5, /* Zone 5 = enemy backfield */
LTD_TZONE_6 = 6, /* Zone 6 = 3rd space */
LTD_TZONE_7 = 7, /* Zone 7 = unknown/diag */
LTD_NUM_TZONES = 8 /* number of zones */
} LTD_TZONE_T;
/* XXNOTE: find a better way to do the inlining
*/
#ifdef LTD_INLINE
#define __LTD_INLINE inline static
#else
#define __LTD_INLINE
#endif
/* for extende stats, one struct for each ship except GA and AT, which
share the same slot */
typedef enum {
LTD_TOTAL = 0,
LTD_SC = 1,
LTD_DD = 2,
LTD_CA = 3,
LTD_BB = 4,
LTD_AS = 5,
LTD_SB = 6,
LTD_GA = 7,
LTD_AT = 7,
LTD_NUM_SHIPS = 8
} LTD_SHIP_T;
#ifdef LTD_PER_RACE
typedef enum {
LTD_FED = 0,
LTD_ROM = 1,
LTD_KLI = 2,
LTD_ORI = 3,
LTD_NOBODY = 4,
LTD_NUM_RACES = 5
} LTD_RACE_T;
#else
typedef enum {
LTD_FED = 0,
LTD_ROM = 0,
LTD_KLI = 0,
LTD_ORI = 0,
LTD_NOBODY = 0,
LTD_NUM_RACES = 1
} LTD_RACE_T;
#endif /* LTD_PER_RACE */
/* LTD stats structure */
struct ltd_stats {
/* How many times have I killed in this ship */
struct _kills {
unsigned int total; /* total number of kills ever */
double max; /* max kills ever achieved */
unsigned int first; /* number of first kills made */
unsigned int first_potential; /* first kills that could be
converted to carries */
unsigned int first_converted; /* first kills that actually were
converted to carries */
unsigned int second; /* number of second kills made */
unsigned int second_potential; /* second kills that could be
converted to carries */
unsigned int second_converted; /* second kills that actually were
converted to carries */
unsigned int phasered; /* number of kills made with a
phaser death blow */
unsigned int torped; /* number of kills made with a
torp blow */
unsigned int plasmaed; /* number of kills made with a
plamsa */
#if defined(_64BIT) && defined(linux)
} __attribute__((packed)) kills;
#else
} kills;
#endif
/* How many times have I died in this ship */
struct _deaths {
unsigned int total; /* total number of deaths ever */
unsigned int potential; /* number of times died as a
potential carrier */
unsigned int converted; /* number of times died as a
a converted carrier */
unsigned int dooshed; /* number of times died while ++ */
unsigned int phasered; /* number of times died from phaser */
unsigned int torped; /* number of times died from torp */
unsigned int plasmaed; /* number of times died from plasma */
unsigned int acc; /* number of times you died, and
someone picked up armies with
the kill */
} deaths;
/* How many planets have I destroyed or taken */
struct _planets {
unsigned int taken; /* number of planets taken */
unsigned int destroyed; /* number of planets destroyed */
} planets;
/* How many enemy armies have you bombed */
struct _bomb {
unsigned int planets; /* number of planets bombed */
unsigned int planets_8; /* number of planets with <= 8
armies bombed */
unsigned int planets_core; /* number of core planets bombed */
unsigned int armies; /* total number of armies bombed */
unsigned int armies_8; /* armies bombed where the planet
being bombed had <= 8 armies */
unsigned int armies_core; /* armies bombed in a core planet */
} bomb;
/* How many enemy carriers have you killed and armies ogged */
struct _ogged {
unsigned int armies; /* number of enemy armies ogged */
unsigned int dooshed; /* number of dooshed real carriers */
unsigned int converted; /* number of converted enemy
carriers */
unsigned int potential; /* number of potential enemy
carriers */
unsigned int bigger_ship; /* number of times a real carrier
was in a bigger ship */
unsigned int same_ship; /* number of times a real carrier
was in the same sized ship */
unsigned int smaller_ship; /* number of times a real carrier
was in the same sized ship */
unsigned int sb_armies; /* number of armies on enemy SB
ogged */
unsigned int friendly; /* number of friendly carriers
you killed */
unsigned int friendly_armies; /* number of friendly armies you
killed due to blatant stupidity */
} ogged;
/* How many friendly armies have you carried */
struct _armies {
unsigned int total; /* number of friendly armies carried */
unsigned int attack; /* armies droped on enemy planets */
unsigned int reinforce; /* armies used to reinforce friendly
planet < 4 */
unsigned int ferries; /* armies ferried to friendly planet
>= 4 or SB */
unsigned int killed; /* armies killed */
} armies;
/* How many carries have you made */
struct _carries {
unsigned int total; /* number of carries you attempted */
unsigned int partial; /* number of times you delivered
at least 1 army before dying ++ */
unsigned int completed; /* number of times you completed
your carry by delivering all
the armies */
unsigned int attack; /* number of times you dropped on
a neutral or enemy planet */
unsigned int reinforce; /* number of times you reinforced
a friendly planet < 4 */
unsigned int ferries; /* number of times you ferried to
a friendly planet >= 4 or SB */
} carries;
/* How much time we spent in relevant roles, modes or space */
struct _ticks {
unsigned int total; /* total = green + yellow + red */
/* unsigned int green; */ /* time spent in green alert */
unsigned int yellow; /* time spent in yellow alert */
unsigned int red; /* time spent in red alert */
unsigned int zone[LTD_NUM_TZONES]; /* time spent in a particular zone */
unsigned int potential; /* time spent as potential carrier */
unsigned int carrier; /* time spent as carrier */
unsigned int repair; /* time spent in repair mode */
} ticks;
unsigned int damage_repaired; /* total damage repaired */
/* Weapon stats */
struct _weapons {
/* phasers */
struct _phaser {
unsigned int fired; /* number of times the weapon was
fired */
unsigned int hit; /* number of times the weapon hit */
struct _damage {
unsigned int inflicted; /* damage inflicted with this weapon */
unsigned int taken; /* damage taken from this weapon */
} damage;
} phaser;
/* torps */
struct _torp {
unsigned int fired; /* number of torps that were fired */
unsigned int hit; /* number of torps hit */
unsigned int detted; /* number of torps that were detted
by enemy */
unsigned int selfdetted; /* number of torps self detted */
unsigned int wall; /* number of torps that hit the wall */
struct _damage damage; /* damage inflicted/taken */
} torps;
/* plasma */
struct _plasma {
unsigned int fired; /* number of plasmas that were fired */
unsigned int hit; /* number that hit */
unsigned int phasered; /* number that were phasered */
unsigned int wall; /* number that hit the wall */
struct _damage damage; /* damage inflicted/taken */
} plasma;
/* damage repaired */
} weapons;
#if defined(_64BIT) && defined(linux)
} __attribute__((packed));
#else
};
#endif
/* LTD history structure - this is needed to calculate the LTD stats
every tick. */
enum {
LTD_NUM_HIST = 5 /* keep track of up to 5 events */
};
struct ltd_history {
/* kill history */
struct _kill {
unsigned int tick; /* tick kill was acquired */
char potential; /* kill was retained long enough to
become potential or converted
carrier */
struct player *victim; /* the player that was killed */
float before; /* kills i had before this one, perhaps
from bombing, etc */
int ship; /* ship type of the victim */
} kills[LTD_NUM_HIST];
int num_kills; /* number of last_kills */
char kill_potential; /* i am a potential carrier
0 = no
1 = potential 1st kill
2 = potential 2nd kill
3 = converted 1st kill
4 = converted 2nd kill */
/* bombing history */
unsigned int last_bombed_tick;/* tick i bombed the last planet */
short last_bombed_planet; /* last planet that i bombed */
/* army/carries history */
short last_beamup_planet;
short last_beamdown_planet; /* last planet i beamed up/down armies from
value is planet number
-1 = SB
-2 = no planet */
int enemy_team; /* the enemy team, for ltd_zone */
};
/* forward declarations of structs for function prototypes */
struct player;
struct stats;
struct planet;
/* function prototypes for non-inlined functions */
void ltd_reset(struct player *);
void ltd_reset_struct(struct ltd_stats (*) [LTD_NUM_SHIPS]);
void ltd_reset_hist(struct player *);
int ltd_can_rank(struct player *);
void ltd_update_totals(struct player *);
/* function prototypes for inlined functions */
__LTD_INLINE float ltd_total_rating(struct player *);
__LTD_INLINE float ltd_bombing_rating(struct player *);
__LTD_INLINE float ltd_planet_rating(struct player *);
__LTD_INLINE float ltd_defense_rating(struct player *);
__LTD_INLINE float ltd_offense_rating(struct player *);
__LTD_INLINE int ltd_kills(struct player *, const LTD_SHIP_T);
__LTD_INLINE int ltd_deaths(struct player *, const LTD_SHIP_T);
__LTD_INLINE int ltd_armies_bombed(struct player *, const LTD_SHIP_T);
__LTD_INLINE int ltd_planets_taken(struct player *, const LTD_SHIP_T);
__LTD_INLINE int ltd_ticks(struct player *, const LTD_SHIP_T);
__LTD_INLINE int ltd_kills_max(struct player *, const LTD_SHIP_T);
__LTD_INLINE void ltd_update_ticks(struct player *);
__LTD_INLINE void ltd_update_kills(struct player *credit_killer,
struct player *actual_killer,
struct player *victim);
__LTD_INLINE void ltd_update_kills_max(struct player *);
__LTD_INLINE void ltd_update_deaths(struct player *victim,
struct player *actual_killer);
__LTD_INLINE void ltd_update_bomb(struct player *bomber,
struct planet *planet_bombed,
int armies_bombed);
__LTD_INLINE void ltd_update_planets(struct player *taker,
struct planet *planet);
__LTD_INLINE void ltd_update_armies(struct player *carrier,
struct planet *planet);
__LTD_INLINE void ltd_update_armies_carried(struct player *carrier,
struct player *sb);
__LTD_INLINE void ltd_update_armies_ferried(struct player *carrier,
struct player *sb);
__LTD_INLINE void ltd_update_repaired(struct player *, const int damage);
__LTD_INLINE void ltd_update_phaser_fired(struct player *shooter);
__LTD_INLINE void ltd_update_phaser_hit(struct player *shooter);
__LTD_INLINE void ltd_update_phaser_damage(struct player *shooter,
struct player *victim,
const int damage);
__LTD_INLINE void ltd_update_torp_fired(struct player *shooter);
__LTD_INLINE void ltd_update_torp_hit(struct player *shooter);
__LTD_INLINE void ltd_update_torp_detted(struct player *shooter);
__LTD_INLINE void ltd_update_torp_selfdetted(struct player *shooter);
__LTD_INLINE void ltd_update_torp_wall(struct player *shooter);
__LTD_INLINE void ltd_update_torp_damage(struct player *shooter,
struct player *victim,
const int damage);
__LTD_INLINE void ltd_update_plasma_fired(struct player *shooter);
__LTD_INLINE void ltd_update_plasma_hit(struct player *shooter);
__LTD_INLINE void ltd_update_plasma_phasered(struct player *shooter);
__LTD_INLINE void ltd_update_plasma_wall(struct player *shooter);
__LTD_INLINE void ltd_update_plasma_damage(struct player *shooter,
struct player *victim,
const int damage);
/* find a better way to do this inline stuff */
#ifdef LTD_INLINE /* this stuff is ugly */
#define __LTD_INCLUDE_SOURCE
#include "ltd_stats.c"
#undef __LTD_INCLUDE_SOURCE
#endif
#ifdef LTD_PER_RACE
static inline LTD_RACE_T ltd_race(const short team) {
switch(team) {
case FED: return LTD_FED;
case ROM: return LTD_ROM;
case KLI: return LTD_KLI;
case ORI: return LTD_ORI;
default: return LTD_NOBODY;
}
}
#else
#define ltd_race(XXX) 0
#endif /* LTD_PER_RACE */
#endif /* __INCLUDED_ltd_stats_h__ */
Index: packets.h
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/include/packets.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- packets.h 28 May 2009 01:19:16 -0000 1.23
+++ packets.h 3 Jun 2009 02:42:55 -0000 1.24
@@ -3,6 +3,7 @@
*
* Kevin P. Smith 1/29/89 */
#include "copyright2.h"
+#include "ltd_stats.h"
#define STATUS_TOKEN "\t@@@" /* ATM */
@@ -132,6 +133,7 @@
#define SP_S_KILLS 58 /* # of kills player have */
#define SP_S_STATS 59 /* see SP_STATS */
#define SP_RANK 61 /* rank data */
+#define SP_LTD 62 /* LTD stats for character */
/* variable length packets */
#define VPLAYER_SIZE 4
@@ -866,6 +868,15 @@
char cname[8]; /* short 'curt' rank name */
};
+struct ltd_spacket
+{
+ char type;
+ char version;
+ char endian;
+ char pad;
+ struct ltd_stats ltd;
+};
+
struct ship_cap_spacket
{ /* Server configuration of
* client */
Index: data.h
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/include/data.h,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -d -r1.111 -r1.112
--- data.h 26 May 2009 02:18:17 -0000 1.111
+++ data.h 3 Jun 2009 02:42:55 -0000 1.112
@@ -662,6 +662,7 @@
extern int F_why_dead_2;
extern int F_auto_weapons;
extern int F_sp_rank;
+extern int F_sp_ltd;
extern int F_terrain; /* paradise */
extern int F_armies_shipcap; /* paradise */
Index: proto.h
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/include/proto.h,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -d -r1.67 -r1.68
--- proto.h 26 May 2009 02:18:17 -0000 1.67
+++ proto.h 3 Jun 2009 02:42:55 -0000 1.68
@@ -1134,6 +1134,7 @@
struct flags_all_spacket;
void handleFlagsAll (struct flags_all_spacket *packet);
void handleRank (struct rank_spacket *packet);
+void handleLtd (struct ltd_spacket *packet);
void initialize_players (void);
void initialize_plasmas (void);
void initialize_torps (void);