1-- Copyright © 2008-2021 Pioneer Developers. See AUTHORS.txt for details 2-- Licensed under the terms of the GPL v3. See licenses/GPL-3.txt 3 4local utils = require 'utils' 5local Serializer = require 'Serializer' 6local Lang = require 'Lang' 7local ShipDef = require 'ShipDef' 8local Timer = require 'Timer' 9local Comms = require 'Comms' 10 11local Game = package.core['Game'] 12local Space = package.core['Space'] 13 14 15local EquipTypes = require 'EquipType' 16 17local LaserType = EquipTypes.LaserType 18local EquipType = EquipTypes.EquipType 19local HyperdriveType = EquipTypes.HyperdriveType 20local SensorType = EquipTypes.SensorType 21local BodyScannerType = EquipTypes.BodyScannerType 22 23local cargo = require 'Commodities' 24local laser = EquipTypes.laser 25local hyperspace = EquipTypes.hyperspace 26local misc = EquipTypes.misc 27 28-- Constants: EquipSlot 29-- 30-- Equipment slots. Every equipment or cargo type has a corresponding 31-- "slot" that it fits in to. Each slot has an independent capacity. 32-- 33-- cargo - any cargo (commodity) item 34-- engine - hyperdrives and military drives 35-- laser_front - front attachment point for lasers and plasma accelerators 36-- laser_rear - rear attachment point for lasers and plasma accelerators 37-- missile - missile 38-- ecm - ecm system 39-- radar - radar 40-- target_scanner - target scanner 41-- hypercloud - hyperspace cloud analyser 42-- hull_autorepair - hull auto-repair system 43-- energy_booster - shield energy booster unit 44-- atmo_shield - atmospheric shielding 45-- cabin - cabin 46-- shield - shield 47-- scoop - scoop used for scooping things (cargo, fuel/hydrogen) 48-- laser_cooler - laser cooling booster 49-- cargo_life_support - cargo bay life support 50-- autopilot - autopilot 51-- trade_computer - commodity trade analyzer computer module 52 53misc.missile_unguided = EquipType.New({ 54 l10n_key="MISSILE_UNGUIDED", slots="missile", price=30, 55 missile_type="missile_unguided", tech_level=1, 56 capabilities={mass=1, missile=1}, purchasable=true, 57 icon_name="missile_unguided" 58}) 59misc.missile_guided = EquipType.New({ 60 l10n_key="MISSILE_GUIDED", slots="missile", price=50, 61 missile_type="missile_guided", tech_level=5, 62 capabilities={mass=1}, purchasable=true, 63 icon_name="missile_guided" 64}) 65misc.missile_smart = EquipType.New({ 66 l10n_key="MISSILE_SMART", slots="missile", price=95, 67 missile_type="missile_smart", tech_level=10, 68 capabilities={mass=1}, purchasable=true, 69 icon_name="missile_smart" 70}) 71misc.missile_naval = EquipType.New({ 72 l10n_key="MISSILE_NAVAL", slots="missile", price=160, 73 missile_type="missile_naval", tech_level="MILITARY", 74 capabilities={mass=1}, purchasable=true, 75 icon_name="missile_naval" 76}) 77misc.atmospheric_shielding = EquipType.New({ 78 l10n_key="ATMOSPHERIC_SHIELDING", slots="atmo_shield", price=200, 79 capabilities={mass=1, atmo_shield=9}, 80 purchasable=true, tech_level=3 81}) 82misc.heavy_atmospheric_shielding = EquipType.New({ 83 l10n_key="ATMOSPHERIC_SHIELDING_HEAVY", slots="atmo_shield", price=900, 84 capabilities={mass=2, atmo_shield=19}, 85 purchasable=true, tech_level=5 86}) 87misc.ecm_basic = EquipType.New({ 88 l10n_key="ECM_BASIC", slots="ecm", price=6000, 89 capabilities={mass=2, ecm_power=2, ecm_recharge=5}, 90 purchasable=true, tech_level=9, ecm_type = 'ecm' 91}) 92misc.ecm_advanced = EquipType.New({ 93 l10n_key="ECM_ADVANCED", slots="ecm", price=15200, 94 capabilities={mass=2, ecm_power=3, ecm_recharge=5}, 95 purchasable=true, tech_level="MILITARY", ecm_type = 'ecm_advanced' 96}) 97misc.radar = EquipType.New({ 98 l10n_key="RADAR", slots="radar", price=680, 99 capabilities={mass=1, radar=1}, 100 purchasable=true, tech_level=3 101}) 102misc.cabin = EquipType.New({ 103 l10n_key="UNOCCUPIED_CABIN", slots="cabin", price=1350, 104 capabilities={mass=1, cabin=1}, 105 purchasable=true, tech_level=1 106}) 107misc.cabin_occupied = EquipType.New({ 108 l10n_key="PASSENGER_CABIN", slots="cabin", price=0, 109 capabilities={mass=1}, purchasable=false, tech_level=1 110}) 111misc.shield_generator = EquipType.New({ 112 l10n_key="SHIELD_GENERATOR", slots="shield", price=2500, 113 capabilities={mass=4, shield=1}, purchasable=true, tech_level=8 114}) 115misc.laser_cooling_booster = EquipType.New({ 116 l10n_key="LASER_COOLING_BOOSTER", slots="laser_cooler", price=380, 117 capabilities={mass=1, laser_cooler=2}, purchasable=true, tech_level=8 118}) 119misc.cargo_life_support = EquipType.New({ 120 l10n_key="CARGO_LIFE_SUPPORT", slots="cargo_life_support", price=700, 121 capabilities={mass=1, cargo_life_support=1}, purchasable=true, tech_level=2 122}) 123misc.autopilot = EquipType.New({ 124 l10n_key="AUTOPILOT", slots="autopilot", price=1400, 125 capabilities={mass=1, set_speed=1, autopilot=1}, purchasable=true, tech_level=1 126}) 127misc.target_scanner = EquipType.New({ 128 l10n_key="TARGET_SCANNER", slots="target_scanner", price=900, 129 capabilities={mass=1, target_scanner_level=1}, purchasable=true, tech_level=9 130}) 131misc.advanced_target_scanner = EquipType.New({ 132 l10n_key="ADVANCED_TARGET_SCANNER", slots="target_scanner", price=1200, 133 capabilities={mass=1, target_scanner_level=2}, purchasable=true, tech_level="MILITARY" 134}) 135misc.fuel_scoop = EquipType.New({ 136 l10n_key="FUEL_SCOOP", slots="scoop", price=3500, 137 capabilities={mass=6, fuel_scoop=3}, purchasable=true, tech_level=4 138}) 139misc.cargo_scoop = EquipType.New({ 140 l10n_key="CARGO_SCOOP", slots="scoop", price=3900, 141 capabilities={mass=7, cargo_scoop=1}, purchasable=true, tech_level=5 142}) 143misc.multi_scoop = EquipType.New({ 144 l10n_key="MULTI_SCOOP", slots="scoop", price=12000, 145 capabilities={mass=9, cargo_scoop=1, fuel_scoop=2}, purchasable=true, tech_level=9 146}) 147misc.hypercloud_analyzer = EquipType.New({ 148 l10n_key="HYPERCLOUD_ANALYZER", slots="hypercloud", price=1500, 149 capabilities={mass=1, hypercloud_analyzer=1}, purchasable=true, tech_level=10 150}) 151misc.shield_energy_booster = EquipType.New({ 152 l10n_key="SHIELD_ENERGY_BOOSTER", slots="energy_booster", price=10000, 153 capabilities={mass=8, shield_energy_booster=1}, purchasable=true, tech_level=11 154}) 155misc.hull_autorepair = EquipType.New({ 156 l10n_key="HULL_AUTOREPAIR", slots="hull_autorepair", price=16000, 157 capabilities={mass=40, hull_autorepair=1}, purchasable=true, tech_level="MILITARY" 158}) 159misc.thrusters_basic = EquipType.New({ 160 l10n_key="THRUSTERS_BASIC", slots="thruster", price=3000, 161 tech_level=5, 162 capabilities={mass=0, thruster_power=1}, purchasable=true, 163 icon_name="thrusters_basic" 164}) 165misc.thrusters_medium = EquipType.New({ 166 l10n_key="THRUSTERS_MEDIUM", slots="thruster", price=6500, 167 tech_level=8, 168 capabilities={mass=0, thruster_power=2}, purchasable=true, 169 icon_name="thrusters_medium" 170}) 171misc.thrusters_best = EquipType.New({ 172 l10n_key="THRUSTERS_BEST", slots="thruster", price=14000, 173 tech_level="MILITARY", 174 capabilities={mass=0, thruster_power=3}, purchasable=true, 175 icon_name="thrusters_best" 176}) 177misc.trade_computer = EquipType.New({ 178 l10n_key="TRADE_COMPUTER", slots="trade_computer", price=400, 179 capabilities={mass=0, trade_computer=1}, purchasable=true, tech_level=9 180}) 181misc.planetscanner = BodyScannerType.New({ 182 l10n_key = 'PLANETSCANNER', slots="sensor", price=15000, 183 capabilities={mass=1,sensor=1}, purchasable=false, tech_level=1, 184 icon_on_name="body_scanner_on", icon_off_name="body_scanner_off", 185 max_range=100000000, target_altitude=0, state="HALTED", progress=0, 186 bodyscanner_stats={scan_speed=3, scan_tolerance=0.05} 187}) 188 189hyperspace.hyperdrive_1 = HyperdriveType.New({ 190 l10n_key="DRIVE_CLASS1", fuel=cargo.hydrogen, slots="engine", 191 price=700, capabilities={mass=4, hyperclass=1}, purchasable=true, tech_level=3, 192}) 193hyperspace.hyperdrive_2 = HyperdriveType.New({ 194 l10n_key="DRIVE_CLASS2", fuel=cargo.hydrogen, slots="engine", 195 price=1300, capabilities={mass=10, hyperclass=2}, purchasable=true, tech_level=4, 196}) 197hyperspace.hyperdrive_3 = HyperdriveType.New({ 198 l10n_key="DRIVE_CLASS3", fuel=cargo.hydrogen, slots="engine", 199 price=2500, capabilities={mass=20, hyperclass=3}, purchasable=true, tech_level=4, 200}) 201hyperspace.hyperdrive_4 = HyperdriveType.New({ 202 l10n_key="DRIVE_CLASS4", fuel=cargo.hydrogen, slots="engine", 203 price=5000, capabilities={mass=40, hyperclass=4}, purchasable=true, tech_level=5, 204}) 205hyperspace.hyperdrive_5 = HyperdriveType.New({ 206 l10n_key="DRIVE_CLASS5", fuel=cargo.hydrogen, slots="engine", 207 price=10000, capabilities={mass=120, hyperclass=5}, purchasable=true, tech_level=5, 208}) 209hyperspace.hyperdrive_6 = HyperdriveType.New({ 210 l10n_key="DRIVE_CLASS6", fuel=cargo.hydrogen, slots="engine", 211 price=20000, capabilities={mass=225, hyperclass=6}, purchasable=true, tech_level=6, 212}) 213hyperspace.hyperdrive_7 = HyperdriveType.New({ 214 l10n_key="DRIVE_CLASS7", fuel=cargo.hydrogen, slots="engine", 215 price=30000, capabilities={mass=400, hyperclass=7}, purchasable=true, tech_level=8, 216}) 217hyperspace.hyperdrive_8 = HyperdriveType.New({ 218 l10n_key="DRIVE_CLASS8", fuel=cargo.hydrogen, slots="engine", 219 price=60000, capabilities={mass=580, hyperclass=8}, purchasable=true, tech_level=9, 220}) 221hyperspace.hyperdrive_9 = HyperdriveType.New({ 222 l10n_key="DRIVE_CLASS9", fuel=cargo.hydrogen, slots="engine", 223 price=120000, capabilities={mass=740, hyperclass=9}, purchasable=true, tech_level=10, 224}) 225hyperspace.hyperdrive_mil1 = HyperdriveType.New({ 226 l10n_key="DRIVE_MIL1", fuel=cargo.military_fuel, byproduct=cargo.radioactives, slots="engine", 227 price=23000, capabilities={mass=3, hyperclass=1}, purchasable=true, tech_level=10, 228}) 229hyperspace.hyperdrive_mil2 = HyperdriveType.New({ 230 l10n_key="DRIVE_MIL2", fuel=cargo.military_fuel, byproduct=cargo.radioactives, slots="engine", 231 price=47000, capabilities={mass=8, hyperclass=2}, purchasable=true, tech_level="MILITARY", 232}) 233hyperspace.hyperdrive_mil3 = HyperdriveType.New({ 234 l10n_key="DRIVE_MIL3", fuel=cargo.military_fuel, byproduct=cargo.radioactives, slots="engine", 235 price=85000, capabilities={mass=16, hyperclass=3}, purchasable=true, tech_level=11, 236}) 237hyperspace.hyperdrive_mil4 = HyperdriveType.New({ 238 l10n_key="DRIVE_MIL4", fuel=cargo.military_fuel, byproduct=cargo.radioactives, slots="engine", 239 price=214000, capabilities={mass=30, hyperclass=4}, purchasable=true, tech_level=12, 240}) 241hyperspace.hyperdrive_mil5 = HyperdriveType.New({ 242 l10n_key="DRIVE_MIL5", fuel=cargo.military_fuel, byproduct=cargo.radioactives, slots="engine", 243 price=540000, capabilities={mass=53, hyperclass=5}, purchasable=false, tech_level="MILITARY", 244}) 245hyperspace.hyperdrive_mil6 = HyperdriveType.New({ 246 l10n_key="DRIVE_MIL6", fuel=cargo.military_fuel, byproduct=cargo.radioactives, slots="engine", 247 price=1350000, capabilities={mass=78, hyperclass=6}, purchasable=false, tech_level="MILITARY", 248}) 249hyperspace.hyperdrive_mil7 = HyperdriveType.New({ 250 l10n_key="DRIVE_MIL7", fuel=cargo.military_fuel, byproduct=cargo.radioactives, slots="engine", 251 price=3500000, capabilities={mass=128, hyperclass=7}, purchasable=false, tech_level="MILITARY", 252}) 253hyperspace.hyperdrive_mil8 = HyperdriveType.New({ 254 l10n_key="DRIVE_MIL8", fuel=cargo.military_fuel, byproduct=cargo.radioactives, slots="engine", 255 price=8500000, capabilities={mass=196, hyperclass=8}, purchasable=false, tech_level="MILITARY", 256}) 257hyperspace.hyperdrive_mil9 = HyperdriveType.New({ 258 l10n_key="DRIVE_MIL9", fuel=cargo.military_fuel, byproduct=cargo.radioactives, slots="engine", 259 price=22000000, capabilities={mass=285, hyperclass=9}, purchasable=false, tech_level="MILITARY", 260}) 261 262laser.pulsecannon_1mw = LaserType.New({ 263 l10n_key="PULSECANNON_1MW", price=600, capabilities={mass=1}, 264 slots = {"laser_front", "laser_rear"}, laser_stats = { 265 lifespan=8, speed=1000, damage=1000, rechargeTime=0.25, length=30, 266 width=5, beam=0, dual=0, mining=0, rgba_r = 255, rgba_g = 51, rgba_b = 51, rgba_a = 255 267 }, purchasable=true, tech_level=3 268}) 269laser.pulsecannon_dual_1mw = LaserType.New({ 270 l10n_key="PULSECANNON_DUAL_1MW", price=1100, capabilities={mass=4}, 271 slots = {"laser_front", "laser_rear"}, laser_stats = { 272 lifespan=8, speed=1000, damage=1000, rechargeTime=0.25, length=30, 273 width=5, beam=0, dual=1, mining=0, rgba_r = 255, rgba_g = 51, rgba_b = 51, rgba_a = 255 274 }, purchasable=true, tech_level=4 275}) 276laser.pulsecannon_2mw = LaserType.New({ 277 l10n_key="PULSECANNON_2MW", price=1000, capabilities={mass=3}, 278 slots = {"laser_front", "laser_rear"}, laser_stats = { 279 lifespan=8, speed=1000, damage=2000, rechargeTime=0.25, length=30, 280 width=5, beam=0, dual=0, mining=0, rgba_r = 255, rgba_g = 127, rgba_b = 51, rgba_a = 255 281 }, purchasable=true, tech_level=5 282}) 283laser.pulsecannon_rapid_2mw = LaserType.New({ 284 l10n_key="PULSECANNON_RAPID_2MW", price=1800, capabilities={mass=7}, 285 slots = {"laser_front", "laser_rear"}, laser_stats = { 286 lifespan=8, speed=1000, damage=2000, rechargeTime=0.13, length=30, 287 width=5, beam=0, dual=0, mining=0, rgba_r = 255, rgba_g = 127, rgba_b = 51, rgba_a = 255 288 }, purchasable=true, tech_level=5 289}) 290laser.beamlaser_1mw = LaserType.New({ 291 l10n_key="BEAMLASER_1MW", price=2400, capabilities={mass=3}, 292 slots = {"laser_front", "laser_rear"}, laser_stats = { 293 lifespan=8, speed=1000, damage=1500, rechargeTime=0.25, length=10000, 294 width=1, beam=1, dual=0, mining=0, rgba_r = 255, rgba_g = 51, rgba_b = 127, rgba_a = 255, 295 heatrate=0.02, coolrate=0.01 296 }, purchasable=true, tech_level=4 297}) 298laser.beamlaser_dual_1mw = LaserType.New({ 299 l10n_key="BEAMLASER_DUAL_1MW", price=4800, capabilities={mass=6}, 300 slots = {"laser_front", "laser_rear"}, laser_stats = { 301 lifespan=8, speed=1000, damage=1500, rechargeTime=0.5, length=10000, 302 width=1, beam=1, dual=1, mining=0, rgba_r = 255, rgba_g = 51, rgba_b = 127, rgba_a = 255, 303 heatrate=0.02, coolrate=0.01 304 }, purchasable=true, tech_level=5 305}) 306laser.beamlaser_2mw = LaserType.New({ 307 l10n_key="BEAMLASER_RAPID_2MW", price=5600, capabilities={mass=7}, 308 slots = {"laser_front", "laser_rear"}, laser_stats = { 309 lifespan=8, speed=1000, damage=3000, rechargeTime=0.13, length=20000, 310 width=1, beam=1, dual=0, mining=0, rgba_r = 255, rgba_g = 192, rgba_b = 192, rgba_a = 255, 311 heatrate=0.02, coolrate=0.01 312 }, purchasable=true, tech_level=6 313}) 314laser.pulsecannon_4mw = LaserType.New({ 315 l10n_key="PULSECANNON_4MW", price=2200, capabilities={mass=10}, 316 slots = {"laser_front", "laser_rear"}, laser_stats = { 317 lifespan=8, speed=1000, damage=4000, rechargeTime=0.25, length=30, 318 width=5, beam=0, dual=0, mining=0, rgba_r = 255, rgba_g = 255, rgba_b = 51, rgba_a = 255 319 }, purchasable=true, tech_level=6 320}) 321laser.pulsecannon_10mw = LaserType.New({ 322 l10n_key="PULSECANNON_10MW", price=4900, capabilities={mass=30}, 323 slots = {"laser_front", "laser_rear"}, laser_stats = { 324 lifespan=8, speed=1000, damage=10000, rechargeTime=0.25, length=30, 325 width=5, beam=0, dual=0, mining=0, rgba_r = 51, rgba_g = 255, rgba_b = 51, rgba_a = 255 326 }, purchasable=true, tech_level=7 327}) 328laser.pulsecannon_20mw = LaserType.New({ 329 l10n_key="PULSECANNON_20MW", price=12000, capabilities={mass=65}, 330 slots = {"laser_front", "laser_rear"}, laser_stats = { 331 lifespan=8, speed=1000, damage=20000, rechargeTime=0.25, length=30, 332 width=5, beam=0, dual=0, mining=0, rgba_r = 0.1, rgba_g = 51, rgba_b = 255, rgba_a = 255 333 }, purchasable=true, tech_level="MILITARY" 334}) 335laser.miningcannon_5mw = LaserType.New({ 336 l10n_key="MININGCANNON_5MW", price=3700, capabilities={mass=6}, 337 slots = {"laser_front", "laser_rear"}, laser_stats = { 338 lifespan=8, speed=1000, damage=5000, rechargeTime=1.5, length=30, 339 width=5, beam=0, dual=0, mining=1, rgba_r = 51, rgba_g = 127, rgba_b = 0, rgba_a = 255 340 }, purchasable=true, tech_level=5 341}) 342laser.miningcannon_17mw = LaserType.New({ 343 l10n_key="MININGCANNON_17MW", price=10600, capabilities={mass=10}, 344 slots = {"laser_front", "laser_rear"}, laser_stats = { 345 lifespan=8, speed=1000, damage=17000, rechargeTime=2, length=30, 346 width=5, beam=0, dual=0, mining=1, rgba_r = 51, rgba_g = 127, rgba_b = 0, rgba_a = 255 347 }, purchasable=true, tech_level=8 348}) 349laser.small_plasma_accelerator = LaserType.New({ 350 l10n_key="SMALL_PLASMA_ACCEL", price=120000, capabilities={mass=22}, 351 slots = {"laser_front", "laser_rear"}, laser_stats = { 352 lifespan=8, speed=1000, damage=50000, rechargeTime=0.3, length=42, 353 width=7, beam=0, dual=0, mining=0, rgba_r = 51, rgba_g = 255, rgba_b = 255, rgba_a = 255 354 }, purchasable=true, tech_level=10 355}) 356laser.large_plasma_accelerator = LaserType.New({ 357 l10n_key="LARGE_PLASMA_ACCEL", price=390000, capabilities={mass=50}, 358 slots = {"laser_front", "laser_rear"}, laser_stats = { 359 lifespan=8, speed=1000, damage=100000, rechargeTime=0.3, length=42, 360 width=7, beam=0, dual=0, mining=0, rgba_r = 127, rgba_g = 255, rgba_b = 255, rgba_a = 255 361 }, purchasable=true, tech_level=12 362}) 363 364local serialize = function() 365 local ret = {} 366 for _,k in ipairs{"cargo","laser", "hyperspace", "misc"} do 367 local tmp = {} 368 for kk, vv in pairs(EquipTypes[k]) do 369 tmp[kk] = vv 370 end 371 ret[k] = tmp 372 end 373 return ret 374end 375 376local unserialize = function (data) 377 for _,k in ipairs{"cargo","laser", "hyperspace", "misc"} do 378 local tmp = EquipTypes[k] 379 for kk, vv in pairs(data[k]) do 380 tmp[kk] = vv 381 end 382 end 383end 384 385Serializer:Register("Equipment", serialize, unserialize) 386 387return EquipTypes 388