aboutsummaryrefslogtreecommitdiff
path: root/games/pioneer/files/patch-data_modules_SearchRescue_SearchRescue.lua
blob: 05fe8d3e0997488bc9709c09a7bbc40860791d90 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Fix SAR selection of ship sizes for missions
https://github.com/pioneerspacesim/pioneer/commit/008e30a857036a8cc40c42bf89ef68e65b47a41e

--- data/modules/SearchRescue/SearchRescue.lua.orig	2017-10-01 00:01:47 UTC
+++ data/modules/SearchRescue/SearchRescue.lua
@@ -613,7 +613,20 @@ local createTargetShipParameters = funct
 	---- loading drive, weapons etc.
 	if flavour.id == 1 or flavour.id == 6 then
 		for i,shipdef in pairs(shipdefs) do
-			if shipdef.capacity / 10 < 1 then shipdefs[i] = nil end
+
+			-- get mass of hyperdrive if this ship has a default drive
+			-- if no default drive assume lowest mass drive
+			-- higher mass drives will only be fitted later at ship creation if capacity is huge
+			local drive = Equipment.hyperspace['hyperdrive_'..tostring(shipdef.hyperdriveClass)]
+			if not drive then
+				local drives = {}
+				for i = 9, 1, -1 do
+					table.insert(drives, Equipment.hyperspace['hyperdrive_'..tostring(i)])
+				end
+				table.sort(drives, function (a,b) return a.capabilities.mass < b.capabilities.mass end)
+				drive = drives[1]
+			end
+			if (shipdef.capacity-drive.capabilities.mass) / 10 < 1 then shipdefs[i] = nil end
 		end
 	elseif flavour.pickup_pass > 0 then
 		for i,shipdef in pairs(shipdefs) do
@@ -661,7 +674,16 @@ local createTargetShipParameters = funct
 	if flavour.id == 1 or flavour.id == 6 then
 		local any_pass = rand:Integer(0,1)
 		if any_pass > 0 then
-			pickup_pass = rand:Integer(1, math.min((shipdef.capacity / 10)+1, max_pass))
+			local drive = Equipment.hyperspace['hyperdrive_'..tostring(shipdef.hyperdriveClass)]
+			if not drive then
+				local drives = {}
+				for i = 9, 1, -1 do
+					table.insert(drives, Equipment.hyperspace['hyperdrive_'..tostring(i)])
+				end
+				table.sort(drives, function (a,b) return a.capabilities.mass < b.capabilities.mass end)
+				drive = drives[1]
+			end
+			pickup_pass = rand:Integer(1, math.min(((shipdef.capacity-drive.capabilities.mass) / 10)+1, max_pass))
 		else
 			pickup_pass = 0
 		end
@@ -709,22 +731,25 @@ local createTargetShip = function (missi
 	ship:SetPattern(pattern)
 
 	-- load a hyperdrive
-	local default_drive = Equipment.hyperspace['hyperdrive_'..tostring(shipdef.hyperdriveClass)]
-	if default_drive then
-		ship:AddEquip(default_drive)
-	else
-		local drive
+	-- 1st try: default drive for this ship class
+	-- 2nd try: largest drive possible that doesn't take more than a 10th of available room
+	-- fallback: smallest drive
+	local drives = {}
+	local drive = Equipment.hyperspace['hyperdrive_'..tostring(shipdef.hyperdriveClass)]
+	if not drive then
 		for i = 9, 1, -1 do
-			drive = Equipment.hyperspace['hyperdrive_'..tostring(i)]
-			if shipdef.capacity / 10 > drive.capabilities.mass then
-				ship:AddEquip(drive)
-				break
-			end
+			table.insert(drives, Equipment.hyperspace['hyperdrive_'..tostring(i)])
 		end
-		if not drive then
-			ship:AddEquip(Equipment.hyperspace['hyperdrive_1'])
+		table.sort(drives, function (a,b) return a.capabilities.mass < b.capabilities.mass end)
+		for i = #drives, 1, -1 do
+			local test_drive = drives[i]
+			if shipdef.capacity / 10 > test_drive.capabilities.mass then
+				drive = test_drive
+			end
 		end
 	end
+	if not drive then drive = drives[1] end
+	ship:AddEquip(drive)
 
 	-- add thruster fuel
 	if mission.flavour.id == 2 or mission.flavour.id == 4 or mission.flavour.id == 5 then