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