1 /* 2 * Portions of this file are copyright Rebirth contributors and licensed as 3 * described in COPYING.txt. 4 * Portions of this file are copyright Parallax Software and licensed 5 * according to the Parallax license below. 6 * See COPYING.txt for license details. 7 8 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX 9 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO 10 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A 11 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS 12 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS 13 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE 14 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE 15 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS 16 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. 17 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. 18 */ 19 20 /* 21 * 22 * Structure information for the player 23 * 24 */ 25 26 #pragma once 27 28 #include "fwd-player.h" 29 30 #include <physfs.h> 31 #include "vecmat.h" 32 #include "fwd-weapon.h" 33 34 #ifdef __cplusplus 35 #include <algorithm> 36 #include "pack.h" 37 #include "dxxsconf.h" 38 #include "objnum.h" 39 #include "player-callsign.h" 40 41 #if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II) 42 #include "fwd-segment.h" 43 #include "player-flags.h" 44 #include "valptridx.h" 45 #include <array> 46 47 namespace dcx { 48 49 struct d_player_unique_endlevel_state 50 { 51 segnum_t transition_segnum; 52 segnum_t exit_segnum; 53 }; 54 55 extern d_player_unique_endlevel_state PlayerUniqueEndlevelState; 56 57 // When this structure changes, increment the constant 58 // SAVE_FILE_VERSION in playsave.c 59 struct player : public prohibit_void_ptr<player> 60 { 61 // Who am I data 62 callsign_t callsign; // The callsign of this player, for net purposes. 63 sbyte connected; // Is the player connected or not? 64 objnum_t objnum; // What object number this player is. (made an int by mk because it's very often referenced) 65 66 // -- make sure you're 4 byte aligned now! 67 68 // Game data 69 uint16_t lives; // Lives remaining, 0 = game over. 70 sbyte level; // Current level player is playing. (must be signed for secret levels) 71 sbyte starting_level; // What level the player started on. 72 73 // Statistics... 74 fix time_level; // Level time played 75 fix time_total; // Game time played (high word = seconds) 76 77 78 short num_kills_level; // Number of kills this level 79 short num_kills_total; // Number of kills total 80 uint8_t hours_level; // Hours played (since time_total can only go up to 9 hours) 81 uint8_t hours_total; // Hours played (since time_total can only go up to 9 hours) 82 }; 83 84 DXX_VALPTRIDX_DEFINE_SUBTYPE_TYPEDEFS(player, player); 85 DXX_VALPTRIDX_DEFINE_GLOBAL_FACTORIES(player, player, Players); 86 } 87 88 namespace dsx { 89 90 // Same as above but structure how Savegames expect 91 struct player_rw 92 { 93 // Who am I data 94 callsign_t callsign; // The callsign of this player, for net purposes. 95 ubyte net_address[6]; // The network address of the player. 96 sbyte connected; // Is the player connected or not? 97 int objnum; // What object number this player is. (made an int by mk because it's very often referenced) 98 int n_packets_got; // How many packets we got from them 99 int n_packets_sent; // How many packets we sent to them 100 101 // -- make sure you're 4 byte aligned now! 102 103 // Game data 104 uint flags; // Powerup flags, see below... 105 fix energy; // Amount of energy remaining. 106 fix shields; // shields remaining (protection) 107 ubyte lives; // Lives remaining, 0 = game over. 108 sbyte level; // Current level player is playing. (must be signed for secret levels) 109 ubyte laser_level; // Current level of the laser. 110 sbyte starting_level; // What level the player started on. 111 short killer_objnum; // Who killed me.... (-1 if no one) 112 #if defined(DXX_BUILD_DESCENT_I) 113 ubyte primary_weapon_flags; // bit set indicates the player has this weapon. 114 ubyte secondary_weapon_flags; // bit set indicates the player has this weapon. 115 #elif defined(DXX_BUILD_DESCENT_II) 116 ushort primary_weapon_flags; // bit set indicates the player has this weapon. 117 ushort secondary_weapon_flags; // bit set indicates the player has this weapon. 118 #endif 119 union { 120 std::array<uint16_t, MAX_PRIMARY_WEAPONS> obsolete_primary_ammo; 121 struct { 122 uint16_t laser_ammo; 123 uint16_t vulcan_ammo; 124 }; 125 }; 126 ushort secondary_ammo[MAX_SECONDARY_WEAPONS]; // How much ammo of each type. 127 128 #if defined(DXX_BUILD_DESCENT_II) 129 ushort pad; // Pad because increased weapon_flags from byte to short -YW 3/22/95 130 #endif 131 // -- make sure you're 4 byte aligned now 132 133 // Statistics... 134 int last_score; // Score at beginning of current level. 135 int score; // Current score. 136 fix time_level; // Level time played 137 fix time_total; // Game time played (high word = seconds) 138 139 fix cloak_time; // Time cloaked 140 fix invulnerable_time; // Time invulnerable 141 142 #if defined(DXX_BUILD_DESCENT_II) 143 short KillGoalCount; // Num of players killed this level 144 #endif 145 short net_killed_total; // Number of times killed total 146 short net_kills_total; // Number of net kills total 147 short num_kills_level; // Number of kills this level 148 short num_kills_total; // Number of kills total 149 short num_robots_level; // Number of initial robots this level 150 short num_robots_total; // Number of robots total 151 ushort hostages_rescued_total; // Total number of hostages rescued. 152 ushort hostages_total; // Total number of hostages. 153 ubyte hostages_on_board; // Number of hostages on ship. 154 ubyte hostages_level; // Number of hostages on this level. 155 fix homing_object_dist; // Distance of nearest homing object. 156 sbyte hours_level; // Hours played (since time_total can only go up to 9 hours) 157 sbyte hours_total; // Hours played (since time_total can only go up to 9 hours) 158 } __pack__; 159 #if defined(DXX_BUILD_DESCENT_I) 160 static_assert(sizeof(player_rw) == 116, "wrong size player_rw"); 161 #elif defined(DXX_BUILD_DESCENT_II) 162 static_assert(sizeof(player_rw) == 142, "wrong size player_rw"); 163 #endif 164 165 } 166 167 #define get_local_player() (*vmplayerptr(Player_num)) 168 #define get_local_plrobj() (*vmobjptr(get_local_player().objnum)) 169 170 namespace dcx { 171 172 struct player_ship 173 { 174 int model_num; 175 int expl_vclip_num; 176 fix mass,drag; 177 fix max_thrust,reverse_thrust,brakes; //low_thrust 178 fix wiggle; 179 fix max_rotthrust; 180 std::array<vms_vector, N_PLAYER_GUNS> gun_points; 181 }; 182 183 } 184 185 #endif 186 187 #endif 188