[моё] Инкостыляция, костылирование, поликостылизм... IN SPAAAAACE!!!
Пока одно полушарие моего мозга пытается сообразить, как должен быть написан гайд по внутриигровому языку программирования в угадайте-где, второе думает над забавной проблемой этого языка.
С одной стороны, сочетание условий применения и интерфейсной реализации делают какие-то комплексные задачи ненужными.
Уже имеющийся набор функций и базовых арифметических/геометрических вычислений всё покроет.
С другой стороны, излишняя примитивность (и, кое-где, неинтуитивность) "языка андроидов" регулярно кусает за жопу в довольно неожиданные моменты.
И это проблема.
Частный случай такой проблемы, с примитивным, но ппц неочевидным для не-программиста решением.
Во внутриигровом языке программирования про полёты и грамотное позиционирование нет понятия "сзади".
И нет, сравнивать массивы поэлементно тут нельзя.
Иначе и поста этого бы не было.
Как и проблемы "как зайти противнику в тыл (и расстрелять его в спину), если нет понятия "тыл".
И повернуть координатную сетку, кстати, тоже нельзя.
Сначала мой мозг вспаникнул.
Выдал совершенно безумную конструкцию со сравнением углов поворота корпуса цели (относительно положения по умолчанию) с углом поворота корпуса моего корабля.
Вычислением, в какую четверть координатной сетки "смотрит" вектор от моего корабля до цели.
Короче, очередные блядские спагетти от очередного рукожопа плюс повод поныть в специальной теме, что "как я могу реализовать бонус от атаки в корму, если нет функции определения, а где вообще корма и как подлететь именно к ней".
Зато всё по учебнику.
Школьному.
По планиметрии.
N итераций насилия над игровым программированием и здравым смыслом спустя, в перечне доступных функций обнаружилась приблуда для рассчёта упреждения.
(даже две - одна со сдвигом на фиксированное расстояние по вектору, вторая со сдвигом, вычисляемым на основе текущей скорости цели и заданного промежутка времени)
Нужная вообще-то строго для скриптов стрельбы, благо стрейфиться корабли обычно не умеют.
После пары сигареток до меня дошло, что, во-первых, движку в общем-то наплевать, для чего мы рассчитываем упреждение. Результат работы функции - самые обычные координаты, которые в пределах потока можно как угодно использовать.
А во-вторых, отрицательное упреждение эта функция очень даже позволяет взять.
Что и даст нам ориентир "задница вот здесь" для дальнейших рассчётов курса.
С указанием точных координат.
"Сюда придёшь - жопу вражью найдёшь", да...
К чему я веду этот спич о быдлокодерских страданиях.
Движок не предусматривает возможности скормить рассчёту упреждения параметры орудия (дальнобойность), если функция рассчёта упреждения вызвается в потоке навигации, а не стрельбы этим орудием.
Да, движок многопоточный асинхронный (я же правильно это назвал?)
Управление движением корабля в своём потоке, поведение каждой пушки (и каждой группы дронов) в своём.
Потоки общаются друг с другом через глобальные переменные.
Которых на всё про всё ТРИ.
Зато универсальные.
Хардкодить дальность отрицательного упреждения для навигации мне, прошу прощения за быдлячество, западло.
Здравый смысл требует это как-то вычислять динамически.
Потому, что после каждой перестановки стволов на корпусе менять эту цифру вручную - это не нормально.
IT - это про автоматизацию, так что, это НАДО автоматизировать.
При этом, сравнить параметры пушек en masse или хотя бы посчитать, сколько у нас стволов, движок в принципе не даёт.
Никак.
Придётся застолбить под минимальную дальность стрельбы (она же "отрицательное упреждение" для захода противнику в тыл) одну переменную.
И в скрипт каждой пушки вставить сниппет вида:
- если в той глобальной переменной записан ноль, то перезаписать её своей дальностью стрельбы,
- иначе сравнить значение переменной и свою дальность стрельбы и
-- если дальность меньше - перезаписать в переменную свою дальность стрельбы,
-- иначе больше не вызывать этот сниппет до конца боя (не то чтобы это было обязательно, но "подумать о детях" (ergo, о бесполезных вызовах уже отработавшей своё функции) - это хороший тон).
Ну и не забыть где-нибудь перед блоком рассчёта координат для захода в тыл считать значение этой глобальной переменной, поменять знак, записать результат в виртуальную локальную переменную для удобства.
Причём, ЭТОТ блок ПРИДЁТСЯ вызывать на каждом цикле обсчёта навигации.
Потому, что потоки асинхронные - и ничто не гарантирует, что на первой итерации этого шага этого скрипта в этом потоке остальные потоки уже отработали по разу (или хотя бы произвели нужные нам вычисления).
Впрочем, можно было бы пофлексить и через ещё одну-две переменные впилить подсчёт количества пушек vs количества уже отчитавшихся о своей дальнобойности пушек...
Но это уже не сегодня.
Потому, что есть у движка ещё одна прикольная особенность.
Три IF'а на поток.
Попытаться сделать больше, в принципе, можно.
Просто после каждого IF'а надо вручную сбрасывать... чёрт побери, я даже не знаю, как русским языком это объяснить...
Короче, IF'ы имитируются тремя виртуальными bool переменными при каждом потоке.
Каждая команда в функции потока привязана к одной из этих трёх переменных (задаётся вручную).
Пока соответствуюшая переменная 1 (значение по умолчанию) - все привязанные к ней команды выполняются.
Во всех отношениях это самые обычные локальные переменные - в пределах потока любую из них можно поменять как угодно откуда угодно.
Что открывает неограниченные возможности выстрелить себе в ногу.
Так, что-то я разошёлся...
Надо спать идти, пока я не нащупал лимит на максимальную длину поста.
Пока хватит с меня багов на сегодня...
Отношение пожительных и отрицательных голосов: 1/0