forked from xyqyear/auto-crossbreeding
-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathautoStat.lua
153 lines (137 loc) · 3.87 KB
/
autoStat.lua
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
local gps = require("gps")
local action = require("action")
local database = require("database")
local scanner = require("scanner")
local posUtil = require("posUtil")
local config = require("config")
local args = {...}
local nonstop = false
local docleanup = false
if #args == 1 then
if args[1] == "docleanup" then
docleanup = true
elseif args[1] == "nonstop" then
nonstop = true
end
end
local lowestStat;
local lowestStatSlot;
local workingCrop;
local function updateLowest()
lowestStat = 64
lowestStatSlot = 0
local farm = database.getFarm()
local workingCropName = database.getFarm()[1].name
for slot=1, config.farmArea, 2 do
local crop = farm[slot]
if crop ~= nil then
if crop.name == 'crop' then
lowestStatSlot = slot
break;
else
local stat = crop.gr+crop.ga-crop.re
if stat < lowestStat then
lowestStat = stat
lowestStatSlot = slot
end
end
end
end
end
local function findSuitableFarmSlot(crop)
if crop.gr+crop.ga-crop.re > lowestStat then
return lowestStatSlot
else
return 0
end
end
local function isWeed(crop)
return crop.name == "weed" or
crop.name == "Grass" or
crop.gr > 21 or
(crop.name == "venomilia" and crop.gr > 7);
end
local function checkOffspring(slot, crop)
if crop.name == "air" then
action.placeCropStick(2)
elseif (not config.assumeNoBareStick) and crop.name == "crop" then
action.placeCropStick()
elseif crop.isCrop then
if isWeed(crop) then
action.deweed()
action.placeCropStick()
elseif crop.name == workingCrop then
local suitableSlot = findSuitableFarmSlot(crop)
if suitableSlot == 0 then
action.deweed()
action.placeCropStick()
else
action.transplant(posUtil.farmToGlobal(slot), posUtil.farmToGlobal(suitableSlot))
action.placeCropStick(2)
database.updateFarm(suitableSlot, crop)
updateLowest()
end
elseif config.keepNewCropWhileMinMaxing and (not database.existInStorage(crop)) then
action.transplant(posUtil.farmToGlobal(slot), posUtil.storageToGlobal(database.nextStorageSlot()))
action.placeCropStick(2)
database.addToStorage(crop)
else
action.deweed()
action.placeCropStick()
end
end
end
local function checkParent(slot, crop)
if crop.isCrop and isWeed(crop) then
action.deweed();
database.updateFarm(slot, {name='crop'});
updateLowest();
end
end
local function breedOnce()
-- return true if all stats are maxed out
-- 52 = 21(max gr) + 31(max ga) - 0 (min re)
if not nonstop and lowestStat == 50 then
return true
end
for slot=1, config.farmArea, 1 do
gps.go(posUtil.farmToGlobal(slot))
local crop = scanner.scan()
if (slot % 2 == 0) then
checkOffspring(slot, crop);
else
checkParent(slot, crop);
end
if action.needCharge() then
action.charge()
end
end
return false
end
local function init()
database.scanFarm()
if config.keepNewCropWhileMinMaxing then
database.scanStorage()
end
workingCrop = database.getFarm()[1].name;
updateLowest()
action.restockAll()
end
local function main()
init()
while not breedOnce() do
gps.go({0,0})
action.restockAll()
end
gps.go({0,0})
if docleanup then
action.destroyAll()
gps.go({0,0})
end
if config.takeCareOfDrops then
action.dumpInventory()
end
gps.turnTo(1)
print("Done.\nAll crops are now 21/31/0")
end
main()