View difference between Paste ID: NQAhnqDN and cZY3P7As
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