]> icculus.org git repositories - taylor/freespace2.git/blob - include/scoring.h
Initial revision
[taylor/freespace2.git] / include / scoring.h
1 /*
2  * $Logfile: /Freespace2/code/Stats/Scoring.h $
3  * $Revision$
4  * $Date$
5  * $Author$
6  *
7  * Scoring system structures, medals, rank, etc.
8  *
9  * $Log$
10  * Revision 1.1  2002/05/03 03:28:12  root
11  * Initial revision
12  *
13  * 
14  * 6     8/30/99 5:01p Dave
15  * Made d3d do less state changing in the nebula. Use new chat server for
16  * PXO.
17  * 
18  * 5     8/26/99 8:49p Jefff
19  * Updated medals screen and about everything that ever touches medals in
20  * one way or another.  Sheesh.
21  * 
22  * 4     2/23/99 2:29p Dave
23  * First run of oldschool dogfight mode. 
24  * 
25  * 3     1/29/99 2:08a Dave
26  * Fixed beam weapon collisions with players. Reduced size of scoring
27  * struct for multiplayer. Disabled PXO.
28  * 
29  * 2     10/07/98 10:54a Dave
30  * Initial checkin.
31  * 
32  * 1     10/07/98 10:51a Dave
33  * 
34  * 32    9/15/98 11:44a Dave
35  * Renamed builtin ships and wepaons appropriately in FRED. Put in scoring
36  * scale factors. Fixed standalone filtering of MD missions to non-MD
37  * hosts.
38  * 
39  * 31    5/15/98 9:52p Dave
40  * Added new stats for freespace. Put in artwork for viewing stats on PXO.
41  * 
42  * 30    5/15/98 4:12p Allender
43  * removed redbook code.  Put back in ingame join timer.  Major fixups for
44  * stats in multiplayer.  Pass correct score, medals, etc when leaving
45  * game.  Be sure clients display medals, badges, etc.
46  * 
47  * 29    5/06/98 3:15p Allender
48  * fixed some ranking problems.  Made vasudan support ship available in
49  * multiplayer mode.
50  * 
51  * 28    5/05/98 2:10p Dave
52  * Verify campaign support for testing. More new tracker code.
53  * 
54  * 27    4/27/98 6:02p Dave
55  * Modify how missile scoring works. Fixed a team select ui bug. Speed up
56  * multi_lag system. Put in new main hall.
57  * 
58  * 26    4/21/98 11:55p Dave
59  * Put in player deaths statskeeping. Use arrow keys in the ingame join
60  * ship select screen. Don't quit the game if in the debriefing and server
61  * leaves.
62  * 
63  * 25    4/21/98 4:44p Dave
64  * Implement Vasudan ships in multiplayer. Added a debug function to bash
65  * player rank. Fixed a few rtvoice buffer overrun problems. Fixed ui
66  * problem in options screen. 
67  * 
68  * 24    4/13/98 4:19p Hoffoss
69  * Added rank voice file support.
70  * 
71  * 23    3/09/98 5:54p Dave
72  * Fixed stats to take asteroid hits into account. Polished up UI stuff in
73  * team select. Finished up pilot info popup. Tracked down and fixed
74  * double click bug.
75  * 
76  * 22    3/09/98 4:30p Allender
77  * multiplayer secondary weapon changes.  red-alert and cargo-known-delay
78  * sexpressions.  Add time cargo revealed to ship structure
79  * 
80  * 21    3/02/98 4:24p Allender
81  * change how scoring works.  Call scoring level close when debriefing is
82  * initialized.  Made a "backout" function when mission is not accepted.
83  * 
84  * 20    2/05/98 5:34p Hoffoss
85  * Changed code to allow each rank promotion to have it's own specific
86  * debriefing text.
87  * 
88  * 19    2/04/98 6:36p Dave
89  * Changed how stats are handled for net players.
90  * 
91  * 18    2/02/98 4:59p Hoffoss
92  * Added a promotion text field to rank.tbl and code to support it in
93  * FreeSpace.
94  * 
95  * 17    1/27/98 5:01p Dave
96  * Put in support for leaving multiplayer games in the pause state. Fixed
97  * a popup bug which freed saved screens incorrectly. Reworked scoring
98  * kill and assist evaluation.
99  * 
100  * 16    1/27/98 4:23p Allender
101  * enhanced internal scoring mechanisms.
102  * 
103  * 15    12/31/97 2:52p Hoffoss
104  * Added award window stuff to debriefing screen.
105  * 
106  * 14    12/10/97 4:45p Dave
107  * Added in more detailed support for multiplayer packet lag/loss. Fixed
108  * some multiplayer stuff. Added some controls to the standalone.
109  * 
110  * 13    11/18/97 5:30p Dave
111  * Reorganized some stats code. Made sure that mission stats (single and
112  * multi) are only merged with alltime stats at the proper times.
113  * 
114  * 12    11/06/97 4:39p Allender
115  * a ton of medal work.  Removed an uneeded elemen in the scoring
116  * structure.  Fix up medals screen to apprioriate display medals (after
117  * mask was changed).  Fix Fred to only display medals which may actually
118  * be granted.  Added image_filename to player struct for Jason Hoffoss
119  * 
120  * 11    11/06/97 9:54a Dave
121  * Dependant checkin
122  * 
123  * 10    11/05/97 4:43p Allender
124  * reworked medal/rank system to read all data from tables.  Made Fred
125  * read medals.tbl.  Changed ai-warp to ai-warp-out which doesn't require
126  * waypoint for activation
127  * 
128  * 9     11/04/97 11:21p Allender
129  * added gramt-promotion and grant-medal sexpressions.  Changed MAX_MEDALS
130  * to NUM_MEDALS and made it be the correct number.  Temporaritly move
131  * medal names to missionparse.cpp so Fred could get at them
132  * 
133  * 8     9/25/97 4:57p Dave
134  * Finished up work on assigning kills and assists in player (and
135  * multiplayer) stats.
136  * 
137  * 7     9/24/97 5:03p Dave
138  * Beginning changes on how kills/assists are evaluated in both single and
139  * multiplayer
140  * 
141  * 6     9/18/97 10:14p Dave
142  * Updated the scoring system struct. Added rank.tbl. Modified how medal
143  * names are displayed.
144  * 
145  * 5     9/18/97 9:21a Dave
146  * Added view medals state. Changed pilot scoring struct to reflect.
147  * 
148  * 4     7/25/97 4:32p Dave
149  * Added bonehead stats management.
150  * 
151  * 3     7/24/97 2:59p Dave
152  * modified the scoring_struct type, and its corresponding init function
153  * 
154  * 2     5/01/97 10:24a Hoffoss
155  * Created new scoring structure, and added code to save/restore it
156  * to/from pilot file.
157  * 
158  * 1     4/30/97 10:19a Hoffoss
159  *
160  * $NoKeywords: $
161  */
162
163 #ifndef _SCORING_HEADER_FILE
164 #define _SCORING_HEADER_FILE
165
166 #include "ship.h"
167 #include "weapon.h"
168
169 struct player;
170
171 // ARGH. IMPORTANT : do not change NUM_MEDALS without talking to DaveB first. It will affect the size of the scoring struct and hence, will break
172 // a lot of PXO related stuff. SEE ALSO : MAX_SHIP_TYPES
173 #ifdef FS2_DEMO
174         #define NUM_MEDALS                      16
175         #define NUM_MEDALS_FS1          16
176 #else 
177         #define NUM_MEDALS                      18
178         #define NUM_MEDALS_FS1          16
179 #endif
180
181 #define NUM_RANKS                               10
182
183 #define RANK_ENSIGN                             0
184 #define RANK_LT_JUNIOR                  1
185 #define RANK_LT                                 2
186 #define RANK_LT_CMDR                            3
187 #define RANK_CMDR                                       4
188 #define RANK_CAPTAIN                            5
189 #define RANK_COMMODORE                  6
190 #define RANK_REAR_ADMIRAL               7
191 #define RANK_VICE_ADMIRAL               8
192 #define RANK_ADMIRAL                    9
193
194 #define MAX_FREESPACE1_RANK     RANK_COMMODORE
195 #define MAX_FREESPACE2_RANK     RANK_ADMIRAL
196
197 /*
198         The ins and outs of when/where stats are stored and retreived - BE SURE TO FOLLOW THESE GUIDELINES
199
200    SINGLE PLAYER :
201                 scoring_level_init() is called from game_level_init(). This zeroes out mission specific stats
202                 scoring_level_close() is called from the debriefing screen when the player hits accept. This saves the mission
203                         stats to alltime stats, and updates any campaign stats
204                 NOTE : in single player mode, if the player is going back to replay an old mission, the stats shouldn't be 
205                         stored again
206
207    MULTI PLAYER :
208                 scoring_level_init() is called in game_level_init() again.
209                 init_multiplayer_stats() is called on all computers in the game when moving _into_ the MISSION_SYNC state
210
211                 scoring_level_close() is called on all machines when the host selects accept. If the host is not on the standalone
212                         he sends a packet to all players indicating that they should save their data. If he _is_ on the standalone, he should 
213                         send only to the standalone, and then it rebroadcasts the packet ot everyone else.              
214 */
215
216
217 typedef struct rank_stuff {
218         char            name[NAME_LENGTH];              // name of this rank
219         char            *promotion_text;                        // text to display when promoted to this rank
220         int             points;                                         // points needed to reach this rank
221         char            bitmap[NAME_LENGTH];            // bitmap of this rank medal
222         char            promotion_voice_base[MAX_FILENAME_LEN - 1];
223 } rank_stuff;
224
225 #define STATS_FLAG_INVALID                      (1<<0)
226 #define STATS_FLAG_CAMPAIGN             (1<<1)
227 #define STATS_FLAG_MULTIPLAYER  (1<<2)
228
229 typedef struct scoring_struct {
230         int flags;
231
232         // All-time total
233         int score;                                                              // all time score
234         int rank;                                                               // all time rank
235         int medals[NUM_MEDALS];                         // all time medal counts
236
237         ushort kills[MAX_SHIP_TYPES];           // only valid kills (i.e. not on friendlies).
238         int assists;                                                    // alltime assists
239         int kill_count;                                         // total alltime kills
240         int kill_count_ok;                                      // total valid alltime kills (no friendlies)
241         unsigned int p_shots_fired;             // primary weapon shots fired
242         unsigned int s_shots_fired;             // secondary weapon shots fired
243
244         unsigned int p_shots_hit;                       // primary weapon shots hit
245         unsigned int s_shots_hit;                       // secondary weapon shots hit
246
247         unsigned int p_bonehead_hits;           // alltime primary friendly hits
248         unsigned int s_bonehead_hits;           // alltime secondary friendly hits
249    int          bonehead_kills;         // alltime friendly kills
250
251         unsigned int missions_flown;            // total # of missions flown
252         unsigned int flight_time;                       // total # of flight hours the player has
253         time_t last_flown;                                      // last time the player has flown
254         time_t last_backup;                                     // so we can easily call scoring_level_backout()
255
256         // Mission total
257         int m_medal_earned;                                     // which medal (if any) earned this mission
258         int m_badge_earned;                                     // which badge was earned.  Calculated after mission is over
259         int m_promotion_earned;                         // was a promotion earned.  Calculated after mission is over
260
261         int m_score;
262         ushort m_kills[MAX_SHIP_TYPES];     // this will represent all kills in the mission (bonehead or not)
263         ushort m_okKills[MAX_SHIP_TYPES];   // this will be only the "valid" kills the player made
264         int m_kill_count;                                               // total kills for this mission
265         int m_kill_count_ok;             // total (non-friendly) kills for this mission
266         int m_assists;                                                  // player assits for the mission
267    unsigned int mp_shots_fired;         // primary shots fired for the mission
268         unsigned int ms_shots_fired;            // secondary shots fired for the mission
269         unsigned int mp_shots_hit;                      // primary shots hit for the mission
270         unsigned int ms_shots_hit;                      // secondary shots hit for the mission
271         unsigned int mp_bonehead_hits;  // primary friendly hits for the mission
272         unsigned int ms_bonehead_hits;  // secondary friendly hits for the mission
273         int m_bonehead_kills;                           // # of friendly kills for the mission
274         int m_player_deaths;                                    // player deaths for the mission (really only useful for multiplayer)
275
276         // kills by player for multiplayer dogfight
277         ushort m_dogfight_kills[MAX_PLAYERS];
278 } scoring_struct;
279
280 extern rank_stuff Ranks[NUM_RANKS];
281
282 void init_scoring_element(scoring_struct *s);
283
284 void parse_rank_tbl();
285 void scoring_level_init( scoring_struct *score );
286 void scoring_level_close(int accepted = 1);
287 void scoring_backout_accept( scoring_struct *score );
288 void scoring_do_accept( scoring_struct *score );
289
290 // function to give a medal to a player if he earned it
291 void scoring_check_medal(scoring_struct *sc);
292
293 void scoring_add_damage(object *ship_obj,object *other_obj,float damage);
294 void scoring_eval_kill(object *ship_obj);
295 void scoring_eval_assists(ship *sp,int killer_sig);
296
297 // bash the passed player to the specified rank
298 void scoring_bash_rank(player *pl,int rank);
299
300 // eval a hit on an object (for primary and secondary hit purposes)
301 void scoring_eval_hit(object *hit_obj, object *other_obj, int from_blast = 0);
302
303 // get a scaling factor for adding/subtracting from mission score
304 float scoring_get_scale_factor();
305
306 #endif
307