Подписаться
для оповещений:
RU
Вход / Регистрация
  • Аватар пользователя Útost Alronbem
    7 месяцев19 дек. 2025 в 21:48

    [моё] Инкостыляция, костылирование, поликостылизм... IN SPAAAAACE!!!

    Пока одно полушарие моего мозга пытается сообразить, как должен быть написан гайд по внутриигровому языку программирования в угадайте-где, второе думает над забавной проблемой этого языка.

    С одной стороны, сочетание условий применения и интерфейсной реализации делают какие-то комплексные задачи ненужными.
    Уже имеющийся набор функций и базовых арифметических/геометрических вычислений всё покроет.

    С другой стороны, излишняя примитивность (и, кое-где, неинтуитивность) "языка андроидов" регулярно кусает за жопу в довольно неожиданные моменты.
    И это проблема.

    Частный случай такой проблемы, с примитивным, но ппц неочевидным для не-программиста решением.
    Во внутриигровом языке программирования про полёты и грамотное позиционирование нет понятия "сзади".
    И нет, сравнивать массивы поэлементно тут нельзя.
    Иначе и поста этого бы не было.
    Как и проблемы "как зайти противнику в тыл (и расстрелять его в спину), если нет понятия "тыл".
    И повернуть координатную сетку, кстати, тоже нельзя.

    Сначала мой мозг вспаникнул.
    Выдал совершенно безумную конструкцию со сравнением углов поворота корпуса цели (относительно положения по умолчанию) с углом поворота корпуса моего корабля.
    Вычислением, в какую четверть координатной сетки "смотрит" вектор от моего корабля до цели.

    Короче, очередные блядские спагетти от очередного рукожопа плюс повод поныть в специальной теме, что "как я могу реализовать бонус от атаки в корму, если нет функции определения, а где вообще корма и как подлететь именно к ней".
    Зато всё по учебнику.
    Школьному.
    По планиметрии.

    N итераций насилия над игровым программированием и здравым смыслом спустя, в перечне доступных функций обнаружилась приблуда для рассчёта упреждения.
    (даже две - одна со сдвигом на фиксированное расстояние по вектору, вторая со сдвигом, вычисляемым на основе текущей скорости цели и заданного промежутка времени)
    Нужная вообще-то строго для скриптов стрельбы, благо стрейфиться корабли обычно не умеют.

    После пары сигареток до меня дошло, что, во-первых, движку в общем-то наплевать, для чего мы рассчитываем упреждение. Результат работы функции - самые обычные координаты, которые в пределах потока можно как угодно использовать.
    А во-вторых, отрицательное упреждение эта функция очень даже позволяет взять.
    Что и даст нам ориентир "задница вот здесь" для дальнейших рассчётов курса.
    С указанием точных координат.
    "Сюда придёшь - жопу вражью найдёшь", да...

    К чему я веду этот спич о быдлокодерских страданиях.

    Движок не предусматривает возможности скормить рассчёту упреждения параметры орудия (дальнобойность), если функция рассчёта упреждения вызвается в потоке навигации, а не стрельбы этим орудием.

    Да, движок многопоточный асинхронный (я же правильно это назвал?)
    Управление движением корабля в своём потоке, поведение каждой пушки (и каждой группы дронов) в своём.
    Потоки общаются друг с другом через глобальные переменные.
    Которых на всё про всё ТРИ.
    Зато универсальные.

    Хардкодить дальность отрицательного упреждения для навигации мне, прошу прощения за быдлячество, западло.
    Здравый смысл требует это как-то вычислять динамически.
    Потому, что после каждой перестановки стволов на корпусе менять эту цифру вручную - это не нормально.
    IT - это про автоматизацию, так что, это НАДО автоматизировать.

    При этом, сравнить параметры пушек en masse или хотя бы посчитать, сколько у нас стволов, движок в принципе не даёт.
    Никак.

    Придётся застолбить под минимальную дальность стрельбы (она же "отрицательное упреждение" для захода противнику в тыл) одну переменную.
    И в скрипт каждой пушки вставить сниппет вида:
    - если в той глобальной переменной записан ноль, то перезаписать её своей дальностью стрельбы,
    - иначе сравнить значение переменной и свою дальность стрельбы и
    -- если дальность меньше - перезаписать в переменную свою дальность стрельбы,
    -- иначе больше не вызывать этот сниппет до конца боя (не то чтобы это было обязательно, но "подумать о детях" (ergo, о бесполезных вызовах уже отработавшей своё функции) - это хороший тон).

    Ну и не забыть где-нибудь перед блоком рассчёта координат для захода в тыл считать значение этой глобальной переменной, поменять знак, записать результат в виртуальную локальную переменную для удобства.
    Причём, ЭТОТ блок ПРИДЁТСЯ вызывать на каждом цикле обсчёта навигации.
    Потому, что потоки асинхронные - и ничто не гарантирует, что на первой итерации этого шага этого скрипта в этом потоке остальные потоки уже отработали по разу (или хотя бы произвели нужные нам вычисления).

    Впрочем, можно было бы пофлексить и через ещё одну-две переменные впилить подсчёт количества пушек vs количества уже отчитавшихся о своей дальнобойности пушек...
    Но это уже не сегодня.
    Потому, что есть у движка ещё одна прикольная особенность.
    Три IF'а на поток.
    Попытаться сделать больше, в принципе, можно.
    Просто после каждого IF'а надо вручную сбрасывать... чёрт побери, я даже не знаю, как русским языком это объяснить...

    Короче, IF'ы имитируются тремя виртуальными bool переменными при каждом потоке.
    Каждая команда в функции потока привязана к одной из этих трёх переменных (задаётся вручную).
    Пока соответствуюшая переменная 1 (значение по умолчанию) - все привязанные к ней команды выполняются.
    Во всех отношениях это самые обычные локальные переменные - в пределах потока любую из них можно поменять как угодно откуда угодно.
    Что открывает неограниченные возможности выстрелить себе в ногу.

    Так, что-то я разошёлся...
    Надо спать идти, пока я не нащупал лимит на максимальную длину поста.
    Пока хватит с меня багов на сегодня...
    / 1 / 0
    Отношение пожительных и отрицательных голосов: 1/0
    Лайкнуть этот пост, увеличить его рейтинг
    Количество комментариев под постом, кликните сюда чтобы перейти к посту
    Количество просмотров у поста, кликните сюда чтобы перейти к посту
  • Комментарии
  • Аватар пользователя Rastoropsha
    7 месяцев19 дек. 2025 в 21:55
    Приветствую увлекающихся людей.
    Неважно, чем увлекающихся.
    Инкостыляция, костылирование, поликостылизм... IN SPAAAAACE!!! #2
    Лайкнуть этот пост, увеличить его рейтинг
Talkvio Engine 0.2.0-1542-g77b27fd
X
0.2.0-1542-g77b27fd