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