SHOW:
|
|
- or go back to the newest paste.
1 | --Скрипт для робота, для поднятия статов у кропсов или разведения дубликатов (режим задается константой mode) | |
2 | - | --Автор: aka_zaratustra осень 2020 |
2 | + | --Автор: iMrSkull осень 2025 |
3 | - | local ver = "1.1.3" -- версия программы |
3 | + | local ver = "1" -- версия программы |
4 | - | --Историю версий см. в конце файла |
4 | + | |
5 | -- схема грядки | |
6 | --|C1|M1|C2 | |
7 | --|M2|C3|M3 | |
8 | --|C4|M4|C5 | |
9 | --|CH|P0|BR | |
10 | ||
11 | -- P0 - исходное положение робота. Робот находится на 1 блок выше кропсов (чтобы мог летать над ними), смотрит на север (в сторону грядок). В руках у робота должна быть лопатка vajra. В первом слоте инвентори робота или должны быть палки или он должен быть пустой (робот сам возьмет и положет туда палки) | |
12 | - | -- P0 - исходное положение робота. Робот находится на 1 блок выше кропсов (чтобы мог летать над ними), смотрит на север (в сторону грядок). В руках у робота должна быть лопатка Spade. В первом слоте инвентори робота или должны быть палки или он должен быть пустой (робот сам возьмет и положет туда палки) |
12 | + | |
13 | -- M[n] - материнские растения | |
14 | -- СН - chest, сундук, куда будут помещаться мешочки с семечками и урожай | |
15 | -- BR - барель с кропсами(палками) | |
16 | ||
17 | -- В начале работы материнские кропсы должны быть высажены на грядку. Дочерние (разводимые) могут быть высажены, а может быть голая земля. | |
18 | -- У робота должны в обязательном порядке присутстовать компоненты: Geolyzer, Inventory Upgrade, Inventory Controller Upgrade | |
19 | -- Рекомендуется для удобства поместить файл с этим скриптом в папку /home/ , а имя файла скрипта добавить в файл /home/.shrc - тогда скрипт будет запускаться при включении робота автоматически | |
20 | -- Если в бочке кончаются кропсы(палки), робот сломает пустые палки, если они есть на поле и завершит свою работу с ошибкой (чтобы всё поле не сожрали сорняки) | |
21 | -- Максимальные статы кропсов, выше которых робот поднимать статы выводимых кропсов не будет, задаются константами max_grow и max_gain | |
22 | -- Стат resistans робот не поднимает, а при возможости опускает до 0 | |
23 | -- Начиная с версии 1.1.3 робот перестал быть уязвим к коллизиям. Нахождение игрока на пути следования робота больше не приводит к потере роботом маршрута. Робот после столкновения с игроком замирает на секунду, после чего продолжает попытку движения. | |
24 | -- Механизм оценки приемлемости (качества) полученного растения менять в функции howInterestingIsThisCrop(с) | |
25 | -- При наличии интернет карты в роботе, скрипт в робота можно загрузить командой `pastebin get cZY3P7As -f crop_stats.lua` | |
26 | ||
27 | -- mode: | |
28 | -- 1 - режим поднятия статов кропсов | |
29 | -- 2 - режим разведения дубликатов кропсов (НЕ ТЕСТИРОВАЛСЯ! НЕ ИСПОЛЬЗОВАТЬ!) | |
30 | local mode = 1 | |
31 | -- выше заданных здесь значений робот понимать статы не будет | |
32 | local max_grow = 20 -- если больше 23, то кроп начинает вести себя как сорняк | |
33 | local max_gain = 28 | |
34 | local grow_kill = 24 -- значение стата grow, при котором и выше которого робот будет убивать растение на корню | |
35 | ||
36 | local robot = require("robot") | |
37 | local computer = require("computer") | |
38 | local component = require("component") | |
39 | local geo = component.geolyzer | |
40 | local cropname | |
41 | ||
42 | local c_cropname = {} --имена дочерних кропов | |
43 | --статы дочерних кропов | |
44 | local c_gain = {} | |
45 | local c_grow = {} | |
46 | local c_resistans = {} | |
47 | local c_size = {} | |
48 | local c_maxSize = {} | |
49 | ||
50 | -- статус может принимать значения: | |
51 | -- "unknown" - неисследованный. назначается при старте, дальше не используется | |
52 | -- "double crop" - жердочки | |
53 | -- "growing" - растущий кроп, у которого статы или дошли до целевых или лучше материнских. после вырастания или отправится в сундук или может заменить собой материнский кроп | |
54 | local c_status = {"unknown", "unknown", "unknown", "unknown", "unknown"} -- "unknown" для всех пяти дочерних кропов | |
55 | ||
56 | ||
57 | local m_gain = {} | |
58 | local m_grow = {} | |
59 | local m_resistans = {} | |
60 | ||
61 | local error_string | |
62 | local bestSeedsSlot --слот в инвентори робота с семенами с лучшими статами | |
63 | local robotLocation -- текущее местонаходение робота. значение из списка: {"С1", "С2", ... , "С5", "M1", "M2", "M3", "M4", "P0"} | |
64 | ||
65 | ||
66 | function robot_error(msg) | |
67 | print("Ошибка: ", msg) | |
68 | computer.beep(1000,0.3) | |
69 | computer.beep(1000,0.3) | |
70 | computer.beep(1000,0.3) | |
71 | os.exit() | |
72 | end | |
73 | ||
74 | function robotTryForward() -- роботы пытается сделать шаг вперед, до тех пор, пока ему это не удастся | |
75 | while robot.forward() == nil do | |
76 | print("Робот столкнулся с препятствием.") | |
77 | os.sleep(1) -- останавливаем робота на 1 секунду | |
78 | end | |
79 | end | |
80 | -------------------------------------- | |
81 | function get_crop_stat(analyze_result, stat_name) --функция - просматривает таблицу скана блока и возвращает значение поля, имя которого передано в stat_name. если не находит, то возвращает nil | |
82 | ||
83 | --file = io.open("log.txt", "a") --файл для лога | |
84 | ||
85 | found = false | |
86 | for name, v in pairs(analyze_result) do --просмотрим таблицу реультата анализа кропса | |
87 | ||
88 | pos = string.find(name, stat_name) | |
89 | --print(pos) | |
90 | if pos ~= nil then -- если строку в метадате нашли | |
91 | found = true | |
92 | --print(v) | |
93 | return v | |
94 | end | |
95 | end | |
96 | ||
97 | end | |
98 | ||
99 | function robotMove_P0_M1() | |
100 | --исходное положение P0 смотрит вверх | |
101 | robotTryForward() | |
102 | robotTryForward() | |
103 | robotTryForward() | |
104 | --конечное положение M1 смотрит вверх | |
105 | end | |
106 | function robotMove_M1_M2() | |
107 | --начальное положение M1 смотрит вверх | |
108 | robot.turnLeft() | |
109 | robotTryForward() | |
110 | robot.turnLeft() | |
111 | robotTryForward() | |
112 | --конечное положение M2 смотрит вниз | |
113 | end | |
114 | function robotMove_M2_M3() | |
115 | --начальное положение M2 смотрит вниз | |
116 | robot.turnLeft() | |
117 | robotTryForward() | |
118 | robotTryForward() | |
119 | --конечное положение M3 смотрит вправо | |
120 | end | |
121 | function robotMove_M3_M4() | |
122 | --начальное положение M3 смотрит вправо | |
123 | robot.turnRight() | |
124 | robotTryForward() | |
125 | robot.turnRight() | |
126 | robotTryForward() | |
127 | --конечное положение M4 смотрит влево | |
128 | end | |
129 | function robotMove_M4_P0() | |
130 | --начальное положение M4 смотрит влево | |
131 | robot.turnLeft() | |
132 | robotTryForward() | |
133 | robot.turnAround() | |
134 | --конечное положение P0 смотрит вверх | |
135 | end | |
136 | function robotMove_P0_C1() | |
137 | --начальное положение P0 смотрит вверх | |
138 | robotTryForward() | |
139 | robotTryForward() | |
140 | robotTryForward() | |
141 | robot.turnLeft() | |
142 | robotTryForward() | |
143 | --конечное положение C1 смотрит влево | |
144 | end | |
145 | function robotMove_C1_C4() | |
146 | --начальное положение C1 смотрит влево | |
147 | robot.turnLeft() | |
148 | robotTryForward() | |
149 | robotTryForward() | |
150 | --конечное положение C4 смотрит вниз | |
151 | end | |
152 | function robotMove_C4_C5() | |
153 | --начальное положение C4 смотрит вниз | |
154 | robot.turnLeft() | |
155 | robotTryForward() | |
156 | robotTryForward() | |
157 | --конечное положение C5 смотрит вправо | |
158 | end | |
159 | function robotMove_C5_C2() | |
160 | --начальное положение C5 смотрит вправо | |
161 | robot.turnLeft() | |
162 | robotTryForward() | |
163 | robotTryForward() | |
164 | --конечное положение C2 смотрит вверх | |
165 | end | |
166 | function robotMove_C2_C3() | |
167 | --начальное положение C2 смотрит вверх | |
168 | robot.turnLeft() | |
169 | robotTryForward() | |
170 | robot.turnLeft() | |
171 | robotTryForward() | |
172 | --конечное положение C3 смотрит вниз | |
173 | end | |
174 | function robotMove_C3_P0() | |
175 | --начальное положение C3 смотрит вниз | |
176 | robotTryForward() | |
177 | robotTryForward() | |
178 | robot.turnAround() | |
179 | --конечное положение P0 смотрит вверх | |
180 | end | |
181 | function robotGoToParkFrom_M_Crop(m) --едем на парковку. "m" - номер материнского кропа с которого мы едем | |
182 | if m == 1 then | |
183 | --начальное положение M1 смотрит вверх | |
184 | robot.turnAround() | |
185 | robotTryForward() | |
186 | robotTryForward() | |
187 | robotTryForward() | |
188 | robot.turnAround() | |
189 | --конечное положение P0 смотрит вверх | |
190 | end | |
191 | if m == 2 then | |
192 | --начальное положение M2 смотрит влево | |
193 | robot.turnAround() | |
194 | robotTryForward() | |
195 | robot.turnRight() | |
196 | robotTryForward() | |
197 | robotTryForward() | |
198 | robot.turnAround() | |
199 | --конечное положение P0 смотрит вверх | |
200 | end | |
201 | if m == 3 then | |
202 | --начальное положение M3 смотрит вправо | |
203 | robot.turnAround() | |
204 | robotTryForward() | |
205 | robot.turnLeft() | |
206 | robotTryForward() | |
207 | robotTryForward() | |
208 | robot.turnAround() | |
209 | --конечное положение P0 смотрит вверх | |
210 | end | |
211 | if m == 4 then | |
212 | --начальное положение M4 смотрит влево | |
213 | robot.turnLeft() | |
214 | robotTryForward() | |
215 | robot.turnAround() | |
216 | --конечное положение P0 смотрит вверх | |
217 | end | |
218 | end | |
219 | function robotGoToPark(c) --едем на парковку. "с" - номер дочернего кропа с которого мы едем | |
220 | if c == 1 then | |
221 | --начальное положение C1 смотрит влево | |
222 | robot.turnAround() | |
223 | robotTryForward() | |
224 | robot.turnRight() | |
225 | robotTryForward() | |
226 | robotTryForward() | |
227 | robotTryForward() | |
228 | robot.turnAround() | |
229 | --конечное положение P0 смотрим вверх | |
230 | end | |
231 | if c == 2 then | |
232 | --начальное положение C2 смотрит вверх | |
233 | robot.turnLeft() | |
234 | robotTryForward() | |
235 | robot.turnLeft() | |
236 | robotTryForward() | |
237 | robotTryForward() | |
238 | robotTryForward() | |
239 | robot.turnAround() | |
240 | --конечное положение P0 смотрим вверх | |
241 | end | |
242 | if c == 3 then | |
243 | --начальное положение C3 смотрит вниз | |
244 | robotTryForward() | |
245 | robotTryForward() | |
246 | robot.turnAround() | |
247 | --конечное положение P0 смотрим вверх | |
248 | end | |
249 | if c == 4 then | |
250 | --начальное положение C4 смотрит вниз | |
251 | robot.turnLeft() | |
252 | robotTryForward() | |
253 | robot.turnRight() | |
254 | robotTryForward() | |
255 | robot.turnAround() | |
256 | --конечное положение P0 смотрим вверх | |
257 | end | |
258 | if c == 5 then | |
259 | --начальное положение C5 смотрит вправо | |
260 | robot.turnAround() | |
261 | robotTryForward() | |
262 | robot.turnLeft() | |
263 | robotTryForward() | |
264 | robot.turnAround() | |
265 | --конечное положение P0 смотрим вверх | |
266 | end | |
267 | ||
268 | end | |
269 | function robotGoTo_M_Crop_FromPark(m) --едем с парковки P0 к материнскому кропу. "m" - номер кропа к которому мы едем | |
270 | if m==1 then | |
271 | --исходное положение P0 смотрит вверх | |
272 | robotTryForward() | |
273 | robotTryForward() | |
274 | robotTryForward() | |
275 | --конечное положение M1 смотрит вверх | |
276 | end | |
277 | if m==2 then | |
278 | --начальное положение P0 смотрит вверх | |
279 | robotTryForward() | |
280 | robotTryForward() | |
281 | robot.turnLeft() | |
282 | robotTryForward() | |
283 | --конечное положение M2 смотрит влево | |
284 | end | |
285 | if m==3 then | |
286 | --начальное положение P0 смотрит вверх | |
287 | robotTryForward() | |
288 | robotTryForward() | |
289 | robot.turnRight() | |
290 | robotTryForward() | |
291 | --конечное положение M3 смотрит вправо | |
292 | end | |
293 | if m==4 then | |
294 | --начальное положение P0 смотрит вверх | |
295 | robotTryForward() | |
296 | robot.turnLeft() | |
297 | --конечное положение M4 смотрит влево | |
298 | end | |
299 | end | |
300 | function robotGoTo_C_Crop_FromPark(c) --едем с парковки P0 к дочернему кропу. "с" - номер кропа к которому мы едем | |
301 | if c == 1 then | |
302 | --начальное положение P0 смотрим вверх | |
303 | robotTryForward() | |
304 | robotTryForward() | |
305 | robotTryForward() | |
306 | robot.turnLeft() | |
307 | robotTryForward() | |
308 | --конечное положение C1 смотрит влево | |
309 | end | |
310 | if c == 2 then | |
311 | --начальное положение P0 смотрим вверх | |
312 | robotTryForward() | |
313 | robotTryForward() | |
314 | robotTryForward() | |
315 | robot.turnRight() | |
316 | robotTryForward() | |
317 | robot.turnLeft() | |
318 | --конечное положение C2 смотрит вверх | |
319 | end | |
320 | if c == 3 then | |
321 | --начальное положение P0 смотрим вверх | |
322 | robotTryForward() | |
323 | robotTryForward() | |
324 | robot.turnAround() | |
325 | --конечное положение C3 смотрит вниз | |
326 | end | |
327 | if c == 4 then | |
328 | --начальное положение P0 смотрим вверх | |
329 | robotTryForward() | |
330 | robot.turnLeft() | |
331 | robotTryForward() | |
332 | robot.turnLeft() | |
333 | --конечное положение C4 смотрит вниз | |
334 | end | |
335 | if c == 5 then | |
336 | --начальное положение P0 смотрим вверх | |
337 | robotTryForward() | |
338 | robot.turnRight() | |
339 | robotTryForward() | |
340 | --конечное положение C5 смотрит вправо | |
341 | end | |
342 | ||
343 | end | |
344 | function grabCropsFromBarrel() --пополняем запас палок в роботе из бочки. | |
345 | --возвращает true если после попытки взять палки, есть хотя бы одна палка в роботе | |
346 | --возвращает false если палки в роботе и в бочке кончились | |
347 | cropsStackSize = 62 --размер стака палок, который робот возит с собой. 62 потому что при уничтожения кропса робот выдерает из земли и палки, и они могут попасть в нецелевой слот | |
348 | ||
349 | --палки лежат в первом слоте | |
350 | returnValue = true | |
351 | itemCount = robot.count(1) | |
352 | if itemCount < cropsStackSize then --если палок неполный стак, до доберем из бочки | |
353 | robot.select(1) --активизируем слот, в котором лежат палки | |
354 | robot.turnRight() --повернемся к бочке | |
355 | --добираем палок до полного стака | |
356 | robot.suck(cropsStackSize-itemCount) | |
357 | itemCount = robot.count(1) --смотрим сколько палок в роботе | |
358 | if itemCount == 0 then --если палки в роботе кончились | |
359 | returnValue = false --возвращаем признак, что ПАЛКИ В РОБОТЕ И БОЧКЕ КОНЧИЛИСЬ | |
360 | elseif itemCount < cropsStackSize then --если после попытки взять палки из бочки, мы имеем меньше стака палок в роботе | |
361 | print("В бочке закончились палки!") | |
362 | computer.beep(1000,1) | |
363 | returnValue = true | |
364 | else | |
365 | returnValue = true | |
366 | end | |
367 | robot.turnLeft() --повернемся обратно к кропсам | |
368 | end | |
369 | return returnValue | |
370 | end | |
371 | function dropToChest() --все что есть в инвентори, скидываем в сундук | |
372 | --начальная позиция - P0 смотрим вверх | |
373 | robot.turnLeft() | |
374 | for i=2,16 do | |
375 | item = component.inventory_controller.getStackInInternalSlot(i) | |
376 | if item then --если в слоте что-то есть | |
377 | robot.select(i) | |
378 | robot.drop() --сдаем все из текущего слота в сундук | |
379 | end | |
380 | end | |
381 | robot.turnRight() --поворачиваемся к с0 | |
382 | robot.select(1) | |
383 | end | |
384 | function destroyAllDoubleCrops() --уничтожим все двойные кропсы | |
385 | --пройдемся по массиву статусов кропсов и у всех кропсов, у которых статус = "жердочки", съездим к ним и сломаем их | |
386 | for c=1,5 do | |
387 | if c_status[c] == "double crop" then | |
388 | robotGoTo_C_Crop_FromPark(c) | |
389 | robot.swingDown() --ломаем кропсы | |
390 | robotGoToPark(c) | |
391 | end | |
392 | end | |
393 | ||
394 | end | |
395 | function howInterestingIsThisCrop(c) --оценивает полезность нового растения сравнивая статы дочернего ростения [с] со статами материнский растений . тип растения во внимание не принимается | |
396 | --возвращает: 0 - негодное | |
397 | -- -1 - годно для сохранения | |
398 | -- m - превосходит материнское, где 1<m<4 - номер материнского кропа, который нужно заменить новым растением | |
399 | ||
400 | if c_grow[c] >= grow_kill then --если grow у дочернего растения достигло опасного значения, то это растение считаем негодным | |
401 | return 0 | |
402 | end | |
403 | ||
404 | --если статы нового растения больше максимально разрешенных | |
405 | if (c_gain[c] > max_gain) or (c_grow[c] > max_grow) then | |
406 | --то считаем это растение приемлемым | |
407 | print("Полученое растение, превышает максимальные статы.") | |
408 | return -1 | |
409 | end | |
410 | ||
411 | --сравним статы нового растения со статами материнских растений | |
412 | maxDifference = 0 --самая лучшая разница в качестве | |
413 | m_crop_maxDifference = 0 --материнский кроп с самой лучшей разницей в качестве | |
414 | for m = 1, 4 do | |
415 | --сравниваем статы полученного растения со статами материнских растений | |
416 | difference = (c_gain[c] + c_grow[c] - c_resistans[c]) - (m_gain[m] + m_grow[m] - m_resistans[m]) | |
417 | if (difference > 0) and (difference > maxDifference) then --если растение лучше и это лучшая разница в качестве | |
418 | maxDifference = difference --обновим лучшую разницу в качестве | |
419 | m_crop_maxDifference = m --материнский кроп с самой лучшей разницей в качестве | |
420 | end | |
421 | end | |
422 | if maxDifference>0 then | |
423 | --полученное растение лучше чем одно из материнских, а значит нужно пересадить (на самый слабый материнский кроп) | |
424 | return m_crop_maxDifference --возвращаем материнский кроп с самой лучшей разницей в качестве | |
425 | end | |
426 | ||
427 | --если мы здесь, значит новое растение не привысило максимальные статы и не лучше чем материнские растения | |
428 | --а занчит РАСТЕНИЕ ПЛОХОЕ | |
429 | return 0 | |
430 | ||
431 | end | |
432 | function placeDoubleCrops() --ставит новые палки | |
433 | component.inventory_controller.equip() --экипируем кропсы(палки) | |
434 | robot.useDown() --ставим палку на землю | |
435 | robot.useDown() --ставим палку (получаются жердочки для скрещивания) | |
436 | component.inventory_controller.equip() --возвращаем в руки лопатку | |
437 | end | |
438 | function findSeedsInRobotInventory() --возвращает номер слота в инвентори робота с семечками, если нет семечек, то возвращает 0, а если вообще ничего нет, то возвращает -1 | |
439 | foundAnything = false | |
440 | for i=2,16 do | |
441 | item = component.inventory_controller.getStackInInternalSlot(i) | |
442 | if item then --если в слоте что-то есть | |
443 | foundAnything = true | |
444 | if item.name == "IC2:itemCropSeed" then --если в слоте семена | |
445 | return i --возвращаем номер слота, в котором семена | |
446 | end | |
447 | end | |
448 | end | |
449 | if foundAnything then --если что-то нашли (обычно это урожай), но семян не было | |
450 | return 0 | |
451 | end | |
452 | return -1 --вообще ничего нет | |
453 | end | |
454 | function analizeAndProceed(c) --функция анализа и обработки кропа. с - номер кропа. | |
455 | ||
456 | ||
457 | analyze_result = geo.analyze(0) --анализируем блок под роботом | |
458 | c_cropname[c] = get_crop_stat(analyze_result, "crop:name") | |
459 | if c_cropname[c] ~= nil then -- если перед нами что-то вывелось, а не пустые палки | |
460 | ||
461 | ||
462 | --получаем остальные статы кропа | |
463 | c_gain[c] = get_crop_stat(analyze_result, "crop:gain") | |
464 | c_grow[c] = get_crop_stat(analyze_result, "crop:grow") | |
465 | c_resistans[c] = get_crop_stat(analyze_result, "crop:resistance") | |
466 | c_size[c] = get_crop_stat(analyze_result, "crop:size") | |
467 | c_maxSize[c] = get_crop_stat(analyze_result, "crop:maxSize") | |
468 | ||
469 | if c_status[c] == "double crop" or c_status[c] == "unknown" then --если статус растения был двойные палки, значит появилось новое растение | |
470 | print("Новый кроп С"..c..": "..c_cropname[c].." "..c_grow[c].." "..c_gain[c].." "..c_resistans[c]) -- "Новый кроп С1: reed" | |
471 | --print(c_grow[c], c_gain[c], c_resistans[c], "size: "..c_size[c].."/"..c_maxSize[c]) --"23 31 0 size: 2/3" | |
472 | end | |
473 | ||
474 | --если прокнуло растение другого вида, выкапываем его лопаткой и отвозим в сундук | |
475 | if c_cropname[c] ~= cropname then | |
476 | robot.useDown()--по умолчанию у нас в руках лопатка, юзаем ее | |
477 | component.inventory_controller.equip() --экипируем кропсы(палки) | |
478 | robot.useDown() --ставим палку (получаются жердочки для скрещивания) | |
479 | component.inventory_controller.equip() --возвращаем в руки лопатку | |
480 | c_status[c] = "double crop" --устанавливаем статус растения - жердочки | |
481 | ||
482 | --после копки проверим инвентори робота | |
483 | foundAnything = false | |
484 | for i=2,16 do | |
485 | item = component.inventory_controller.getStackInInternalSlot(i) | |
486 | if item then --если в слоте что-то есть | |
487 | foundAnything = true | |
488 | end | |
489 | end | |
490 | ||
491 | if foundAnything or robot.count(1) == 0 then --если что-то выкопалось от этого непрофильного растения или закончились палки | |
492 | robotGoToPark(c) --едем на парковку | |
493 | if foundAnything then --если есть в инветори что-то выкопанное, сдаем в сундук | |
494 | dropToChest() | |
495 | end | |
496 | --пополняем запас палок в роботе | |
497 | if grabCropsFromBarrel() then | |
498 | else --если палки кончились | |
499 | destroyAllDoubleCrops() --уничтожим все двойные кропсы | |
500 | robot_error("ПАЛКИ КОНЧИЛИСЬ!") --заканчиваем работу с ошибкой | |
501 | end | |
502 | robotGoTo_C_Crop_FromPark(c) | |
503 | end | |
504 | else--если растение нужного типа | |
505 | if c_status[c] == "double crop" or c_status[c] == "unknown" then --если статус растения был двойные палки, значит появилось новое растение | |
506 | --оценим полезность нового растения | |
507 | interest = howInterestingIsThisCrop(c) | |
508 | ||
509 | --выведем инфу о новом кропе | |
510 | interestString = "" | |
511 | if interest == 0 then | |
512 | interestString = "негодное" | |
513 | elseif interest == -1 then | |
514 | interestString = "годное, статы дошли до целевых" | |
515 | else | |
516 | interestString = "превосходит материнское М"..interest | |
517 | end | |
518 | print("Полезность:"..interestString) | |
519 | ||
520 | if interest == 0 then -- растение с плохими статами | |
521 | --уничтожаем растение | |
522 | robot.swingDown() --ломаем кропсы | |
523 | placeDoubleCrops() --ставим новые палки | |
524 | c_status[c] = "double crop" --устанавливаем статус растения - жердочки | |
525 | --посмотрим, попали ли семечки в инвентори | |
526 | seedSlot = findSeedsInRobotInventory() --находим слот с семечками | |
527 | if seedSlot > 0 then --если семечки есть | |
528 | --отвезем эти семечки домой | |
529 | robotGoToPark(c) --едем на парковку | |
530 | dropToChest() --сбрасываем всё в сундук | |
531 | grabCropsFromBarrel() --добираем палок из бочки | |
532 | robotGoTo_C_Crop_FromPark(c) --возвращаемся на кроп | |
533 | end | |
534 | else --растение со статами превышающими материнские или статы дошли до целевых | |
535 | c_status[c] = "growing" --устанавливаем статус растущего кропа | |
536 | --оставляем его в покое, пусть растет | |
537 | end | |
538 | ||
539 | else -- c_status[c] == "growing" --растение уже ранее сканировалось | |
540 | ||
541 | if c_size[c] == c_maxSize[c] then --если растение доросло | |
542 | robot.swingDown() --ломаем кропсы, собираем урожай | |
543 | placeDoubleCrops() --ставим новые палки | |
544 | c_status[c] = "double crop" --устанавливаем статус растения - жердочки | |
545 | ||
546 | --посмотрим, попали ли семечки в инвентори | |
547 | seedSlot = findSeedsInRobotInventory() --находим слот с семечками | |
548 | if seedSlot > 0 then --если семечки есть | |
549 | --делаем повторную оценку полезности | |
550 | interest = howInterestingIsThisCrop(c) | |
551 | if interest == -1 then --годное, статы дошли до целевых | |
552 | --везем в сундук | |
553 | robotGoToPark(c) --едем на парковку | |
554 | dropToChest() --сбрасываем всё в сундук | |
555 | grabCropsFromBarrel() --добираем палок из бочки | |
556 | robotGoTo_C_Crop_FromPark(c) --возвращаемся на кроп | |
557 | ||
558 | elseif interest > 0 then --превосходит материнское | |
559 | --меняем материнское ростение на текущее дочернее | |
560 | print("Заменяем кроп М"..interest..": "..m_grow[interest].." "..m_gain[interest].." "..m_resistans[interest].." -> "..c_grow[c].." "..c_gain[c].." "..c_resistans[c]) | |
561 | --обновляем статы материнского растения | |
562 | m_grow[interest] = c_grow[c] | |
563 | m_gain[interest] = c_gain[c] | |
564 | m_resistans[interest] = c_resistans[c] | |
565 | --едем менять материнское растение | |
566 | robotGoToPark(c) --едем через паркинг. прямых маршрутов от С до M робот не знает | |
567 | robotGoTo_M_Crop_FromPark(interest) --едем на материнский кропс, который будем менять | |
568 | robot.swingDown() --ломаем кропсы, собираем урожай | |
569 | component.inventory_controller.equip() --экипируем кропсы(палки) | |
570 | robot.useDown() --ставим палку на землю | |
571 | component.inventory_controller.equip() --возвращаем в руки лопатку | |
572 | robot.select(seedSlot) --делаем активным слот с семенами, которые мы собираемся сажать | |
573 | component.inventory_controller.equip() -- берем семена в руки | |
574 | robot.useDown() --сажаем | |
575 | component.inventory_controller.equip() -- берем обратно лопатку в руки | |
576 | robot.select(1) | |
577 | robotGoToParkFrom_M_Crop(interest) --едем на паркинг | |
578 | dropToChest() --сбрасываем всё в сундук | |
579 | grabCropsFromBarrel() --добираем палок из бочки | |
580 | robotGoTo_C_Crop_FromPark(c) --возвращаемся на кроп | |
581 | end | |
582 | end | |
583 | ||
584 | ||
585 | end | |
586 | end | |
587 | ||
588 | ||
589 | end | |
590 | ||
591 | ||
592 | ||
593 | ||
594 | ||
595 | ||
596 | ||
597 | else -- если перед нами или пустые палки или воздух | |
598 | if c_status[c] == "unknown" then -- если мы сканируем этот кроп впервые | |
599 | if get_crop_stat(analyze_result, "name") == "IC2:blockCrop" then --если перед нами двойные палки | |
600 | c_status[c] = "double crop" | |
601 | else --перед нами не растение и не двойные палки. значит перед нами воздух | |
602 | --ставим палки | |
603 | component.inventory_controller.equip() --экипируем кропсы(палки) | |
604 | robot.useDown() --ставим палку на землю | |
605 | robot.useDown() --ставим палку (получаются жердочки для скрещивания) | |
606 | component.inventory_controller.equip() --возвращаем в руки лопатку | |
607 | c_status[c] = "double crop" --устанавливаем статус растения - жердочки | |
608 | end | |
609 | ||
610 | end | |
611 | ||
612 | end | |
613 | ||
614 | end | |
615 | ||
616 | ||
617 | ||
618 | ---------------------------------------------------- | |
619 | --Шаг 1 | |
620 | --Начинаем работать | |
621 | print("--------------------------------------"); --выводим приветствие | |
622 | print("Скрипт для робота, для поднятия статов у кропсов или разведения дубликатов запущен."); | |
623 | print("Версия: "..ver) | |
624 | if mode == 1 then -- 1 - режим поднятия статов кропсов | |
625 | print("Выбран режим поднятия статов кропсов."); | |
626 | else -- 2 - режим разведения дубликатов кропсов | |
627 | print("Выбран режим разведения дубликатов кропсов."); | |
628 | end | |
629 | print("Шаг 1. Проверка входящих условий."); | |
630 | ||
631 | -- проверяем правильность входящий условий | |
632 | ||
633 | --В руках должна быть лопатка | |
634 | robot.select(1) --выбираем первый слот инвентори, на случай если при начале работы был выбран другой слот | |
635 | component.inventory_controller.equip() --убираем лопатку к себе в инвентори и смотрим, лопатка ли это? | |
636 | item = component.inventory_controller.getStackInInternalSlot(1) | |
637 | if item == nil then --если в слоте ничего нет | |
638 | robot_error("Нет лопатки в слоте для инструмента!") | |
639 | end | |
640 | if item.name ~= "GraviSuite:vajra" then --если в слоте что-то есть, но это не лопатка | |
641 | - | if item.name ~= "berriespp:itemSpade" then --если в слоте что-то есть, но это не лопатка |
641 | + | |
642 | end | |
643 | component.inventory_controller.equip() --лопатку возвращаем в слот для инструмента | |
644 | ||
645 | --print("Входящие условия соблюдены.") | |
646 | ||
647 | ---------------------------------------------------- | |
648 | --Шаг 2 | |
649 | if mode == 1 then -- 1 - режим поднятия статов кропсов | |
650 | print("Шаг 2. Сканируем материнские кропсы и запоминаем их статы.") | |
651 | ||
652 | --Сканируем материнские кропсы и запоминаем их статы | |
653 | --Исходная позиция - робот стоит на P0 | |
654 | ||
655 | -- кроп M1 | |
656 | robotMove_P0_M1() | |
657 | analyze_result = geo.analyze(0) | |
658 | cropname = get_crop_stat(analyze_result, "crop:name") | |
659 | m_gain[1] = get_crop_stat(analyze_result, "crop:gain") | |
660 | m_grow[1] = get_crop_stat(analyze_result, "crop:grow") | |
661 | m_resistans[1] = get_crop_stat(analyze_result, "crop:resistance") | |
662 | print("M1:", cropname, m_grow[1], m_gain[1], m_resistans[1]) | |
663 | ||
664 | -- кроп M2 | |
665 | robotMove_M1_M2() | |
666 | analyze_result = geo.analyze(0) | |
667 | cropname = get_crop_stat(analyze_result, "crop:name") | |
668 | m_gain[2] = get_crop_stat(analyze_result, "crop:gain") | |
669 | m_grow[2] = get_crop_stat(analyze_result, "crop:grow") | |
670 | m_resistans[2] = get_crop_stat(analyze_result, "crop:resistance") | |
671 | print("M2:", cropname, m_grow[2], m_gain[2], m_resistans[2]) | |
672 | ||
673 | -- кроп M3 | |
674 | robotMove_M2_M3() | |
675 | analyze_result = geo.analyze(0) | |
676 | cropname = get_crop_stat(analyze_result, "crop:name") | |
677 | m_gain[3] = get_crop_stat(analyze_result, "crop:gain") | |
678 | m_grow[3] = get_crop_stat(analyze_result, "crop:grow") | |
679 | m_resistans[3] = get_crop_stat(analyze_result, "crop:resistance") | |
680 | print("M3:", cropname, m_grow[3], m_gain[3], m_resistans[3]) | |
681 | ||
682 | -- кроп M4 | |
683 | robotMove_M3_M4() | |
684 | analyze_result = geo.analyze(0) | |
685 | cropname = get_crop_stat(analyze_result, "crop:name") | |
686 | m_gain[4] = get_crop_stat(analyze_result, "crop:gain") | |
687 | m_grow[4] = get_crop_stat(analyze_result, "crop:grow") | |
688 | m_resistans[4] = get_crop_stat(analyze_result, "crop:resistance") | |
689 | print("M4:", cropname, m_grow[4], m_gain[4], m_resistans[4]) | |
690 | ||
691 | ||
692 | robotMove_M4_P0() --возвращаем робота в исходное положение | |
693 | ||
694 | end | |
695 | ---------------------------------------------------- | |
696 | --Шаг 3 | |
697 | if mode == 1 then -- 1 - режим поднятия статов кропсов | |
698 | print("Шаг 3. Приступаем к поднятию статов."); | |
699 | else -- 2 - режим разведения дубликатов кропсов | |
700 | print("Шаг 2. Приступаем к разведению дубликатов кропсов."); | |
701 | end | |
702 | ||
703 | while true do --главный цикл | |
704 | ||
705 | --пополняем запас палок в роботе | |
706 | if grabCropsFromBarrel() then | |
707 | else --если палки кончились | |
708 | destroyAllDoubleCrops() --уничтожим все двойные кропсы | |
709 | robot_error("ПАЛКИ КОНЧИЛИСЬ!") | |
710 | end | |
711 | ||
712 | --едем сканить дочерние кропсы | |
713 | robotMove_P0_C1() | |
714 | analizeAndProceed(1) | |
715 | robotMove_C1_C4() | |
716 | analizeAndProceed(4) | |
717 | robotMove_C4_C5() | |
718 | analizeAndProceed(5) | |
719 | robotMove_C5_C2() | |
720 | analizeAndProceed(2) | |
721 | robotMove_C2_C3() | |
722 | analizeAndProceed(3) | |
723 | robotMove_C3_P0() --конечное положение P0 смотрим вверх | |
724 | ||
725 | --os.exit() | |
726 | ||
727 | ||
728 | os.sleep(5) | |
729 | - | os.sleep(15) |
729 | + | |
730 | ||
731 | os.exit() | |
732 |