Я не нашел способа назначить крючки на что угодно, и если бы я мог, это было бы очень полезно. Кроме того, как я могу проверить, существует ли игровой объект? (т. е. не умер от возраста и не был уничтожен врагом).Можно ли назначить функциональные крючки игровым объектам, например. запустить функцию по init, death и т. д.?
ответ
Если вы имеете в виду через API - пока невозможно. Но вы можете изменить свое текущее состояние и сравнить его с запомненным предыдущим состоянием объектов. Например, если какое-то имя ползучести в Memory
все еще присутствует, но оно ушло в Game.creeps
, то что-то случилось.
for(var i in Game.creeps) {
var creep = Game.creeps[i];
creep.memory.lastSeenAt = {x: creep.pos.x, y: creep.pos.y};
}
for(var i in Memory.creeps) {
if(!Game.creeps[i]) {
console.log("Oops! Something happened with a creep "+creep.name+" at "+
Memory.creeps[i].lastSeenAt.x+","+Memory.creeps[i].lastSeenAt.y);
}
}
Я так не считаю. API, похоже, сосредоточен на разработке кода для основного игрового цикла, например написании кода внутри while(true)
. Но вы можете заставить свои крипы что-то сделать, прежде чем они умрут, например.
Я создал защитный модуль (как и модуль харвестера, который вы создаете в учебнике). Приведенный ниже код должен работать:
module.exports = function (creep) {
if(creep.hits<=100) { Game.spawns.Spawn1.createCreep([Game.ATTACK, Game.ATTACK, Game.TOUGH, Game.TOUGH, Game.MOVE], "guard2", {role:"guard"}); }
var targets = creep.room.find(Game.HOSTILE_CREEPS);
if(targets.length) {
creep.moveTo(targets[0]);
creep.attack(targets[0]);
} else{
creep.moveTo(Game.spawns.Spawn1);
}
}
В этой ситуации условный «if (creep.hits <= 0)» является допустимым способом проверить, умерла ли ползучесть? – Pineapple
Хороший вопрос, я проверю это и ответ скоро –
Я создал модуль защиты (обновил ответ) и по какой-то причине «if (creep.hits <= hit_threshold)» не работает. –
Вот мой случай использования:
- Подсчитайте количество враждебных (N) в текущей комнате
- Подсчитайте количество живых охранников (C)
- Если с < Н затем построить еще один охранник
Через некоторое время, при использовании Room.find(Game.MY_CREEPS)
, Я тоже получу мертвых охранников. Отфильтровывать их все время очень больно, а глобальный Memory
продолжает их перечислять. Есть ли способ удалить мертвые крипы из глобального объекта Memory
?
[EDIT] Нашли это, надеюсь, это поможет.
for(var i in Memory.creeps) {
if(!Game.creeps[i]) {
delete Memory.creeps[i];
}
}
я запускаю его в начале каждого клеща
Я раздвоенный на шрифтовиках образцов репозитория и сделал свои собственное событие код обработки - https://github.com/pineapplemachine/script-samples/tree/master/hooks
С помощью этого сценария можно назначить инициализации, обновление, и методы уничтожения событий, а не необходимость обрабатывать вещи более тупо.
Не могли бы вы привести пример кода? Благодаря! – Pineapple
Я отредактировал свой ответ. – artch
Спасибо! Есть ли в настоящее время какой-либо способ проверить смерть без худшего случая, повторяя все крипы в игре? – Pineapple