Перейти к содержимому

Флаг как метка

У каждого юнита есть число, которое игра никак не использует. Без него два процессора растащат один отряд

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

ucontrol flag 7 0 0 0 0

Теперь у него в @flag лежит семёрка. Прочитать её может любой процессор:

sensor метка @unit @flag
тик 0
Связь с юнитом0
тип
Информация1
=
у
Прыжок -> 62
если
Операция3
=
Контроль юнита4
типзначение
Конец5
Операция6
=
Конец7
@counter0number
меткаnullnull
последнийnullnull
помеченоnullnull

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

Метку ставят всегда, а не когда понадобится

Заголовок раздела «Метку ставят всегда, а не когда понадобится»

Легко решить, что разметка — это для сложных случаев: «у меня один процессор, я просто буду брать своих перебором». Так не выйдет. ubind @poly у каждого процессора идёт по общему списку всех поли команды, и счётчик у каждого свой. Два процессора без меток неизбежно возьмут одного и того же юнита и будут отбирать его друг у друга — молча, без единой ошибки.

Поэтому разметка — это не приём на будущее, а обычный вид программы про юнитов:

ubind @poly
sensor метка @unit @flag
jump 0 notEqual метка 0
ucontrol flag 1 0 0 0 0

Пока юниты без метки, процессор их разбирает; размеченных пропускает. Чужие — те, у кого метка не его, — он не тронет никогда.

Флаг — единственная память, которая живёт на самом юните, а не в процессоре и не в ячейке. Отсюда и все его применения:

  • разделить отряд. Метка 1 возит медь, метка 2 копает, метка 3 чинит. Каждый процессор смотрит на флаг и пропускает чужих;
  • не хватать одного и того же дважды. Пометив юнита, программа видит, что он уже занят — даже если забыла его между итерациями;
  • передать юнита другому процессору. Один помечает, другой читает: общаться через флаг дешевле, чем через ячейку памяти, и метка всегда при юните;
  • посчитать своих. Перебор плюс проверка флага — и ясно, сколько юнитов уже разобрано по делам.

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

И договариваться о числах приходится самим: игра не даст двум процессорам разные метки, она просто хранит число. Два автора, поставившие единицу, получат ту же путаницу, что и без меток вовсе.

Неофициальный проект, с Anuke не связан. Спрайты, шрифты и переводы Mindustry © Anuke, используются по GPL-3.0; Fira Code — по OFL-1.1. Код сайта — GPL-3.0.