Перевод официального туториала

## Добро пожаловать в Screeps

Это обучение поможет вам шаг за шагом изучить основные игровые концепции. Вы можете пройти его позже, но мы настоятельно рекомендуем сделать это сейчас, прежде чем вы начнете настоящую игру.

Если у вас возникли проблемы с производительностью, обратите внимание, что Screeps лучше всего работает в браузере Chrome.

Screeps - игра для программистов. Если вы не знаете, как кодировать на JavaScript, посмотрите этот бесплатный интерактивный курс.

## Давайте начнём!

Это игровое поле называется "комната". В реальной игре комнаты соединены друг с другом выходами, но в режиме симуляции вам доступна только одна комната.

Объект в центре экрана - это ваш первый спавн, расположенный в центре вашей колонии.

## ОШИБКА!!!

Ваша команда возвращает ответ (или ошибку выполнения) в консоли ниже. Весь вывод дублируется в консоли браузера (Ctrl + Shift + J), где вы можете раскрыть объекты для целей отладки. Вы можете открыть и закрыть нижнюю панель, нажав Alt + Enter. Теперь мы напишем что-то реальное.

## Создание крипов

Ваш спавн создает новые юниты, называемые "крипами", методом spawnCreep. Использование этого метода описано в документации. У каждого крипа есть имя и определенные части тела, которые дают ему различные навыки.

Вы можете обратиться к своему спавну по его имени следующим образом: Game.spawns ['Spawn1'].

Создайте рабочего крипа с массивом тела [WORK, CARRY, MOVE] и именем Harvester1 (имя важно для учебника!). Вы можете ввести код в консоли самостоятельно или скопировать и вставить подсказку ниже.

```
код для вставки: Game.spawns['Spawn1'].createCreep([WORK, CARRY, MOVE],'Harvester1' );

```

## Отлично!

Отлично! Теперь у вас есть крип с именем «Harvester1», которым вы можете управлять.

## Характеристики

Здесь вы можете увидеть характеристики объекта, на который вы сейчас смотрите. Значения каждой характеристики и функции частей тела описаны в документации.

## Работа

Пришло время поставить крипа на работу! Этот желтый квадрат является источником энергии - ценным игровым ресурсом. Его можно добывать крипами с одной или несколькими рабочими частями тела и транспортировать к нересту крипами с частями [CARRY].

## Скрипты

Здесь вы можете написать сценарии, которые будут работать постоянно, каждый тик игры в цикле. Это позволяет писать постоянно работающие программы для контроля поведения ваших крипов, которые будут работать даже когда вы не в сети (только в реальной игре, а не в режиме Simulation Room).

Чтобы зафиксировать скрипт в игре, чтобы он мог работать, используйте эту кнопку или Ctrl + Enter.

Код для каждого раздела Tutorial создается в отдельной ветке. Вы можете просмотреть код из этих веток для дальнейшего использования в ваших скриптах.

Чтобы отправить крипа на сбор энергии, вам необходимо использовать методы, описанные в разделе документации ниже.

Команды будут проходить каждый игровой тик. Метод сбора энергии требует, чтобы источник энергии находился рядом с крипом.

Вы даете приказы крипу по его имени следующим образом: Game.creeps ['Harvester1']. Используйте константу FIND\_SOURCES в качестве аргумента метода Room.find. Отправьте своего крипа, чтобы собрать энергию, набрав код на вкладке «Script».

```
код для вставки: module.exports.loop = function () {
                       var creep = Game.creeps['Harvester1'];
                       var sources = creep.room.find(FIND_SOURCES);
                       if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
                                 creep.moveTo(sources[0]);
                       }
                 }

```

## Добыча

желтое пятно внутри крипа означает, что он начал собирать энергию от источника.

## Передача спавну

Чтобы заставить передачу энергии отправить обратно в спавн, нужно использовать метод Creep.transfer. Однако помните, что это должно быть сделано, когда крип находится рядом с источник энергии, поэтому крип должен идти назад.

Если вы измените код, добавив в крип чек .carry.energy <.carryCapacity, он сможет самостоятельно перемещаться взад и вперед, давая энергию спавну и возвращаясь к источнику.

Расширьте программу крипа, чтобы она могла передавать собранную энергию спавну и возвращаться к работе.

(это в окно script)

```
module.exports.loop = function () {
    var creep = Game.creeps['Harvester1'];

    if(creep.carry.energy < creep.carryCapacity) {
        var sources = creep.room.find(FIND_SOURCES);
        if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
            creep.moveTo(sources[0]);
        }
    }
    else {
        if( creep.transfer(Game.spawns['Spawn1'], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE ) {
            creep.moveTo(Game.spawns['Spawn1']);
        }
    }
}

```

## Отлично! 2

Отлично! Этот creep теперь будет работать как комбайн, пока не умрет. Помните, что почти у любого крипа жизненный цикл составляет 1500 игровых тактов, затем он "стареет" и умирает (это поведение отключено в руководстве).

Давайте создадим еще одного worker creep, чтобы помочь первому. Это обойдется еще в 200 единиц энергии, поэтому вам, возможно, придется подождать, пока ваш комбайн соберет достаточно энергии. Метод spawnCreep будет возвращать код ошибки ERR\_NOT\_ENOUGH\_ENERGY (-6) до тех пор пока не будет достаточного количества энергии.

Помните: чтобы выполнить код один раз, просто введите его на вкладке "Консоль". Создайте второго крипа с телом [WORK, CARRY, MOVE] и назовите его Harvester2.

## Создание крипа 2

Второй ползунок готов, но он не сдвинется с места, пока мы не включим его в программу.

Чтобы задать поведение обоих крипов, мы могли бы просто продублировать весь сценарий для второго, но гораздо лучше использовать цикл for для всех крипов в Game.creeps.

Распространите свою программу на обоих крипов.

```
module.exports.loop = function () {
    for(var name in Game.creeps) {
        var creep = Game.creeps[name];

        if(creep.store.getFreeCapacity() > 0) {
            var sources = creep.room.find(FIND_SOURCES);
            if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
                creep.moveTo(sources[0]);
            }
        }
        else {
            if(creep.transfer(Game.spawns['Spawn1'], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
                creep.moveTo(Game.spawns['Spawn1']);
            }
        }
    }
}

```

## Улучшение крипов

Теперь давайте улучшим наш код, выделив поведение работников в отдельный модуль. Создайте модуль с именем role.harvester с помощью раздела Modules слева от редактора скриптов и определите функцию запуска внутри объекта module.exports, содержащую поведение ползучести.

Создайте модуль role.harvester.

```
var roleHarvester = {

    /** @param {Creep} creep **/
    run: function(creep) {
	    if(creep.store.getFreeCapacity() > 0) {
            var sources = creep.room.find(FIND_SOURCES);
            if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
                creep.moveTo(sources[0]);
            }
        }
        else {
            if(creep.transfer(Game.spawns['Spawn1'], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
                creep.moveTo(Game.spawns['Spawn1']);
            }
        }
	}
};

module.exports = roleHarvester;

```