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  * Powerup header file.
23  *
24  */
25 
26 #pragma once
27 
28 #include "dxxsconf.h"
29 #include "fwd-vclip.h"
30 #include "fmtcheck.h"
31 #include "fwd-object.h"
32 
33 #if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II)
34 enum powerup_type_t : uint8_t
35 {
36 	POW_EXTRA_LIFE = 0,
37 	POW_ENERGY = 1,
38 	POW_SHIELD_BOOST = 2,
39 	POW_LASER = 3,
40 
41 	POW_KEY_BLUE = 4,
42 	POW_KEY_RED = 5,
43 	POW_KEY_GOLD = 6,
44 
45 //	POW_RADAR_ROBOTS = 7,
46 //	POW_RADAR_POWERUPS = 8,
47 
48 	POW_MISSILE_1 = 10,
49 	POW_MISSILE_4 = 11,      // 4-pack MUST follow single missile
50 
51 	POW_QUAD_FIRE = 12,
52 
53 	POW_VULCAN_WEAPON = 13,
54 	POW_SPREADFIRE_WEAPON = 14,
55 	POW_PLASMA_WEAPON = 15,
56 	POW_FUSION_WEAPON = 16,
57 	POW_PROXIMITY_WEAPON = 17,
58 	POW_HOMING_AMMO_1 = 18,
59 	POW_HOMING_AMMO_4 = 19,      // 4-pack MUST follow single missile
60 	POW_SMARTBOMB_WEAPON = 20,
61 	POW_MEGA_WEAPON = 21,
62 	POW_VULCAN_AMMO = 22,
63 	POW_CLOAK = 23,
64 	POW_TURBO = 24,
65 	POW_INVULNERABILITY = 25,
66 	POW_MEGAWOW = 27,
67 #if defined(DXX_BUILD_DESCENT_II)
68 	POW_GAUSS_WEAPON = 28,
69 	POW_HELIX_WEAPON = 29,
70 	POW_PHOENIX_WEAPON = 30,
71 	POW_OMEGA_WEAPON = 31,
72 
73 	POW_SUPER_LASER = 32,
74 	POW_FULL_MAP = 33,
75 	POW_CONVERTER = 34,
76 	POW_AMMO_RACK = 35,
77 	POW_AFTERBURNER = 36,
78 	POW_HEADLIGHT = 37,
79 
80 	POW_SMISSILE1_1 = 38,
81 	POW_SMISSILE1_4 = 39,      // 4-pack MUST follow single missile
82 	POW_GUIDED_MISSILE_1 = 40,
83 	POW_GUIDED_MISSILE_4 = 41,      // 4-pack MUST follow single missile
84 	POW_SMART_MINE = 42,
85 	POW_MERCURY_MISSILE_1 = 43,
86 	POW_MERCURY_MISSILE_4 = 44,      // 4-pack MUST follow single missile
87 	POW_EARTHSHAKER_MISSILE = 45,
88 
89 	POW_FLAG_BLUE = 46,
90 	POW_FLAG_RED = 47,
91 
92 	POW_HOARD_ORB = 7,       // use unused slot
93 #endif
94 };
95 
96 #ifdef dsx
97 namespace dcx {
98 constexpr std::integral_constant<unsigned, 16> POWERUP_NAME_LENGTH{};
99 }
100 
101 namespace dsx {
102 #if defined(DXX_BUILD_DESCENT_I)
103 #define VULCAN_AMMO_MAX             (392u*2)
104 constexpr std::integral_constant<unsigned, 29> MAX_POWERUP_TYPES{};
105 #elif defined(DXX_BUILD_DESCENT_II)
106 #define VULCAN_AMMO_MAX             (392u*4)
107 #define GAUSS_WEAPON_AMMO_AMOUNT    392
108 
109 constexpr std::integral_constant<unsigned, 50> MAX_POWERUP_TYPES{};
110 #endif
111 #define VULCAN_WEAPON_AMMO_AMOUNT   196
112 #define VULCAN_AMMO_AMOUNT          (49*2)
113 
114 #if DXX_USE_EDITOR
115 using powerup_names_array = std::array<std::array<char, POWERUP_NAME_LENGTH>, MAX_POWERUP_TYPES>;
116 extern powerup_names_array Powerup_names;
117 #endif
118 
119 }
120 #endif
121 
122 namespace dcx {
123 
124 struct powerup_type_info : public prohibit_void_ptr<powerup_type_info>
125 {
126 	int vclip_num;
127 	int hit_sound;
128 	fix size;       // 3d size of longest dimension
129 	fix light;      // amount of light cast by this powerup, set in bitmaps.tbl
130 };
131 
132 void powerup_type_info_read(PHYSFS_File *fp, powerup_type_info &pti);
133 void powerup_type_info_write(PHYSFS_File *fp, const powerup_type_info &pti);
134 
135 extern unsigned N_powerup_types;
136 
137 }
138 
139 //returns true if powerup consumed
140 #ifdef dsx
141 namespace dsx {
142 void draw_powerup(const d_vclip_array &Vclip, grs_canvas &, const object_base &obj);
143 using d_powerup_info_array = std::array<powerup_type_info, MAX_POWERUP_TYPES>;
144 extern d_powerup_info_array Powerup_info;
145 int do_powerup(vmobjptridx_t obj);
146 
147 //process (animate) a powerup for one frame
148 void do_powerup_frame(const d_vclip_array &Vclip, vmobjptridx_t obj);
149 
150 void do_megawow_powerup(object &plrobj, int quantity);
151 
152 void powerup_basic_str(int redadd, int greenadd, int blueadd, int score, const char *str) __attribute_nonnull();
153 }
154 #endif
155 #endif
156