Несколько дронов — код Megafarm для The Farmer Was Replaced

После разблокировки Megafarm вы перестаёте фармить одним дроном и запускаете флот. Это гайд про несколько дронов в The Farmer Was Replaced: что даёт анлок, как работает spawn_drone, и готовый паттерн, который можно вставить в скрипты тыквы, дерева или поликультуры.

Сначала разблокируйте Megafarm

Megafarm — анлок, который включает больше одного дрона. Апгрейды поднимают лимит дальше. Пока анлок не взят, spawn_drone недоступен, и любой скрипт культуры остаётся однопоточным.

Полезные функции после анлока:

Как работает spawn_drone

Передавайте объект функции, а не вызов:

# Correct
spawn_drone(harvest_column)

# Wrong — this runs harvest_column immediately on the current drone
spawn_drone(harvest_column())

Новый дрон появляется на той же клетке, что и родитель, и сразу выполняет переданную функцию. Дополнительные аргументы после функции копируются в этот вызов. Когда функция возвращается, дрон исчезает. Дроны не сталкиваются друг с другом.

Если вы уже на лимите, spawn_drone ничего не делает и возвращает None. Безопасный паттерн:

if not spawn_drone(task):
    task()  # parent does the work itself

Отдельного «главного» дрона нет. Любой дрон может спавнить других, и каждый живой дрон считается в max_drones().

Код нескольких дронов: по одному столбцу

Частый паттерн Megafarm: родитель идёт на восток по ферме и спавнит по одному воркеру на столбец. Каждый воркер фармит север–юг (один проход или бесконечно).

def harvest_column():
    size = get_world_size()
    for i in range(size):
        if can_harvest():
            harvest()
        move(North)

clear()
while True:
    # Fill the farm with column workers
    while num_drones() < max_drones():
        if spawn_drone(harvest_column):
            move(East)
        else:
            break
    # Parent also works a column while the fleet runs
    harvest_column()
    move(East)

Замените тело harvest_column на plant / water / fertilize под нужную культуру. Для тыкв каждый дрон должен владеть фиксированным набором столбцов и держать свой список плохих клеток — дроны не делят глобальные как «обычный Python».

Синхронизация фаз через wait_for

Когда все дроны должны закончить посадку до любого сбора (слияние гигантской тыквы, сортировка кактуса и похожее), сохраняйте handles и ждите:

def plant_column():
    size = get_world_size()
    for i in range(size):
        if get_ground_type() != Grounds.Soil:
            till()
        plant(Entities.Pumpkin)
        move(North)

handles = []
size = get_world_size()
for x in range(size - 1):
    h = spawn_drone(plant_column)
    if h:
        handles.append(h)
    else:
        plant_column()
    move(East)

plant_column()  # last column on the parent

for h in handles:
    wait_for(h)

# Now the field is planted — patch / measure / harvest on the parent

Советы, которые экономят часы

FAQ

Почему spawn_drone возвращает None?
У вас уже max_drones() живых дронов, включая родителя.

Дроны делят переменные?
Считайте программу каждого дрона отдельной. Проектируйте через аргументы и return через wait_for, а не один глобальный список, в который пишут все.

Могут ли заспавненные дроны спавнить ещё?
Да. Каждый живой дрон считается в лимит.

Куда дальше?
Масштабируйте скрипты тыквы и поликультуры или откройте гайд, если ещё учите основы языка.

Связь с поликультурой и тыквой

На поликультуре несколько дронов ускоряют обход столбцов, а общий словарь запросов компаньонов можно держать аккуратно через аргументы или сектора. На тыкве важно не делить один список мёртвых клеток: у каждого дрона свой сектор и свой список. Megafarm не отменяет правила культуры — он только параллелит работу.

Если вы только открыли несколько дронов, начните с простого столбцового сбора сена или дерева, убедитесь что spawn_drone и лимит понятны, затем переносите паттерн в более сложные скрипты.