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