Screeps - ММО игра для программистов. Глобальные объекты.

Начало : Screeps - ММО игра для программистов.Часть 1.

Глобальные объекты


Объект Game
Есть глобальный объект Game который содержит всю необходимую информацию о игровых объектах.

Game.constructionSites - содержит все ваши объекты которые вы собираетесь построить, то есть после того как вы решили что-то построить, вы выбрали что, и разместили. До тех пор пока этот объект не построен, он помещен в этот контейнер. Соответственно эта полезная информация для крепышей которые занимаются постройкой зданий. Если в этом контейнере есть id объектов готовых к постройке, значит раздаем задачи строителям, пример:
objects_for_build_info : function()
{
  for(var i in Game.constructionSites)
    console.log("needs to build, id = " + i);
 
  // OR
  
  var constrObjCount = Object.keys(Game.constructionSites).length;
  if(constrObjCount > 0)
    console.log("Count objects for build = " + 
                 Object.keys(Game.constructionSites).length);
} 
Game.cpu - объект содержащий информацию о доступных для вас CPU.
  •  Game.cpu.limit -текущее ограничение, зависит от GCL
  •  Game.cpu.tickLimit - количество доступных CPU в этом тике. Это значение может быть больше чем limit. Дело в том что, если ваш скрипт выполняется за меньшее количество CPU чем вам доступно, то эта разница накапливается. К примеру у вас ограничение в 30 CPU, ваши скрипты используют 25 CPU каждый тик, значит получаем разницу 5 тиков (которые накапливаюся в специальном месте - bucket, но не больше чем 10 000) за 10 тиков туда уйдет 50 CPU. Эти накопленные CPU можно и нужно использовать для сложных вычислений. У каждой серверной функции есть примерная оценка в стоимости (низкая, средняя, высокая), но об этом ниже и по порядку. Но вы не можете вот так вот взять, и использовать все эти, к примеру, 10 000 CPU за один раз. У вас на каждый тик есть лимит количества CPU  которое вы можете взять из bucket и выполнить в этом тике. Вот это как раз и есть это значение, равно оно 500 CPU.
  • Game.cpu.bucket -количество накопленных CPU(не больше чем 10 000) 
cpu_info : function()
{
  var limit     = Game.cpu.limit;
  var tickLimit = Game.cpu.tickLimit;
  var bucket    = Game.cpu.bucket;
 
  console.log(  "limit:" + limit + ", "
              + "currentTickLimit: " + tickLimit + ", " 
              + "bucket: " + bucket);
}
Game.creeps - контейнер который содержит всех ваших крепышей, имя крепыша является ключем. Game.creeps['harvester_1'] - получаем доступ к объекту крепыша с именем harvester_1.

Game.flags - контейнер который содержит все ваши флаги, имя флага является ключем. Флаги удобная вещь для маркировки чего-либо в комнатах, можно к примеру помечать выходы из комнат, точки для ожидания когда точки с ресурсами заняты, и прочее. Вы не можете иметь больше чем 10 000 флагов.
Game.gcl - объект содержащий информацию GCL
gcl_info : function()
{
  var level         = Game.gcl.level;
  var progress      = Game.gcl.progress;
  var progressTotal = Game.gcl.progressTotal;
 
  console.log("GCL- current level:" + level + ", "
              + " current progress: " + progress + ", " 
              + " progress to next level: " + progressTotal);
}

Game.map - объект представляющий глобальную карту.
Game.market - объект представляющий площадку для торговли в игре.
Game.resources - объект представляющий ваши ресурсы.
Game.rooms - контейнер содержащий все комнаты в которых есть хотя бы один ваш крепыш или строение, ключем является имя комнаты. 

all_rooms_info : function()
{
  for(var i in Game.rooms)
    console.log("Room['" + i + "']: energy available - "  

               + Game.rooms[i].energyAvailable);
}
Game.shard - объект содержащий информацию о имени и типе сервера(shard) на котором выполняется ваш скрипт.
Game.spawns - контейнер содержащий все ваши точки возрождения. Ключем является имя точки возрождения.
all_spawns_info : function()
{
  for(var i in Game.spawns)
    console.log("spawn name = '" + i 
              + "', is in the room '"
              + Game.spawns[i].room.name
              + "'");
}
Game.structures - контейнер содержащий все ваши готовые строения. Ключем является уникальный id
Game.time - объект хранящий номер текущего тика.


Также есть 3 функции у объекта Game.
Game.cpu().getUsed() - возвращает количество CPU использованное с начала тика. Можно измерять сколько CPU используют те или иные функции, серверные или ваши. Стоимость фунции - низкая.
{
  const startCpu = Game.cpu.getUsed();
  // some logic
  // ...
  const elapsed = Game.cpu.getUsed() - startCpu;
  console.log('Was used ' + elapsed + ' CPU time'); 
} 
Game.cpu().getObjectById() - возвращает объект с уникальным id, любой объект в мире screeps имеет свой уникальный id. Получить объект по уникальному id можно, если этот объект находится в видимых вам комнатах, это означает что в комнате должен быть или хоть один ваш крепыш или ваше строение. Стоимость фунции - низкая.
К примеру можно измерить сколько стоит выполнение этой функции, например у нас есть точка возрождения, id(можно посмотреть на карте, кликнув по точке) которой - 'e156637b381bd88'
calc_get_obj_by_id_cpu_using : function()
{
  var common = 0;
  for(var i = 0; i < 100; ++i)
  {
    const startCpu = Game.cpu.getUsed();
    Game.getObjectById('e156637b381bd88');
    const elapsed = Game.cpu.getUsed() - startCpu;
    common += elapsed;
  }
  console.log('100 call of getObjectById used ' 
              + common 
              + ' CPU time, average value = ' + common / 100);
}
на локальном сервере я получил такие результаты:
100 call of getObjectById used 0.12096500000000177 CPU time, average value = 0.0012096500000000176
100 call of getObjectById used 0.26111999999999996 CPU time, average value = 0.0026111999999999997
100 call of getObjectById used 0.21283199999999994 CPU time, average value = 0.0021283199999999995
100 call of getObjectById used 0.24193399999999982 CPU time, average value = 0.002419339999999998   
100 call of getObjectById used 0.11468199999999984 CPU time, average value = 0.0011468199999999985
100 call of getObjectById used 0.1208249999999822  CPU time, average value = 0.0012082499999998219  
100 call of getObjectById used 0.27269300000000013 CPU time, average value = 0.002726930000000001   
100 call of getObjectById used 0.3913449999999996  CPU time, average value = 0.003913449999999996    
100 call of getObjectById used 0.2502869999999996  CPU time, average value = 0.002502869999999996    
100 call of getObjectById used 0.2637080000000004  CPU time, average value = 0.002637080000000004    
100 call of getObjectById used 0.28514799999999957 CPU time, average value = 0.0028514799999999957
Как мы видим один вызов этой функции от 0.001 до почти 0.004 CPU но это локальный сервер, где какае-то загрузка компьютера приводит к подтормаживанию.
Теперь посмотрим на результаты на сервере screeps.com shard1
100 call of getObjectById used 0.042912999999999535 CPU time, average value = 0.00042912999999999534
100 call of getObjectById used 0.06310200000000421  CPU time, average value = 0.0006310200000000421    
100 call of getObjectById used 0.04342499999999516  CPU time, average value = 0.0004342499999999516    
100 call of getObjectById used 0.03914300000000007  CPU time, average value = 0.00039143000000000066  
100 call of getObjectById used 0.035229000000000094 CPU time, average value = 0.0003522900000000009   
100 call of getObjectById used 0.0370930000000001   CPU time, average value = 0.000370930000000001       
100 call of getObjectById used 0.045365999999999795 CPU time, average value = 0.00045365999999999793
100 call of getObjectById used 0.13672899999999982  CPU time, average value = 0.0013672899999999982    
100 call of getObjectById used 0.033703000000000094 CPU time, average value = 0.00033703000000000097 
100 call of getObjectById used 0.03636499999999994  CPU time, average value = 0.0003636499999999994    
100 call of getObjectById used 0.04271499999999051  CPU time, average value = 0.0004271499999999051    
100 call of getObjectById used 0.03566699999999995  CPU time, average value = 0.00035666999999999947  
100 call of getObjectById used 0.0333730000000001   CPU time, average value = 0.000333730000000001       
100 call of getObjectById used 0.04037799999999987  CPU time, average value = 0.0004037799999999987 
Тут мы видим что на сервере стоимость вызова от 0.0003  до 0.0006 CPU, но и есть скачки до 0.001, если понаблюдать 1000 тиков то думаю можно заметить и другие скачки. Но в целом примерно понятно сколько CPU стоит вызов этой функции. По остальным функциям будут также подобные эксперементы.
Game.cpu().notify(message, [groupInterval]) -позволяет настроить отправку собственных сообщений на почту которая указана в настройках вашего аккаунта в screeps. Можно отправлять до 20 сообщений в тик.

Объект Game.map
Глобальный объект для работы с картой мира. Используется для перемещения между комнатами.
Game.map.describeExists(roomName) - возвращает список всех соседних комнат для указанной комнаты или null если указанной комнаты не существует.
Возвращает объект следующего типа
{
  "1": "W8N4",    // TOP
  "3": "W7N3",    // RIGHT
  "5": "W8N2",    // BOTTOM
  "7": "W9N3"     // LEFT
}
Стоимость функции - низкая
100 call of Game.map.describeExits used 7.1362600000000070 CPU time, average value = 0.071362600000000070
100 call of Game.map.describeExits used 3.4825420000000010 CPU time, average value = 0.034825420000000010
100 call of Game.map.describeExits used 3.0608860000000053 CPU time, average value = 0.030608860000000054
100 call of Game.map.describeExits used 1.0153830000000006 CPU time, average value = 0.010153830000000006
100 call of Game.map.describeExits used 1.0870930000000005 CPU time, average value = 0.010870930000000006
100 call of Game.map.describeExits used 1.7234260000000010 CPU time, average value = 0.017234260000000010
100 call of Game.map.describeExits used 2.1418760000000003 CPU time, average value = 0.021418760000000002
100 call of Game.map.describeExits used 0.9982469999999984 CPU time, average value = 0.009982469999999985
100 call of Game.map.describeExits used 2.4074300000000000 CPU time, average value = 0.024074360000000003
100 call of Game.map.describeExits used 1.4700130000000002 CPU time, average value = 0.014700130000000002
тесты на локальном сервере
ниже код, выводящий комнаты в округе
  var l_ex = Game.map.describeExits('W5N8');
  console.log("room from top     = " + l_ex['1']);
  console.log("room on the right = " + l_ex['3']);
  console.log("room from down    = " + l_ex['5']);
  console.log("room on the left  = " + l_ex['7']);

Game.map.findExit(fromRoom, toRoom, [opts]) - возвращает направление к искомой комнате. Если направление существует, то возвращается одна и- 4-х констант.
  • FIND_EXIT_TOP            (1)
  • FIND_EXIT_RIGHT       (3)
  • FIND_EXIT_BOTTOM   (5)
  • FIND_EXIT_LEFT          (7)
Или один из кодов ошибок
  • ERR_NO_PATH               (-2)
  • ERR_INVALID_ARGS   (-10)
Как я понял, происходит нормальный поиск существующего пути на данный момент, но возвращается начальное направление
Смотрим скрин:

Выполнив поиск из W5N8 в W3N8(var direction = Game.map.findExit('W5N8', 'W3N8'))
я получил значение - 5, что соответствует FIND_EXIT_BOTTOM а это направление вниз. Если посмотреть на скрин, то мы увидим что двигаться вправо нельзя, от туда выхода на нужную нам комнату нет.
Выполнив поиск из W5N8 в W6N9(var direction = Game.map.findExit('W5N8', 'W3N8'))
я получил значение 7, что соответствует FIND_EXIT_LEFT а это направление влево, думаю если бы левая комната была бы перекрыта стеной, вернуло бы направление вниз(в обход этой комнаты, а дальше уже нужно считать дальше).
Стоимость вызова функции - высокая
100 call of Game.map.findExit used 8.2165219999999900 CPU time, average value = 0.082165219999999900
100 call of Game.map.findExit used 16.967743999999996 CPU time, average value = 0.169677439999999960
100 call of Game.map.findExit used 17.913725000000007 CPU time, average value = 0.179137250000000050
100 call of Game.map.findExit used 14.848808999999989 CPU time, average value = 0.148488089999999880
100 call of Game.map.findExit used 10.954970000000005 CPU time, average value = 0.109549700000000040
100 call of Game.map.findExit used 3.0119920000000000 CPU time, average value = 0.030119919999999998
100 call of Game.map.findExit used 4.4793709999999995 CPU time, average value = 0.044793709999999994
100 call of Game.map.findExit used 6.0596229999999970 CPU time, average value = 0.060596229999999966
100 call of Game.map.findExit used 2.4551399999999990 CPU time, average value = 0.024551399999999990
100 call of Game.map.findExit used 4.0599110000000005 CPU time, average value = 0.040599110000000010
100 call of Game.map.findExit used 3.3236509999999977 CPU time, average value = 0.033236509999999976
100 call of Game.map.findExit used 6.0486280000000000 CPU time, average value = 0.060486279999999996
тест на локальном сервере

Game.map.findRoute(fromRoom, toRoom, [opts]) - Находит путь из одной комнаты в другую.
Возвращает массив в следующем формате
[
    { exit: FIND_EXIT_RIGHT, room: 'arena21' },
    { exit: FIND_EXIT_BOTTOM, room: 'arena22' },
    ...
]
Или код ошибки
  • ERR_NO_PATH               (-2)
Найдем путь из комнаты W5N8 в W3N8, и выведем на консоль
  var route = Game.map.findRoute('W5N8', 'W3N8');
  if(route != ERR_NO_PATH)
  {
    for(var i in route)
      console.log("point " + i
                + " move to " + route[i].exit 
                + ", room " + route[i].room);
  }
результат
point 0 move to 5, room W5N7
point 1 move to 3, room W4N7
point 2 move to 3, room W3N7
point 3 move to 1, room W3N8
Как видим по результату, нужно двигаться вниз к комнате W5N7, далее вправо к комнате W4N7, далее вправо к комнате W3N7, и потом вверх к нужной нам комнате W3N8
Информация о том как двигать крепышей, будет в соответствующем разделе. Либо читайте оригинальную справку, в ней есть примеры.
Стоимость вызова этой функции - высокая
100 call of Game.map.findRoute used 7.1165999999999970 CPU time, average value = 0.071165999999999980
100 call of Game.map.findRoute used 8.3225249999999970 CPU time, average value = 0.083225249999999970
100 call of Game.map.findRoute used 9.6708420000000060 CPU time, average value = 0.096708420000000060
100 call of Game.map.findRoute used 9.1365150000000030 CPU time, average value = 0.091365150000000030
100 call of Game.map.findRoute used 10.349342000000004 CPU time, average value = 0.103493420000000030
100 call of Game.map.findRoute used 3.5103780000000007 CPU time, average value = 0.035103780000000010
100 call of Game.map.findRoute used 2.4670190000000005 CPU time, average value = 0.024670190000000005
100 call of Game.map.findRoute used 2.4748269999999986 CPU time, average value = 0.024748269999999985
100 call of Game.map.findRoute used 3.4803719999999990 CPU time, average value = 0.034803719999999990
тесты на локальном сервере

Game.map.getRoomLinearDistance(roomName1, roomName2, [continuous]) - Находит прямой путь из одной комнаты в другую, возвращает количество комнат между двумя указанными комнатами.
Стоимость вызова этой функции - незначительная
100 call of Game.map.getRoomLinearDistance used 2.6313150000000043 CPU time, average value = 0.026313150000000042
100 call of Game.map.getRoomLinearDistance used 3.0901140000000007 CPU time, average value = 0.030901140000000007
100 call of Game.map.getRoomLinearDistance used 0.7191459999999998 CPU time, average value = 0.007191459999999998
100 call of Game.map.getRoomLinearDistance used 3.0624550000000004 CPU time, average value = 0.030624550000000004
100 call of Game.map.getRoomLinearDistance used 0.8439969999999993 CPU time, average value = 0.008439969999999993
100 call of Game.map.getRoomLinearDistance used 1.8483919999999996 CPU time, average value = 0.018483919999999997
100 call of Game.map.getRoomLinearDistance used 0.8071390000000008 CPU time, average value = 0.008071390000000008
100 call of Game.map.getRoomLinearDistance used 0.7024559999999997 CPU time, average value = 0.007024559999999997
100 call of Game.map.getRoomLinearDistance used 0.9154739999999997 CPU time, average value = 0.009154739999999996
100 call of Game.map.getRoomLinearDistance used 2.3393820000000000 CPU time, average value = 0.023393820000000000
тесты на локальном сервере






!!!ДОПОЛНЯЕТСЯ!!!!!











Комментарии