Флаг как метка
У каждого юнита есть число, которое игра никак не использует. Без него два процессора растащат один отряд
Перебор выдаёт юнитов по кругу, и программа каждый раз получает кого-то нового. Хуже того, тот же перебор идёт и у соседнего процессора — и выдаёт ему тех же самых юнитов. Чтобы поделить отряд, юнита помечают:
ucontrol flag 7 0 0 0 0Теперь у него в @flag лежит семёрка. Прочитать её может любой процессор:
sensor метка @unit @flagПрограмма раздаёт номера: у кого метки нет (ноль) — тому выдаётся следующая, у кого есть —
тот пропускается. Три поли получают единицу, двойку и тройку, и последний останавливается
на трёх: помечать больше некого.
Метку ставят всегда, а не когда понадобится
Заголовок раздела «Метку ставят всегда, а не когда понадобится»Легко решить, что разметка — это для сложных случаев: «у меня один процессор, я просто
буду брать своих перебором». Так не выйдет. ubind @poly у каждого процессора идёт
по общему списку всех поли команды, и счётчик у каждого свой. Два процессора
без меток неизбежно возьмут одного и того же юнита и будут отбирать его друг у друга — молча, без единой ошибки.
Поэтому разметка — это не приём на будущее, а обычный вид программы про юнитов:
ubind @polysensor метка @unit @flagjump 0 notEqual метка 0ucontrol flag 1 0 0 0 0Пока юниты без метки, процессор их разбирает; размеченных пропускает. Чужие — те, у кого метка не его, — он не тронет никогда.
Зачем это нужно
Заголовок раздела «Зачем это нужно»Флаг — единственная память, которая живёт на самом юните, а не в процессоре и не в ячейке. Отсюда и все его применения:
- разделить отряд. Метка
1возит медь, метка2копает, метка3чинит. Каждый процессор смотрит на флаг и пропускает чужих; - не хватать одного и того же дважды. Пометив юнита, программа видит, что он уже занят — даже если забыла его между итерациями;
- передать юнита другому процессору. Один помечает, другой читает: общаться через флаг дешевле, чем через ячейку памяти, и метка всегда при юните;
- посчитать своих. Перебор плюс проверка флага — и ясно, сколько юнитов уже разобрано по делам.
Чего флаг не умеет
Заголовок раздела «Чего флаг не умеет»Флаг не видит враг — как и всё остальное у чужих юнитов. Флаг не показывается в игре: ни цифры над юнитом, ни подсветки. И флага нет у зданий: там роль метки играет ячейка памяти или настройка блока.
И договариваться о числах приходится самим: игра не даст двум процессорам разные метки, она просто хранит число. Два автора, поставившие единицу, получат ту же путаницу, что и без меток вовсе.
Неофициальный проект, с Anuke не связан. Спрайты, шрифты и переводы Mindustry © Anuke, используются по GPL-3.0; Fira Code — по OFL-1.1. Код сайта — GPL-3.0.