dr.Titus писал(а):
Кстати, убирание рамки вокруг экрана и расширение рабочего поля на нее - не убыстрит ли игру?
Ну это уже сделано, не убыстрило, наоборот немного замедлило, так как теперь окружности рисуются на большем поле, линии и так рисовались, я уже писал, просто было прикрыто черным инком.
GoodBoy писал(а):
вроде Кладов как раз это и сделал
Да я читал об этом, что именно было сделано не знаю, когда закончу разбираться с 3д посмотрю. Код у Кладова хороший, я вскользь смотрел, но там основной упор на размер был.
Как идея думаю работу с текущим объектом сделать через копируемый буфер, во первых освободит индексную пару, во вторых уберет кучу чтений по смещению, хорошо скажется на размере и скорости.
Из простого и пиздатого, умножение о котором сказано в факте 3
Если нужен только старший байт и немного похуй на точность
Код:;char A(X) = char B * char CA_BxC_AB0B; change adhllda, bsubcjrnc, .loc_AB11lda, csubb.loc_AB11rraldh, 1+high sq_tab_be00ldl, aldd, (hl)lda, badda, crraldl, alda, (hl)subdret
Полностью, но на точность так же похуй
Код:; int HL=char B * char CHL_BxC_AB34lda, bsubcjrnc, .loc_AB3Alda, csubb.loc_AB3Arraldh, 1+high sq_tab_be00ldl, aldd, (hl)dechlde, (hl)lda, badda, crraldl, alda, (hl)subelde,ainchlda, (hl)sbca, dldh, aldl,eret
Вроде в обоих немного переделывал, но совсем по мелочи.
dr.Titus писал(а):
Это ты для демонстрации привел их, как там делается?
Или это уже какие-то нововведения и убыстрения?
Я не знаю, и то и то, просто мне нравиться такие штуки в коде когда просто и эффективно, может кого еще прикалывает. Так как с линией разобрались, я посмотрел прекалк, там ад с флаговыми таблицами и при этом весьма шустрый, разложил пару веток с небольшим компромиссом из твоих предложений, на длинных линиях конечно прилично прибавило, но они там не настолько часто встречаются, в основном пикселей до 20, а на этом экономия не такая существенная так как нужно еще разложить направления.
Хватит откладывать математику.
Глянул краем глаза у Кладова глюкан с отображением не починен, а это значит он в код расчета 3д вообще не лазил. В моделях там да есть неиспользуемые биты видимо он их уплотнил.
Вопрос к игрокам по перехвату в гипере таргонами. Если вас перехватили и вы всех поубивали, пособирали алиент итемсы возникает патовая ситуация, топливо сожжено, вы на пол пути к цели, звезды нет, планеты нет, то есть все гейм овер? Думаю поправить данный момент, сделать что бы топливо сжигалось пропорционально пройденному расстоянию, но может есть нормальный способ продолжить игру?
и чуток погуглил
"Перед боем надо заправиться топливом у звезды и оттуда сделать гиперпереход. Следите, чтобы в этот момент надпись FUEL SCOOPS ON была на экране.
Эффект следующий. Во время боев в гиперпространстве все время будет гореть эта надпись, как будто дозаправка топливом не прекращалась. Вы сможете переходить от одной атаки к другой, не боясь "застрять" в космосе. Кстати, это мероприятия одновременно предохранит Вас от утечек горючего при повреждениях в бою (FUEL LEAK!)."
GoodBoy писал(а):
и чуток погуглил
"Перед боем надо заправиться топливом у звезды и оттуда сделать гиперпереход. Следите, чтобы в этот момент надпись FUEL SCOOPS ON была на экране.
Эффект следующий. Во время боев в гиперпространстве все время будет гореть эта надпись, как будто дозаправка топливом не прекращалась. Вы сможете переходить от одной атаки к другой, не боясь "застрять" в космосе. Кстати, это мероприятия одновременно предохранит Вас от утечек горючего при повреждениях в бою (FUEL LEAK!)."
Ну это явный баг, на уровне стыковки на полной скорости. Да и никак не спасает от редко рандомного перехвата без f, не постоянно же от звезды прыгать. Посмотрел по флагам, тоже не нашел с первого взгляда ничего подходящего.
Про условия начала миссий
Миссии не выдаются в первой галактике. Миссии можно выполнить только по одному разу ( ну я по крайней мере не нашел где это скидывается)
Супернова : дается после 32 гиперпереходов через 256, тоесть если вы оказались во второй галактике на 260 гипере то нужно будет еще полетать. Подобное условие для всех миссий
Cloacking Device : дается после 128 гиперов
Захват станции таргонами после 254 гиперов
Я читал ветку на зх где Кладов и народ говорят немного про другое, но в коде так.
Правовой статус бывает 3 градаций, им соответствуют значения счетчика
Clean - чистый 0
Offender - правонарушитель 1-#31
Fugitive - беглец #32-#ff
За сбитый корабль дружелюбный корабль на счетчик по OR накладывается значение #40, короче сбив 1 можете мочить всех без разбору, это никак не скажется на дальнейшем ухудшении рейтинга. За покупку или подбор запрещенных грузов штраф суммируется до максимального значения в 255, за каждую тонну:
Slaves и Narcotics по 4
Firearms по 2
Уменьшить значения еще проще. За каждый гиперпереход значение уменьшается в 2 раза, сбив толпу народу и сделав переход вы получите #40/2=#20<#32 то есть всего лишь Offender. Так же счетчик сбрасывается в 0 при галактическом переходе и при использовании спасательной капсулы.
В данный момент я не нашел никаких условий для проверки, ни вайперы ни фер де ленсы не проверяют правовой статус, просто они рандомно могут быть враждебными. Напомню, это касается версии 48к с защитой и аддером. Таким образом в этой версии правовой статус ни на что не влияет.
Так же есть флаг нападения на станцию, о котором я уже писал. При выстреле по станции лазером или ракетой (пуск тоже считается) она для вас закрывается, для ее открытия нужно отлететь на расстояние j двигателя и пролететь на нем хотя бы 1 кадр, это сбросит флаг, ну или сделать гиперпереход.
kalantaj писал(а):
Кадр это сколько? В чем измеряется? в времени полёта или в чём-то другом?
Это один рендер кадра, в данном случае значит надо просто нажать j ускорение, расстояние не важно, флаг сбросится. J двигатель активизируется на определенном расстоянии от планеты и солнца, а так же когда на радаре нет кораблей.
krt17 писал(а):
ни вайперы ни фер де ленсы не проверяют правовой статус, просто они рандомно могут быть враждебными.
а почему тогда в данных для кораблей две кобры ?
(мне говорили что это разные описания - мирная и пиратская)
вспомнил что и питонов - два
" координаты вершин, ребра и плоскости для обоих кораблей хранятся в одной области памяти, а в описаниях мирного корабля и пирата только её адрес"Отредактировано GoodBoy (2016-11-25 20:03:34)
GoodBoy писал(а):
а почему тогда в данных для кораблей две кобры ?
Все верно, кобры и питона по 2 штуки, а так же 2 астероида, один база старателей второй просто астероид. Они ссылаются на одни и те же модели, но сами объекты разного типа, в случае с фер де ленсами и вайперами немного по другому. Почему так сделано пока не знаю, в коде очень много мест которые видно писались по заявкам на изменение, вставлялись условия и проверки которые проще было сделать сразу по другому. Видимо подтачивали баланс, добавляли разнообразие. Я не играл в версию без защиты, там все было скомпилено по новому, возможно есть изменения в логике. Но сейчас очень много для меня странных мест, некоторые прям кусками переписывать можно без потери функционала. Сейчас занят куском который выводит сообщения, в процессе набрел, в том числе, на вывод правового статуса решил написать, так как для меня это было не очевидно.
Как работает 3д
У каждой модели есть 3 таблицы
Таблица нормалей
Таблица точек
Таблица ребер
Вычисление и отрисовка идет в 3 шага
1 вычисление видимости граней по нормалям
2 вычисление экранных координат точек
3 отрисовка отрезков
Нормали задают основу для определения видимости ребер, при вычислении нормаль поворачивается через матрицы на текущий угол и проверяется ее знак, направлена от игрока значить связанные с ней ребра не видны.
Таблица точек в добавок к координатам ссылается на 4 нормали если хоть одна из них видна, то точка вычисляется.
При отрисовке граней так же проверяется связанные с каждой гранью 2 нормали если хоть одна видима то отрезок рисуется.
По затратам например при вращении кобры на заставке этапы занимают примерно 90к 200к 80к тактов, это для одного корабля. Очень много чтения через индексные регистры, причем даже для статической матрицы поворота.
В чем проблема при отрисовке пока не выяснил, возможно ошибка в ссылках на нормали, может в погрешности вычислений, по хорошему надо сделать альтернативный рендер на пц, но пока не знаю возьмусь ли, делов то не много, но я уже нифига не помню. Посмотрим.
Есть альтернативный подход определения видимости.
Вычисляются экранные координаты всех точек
Берем 3 точки в одной плоскости и вычисляем скалярное произведение пары получившихся векторов, оно будет определять видимость. Все параллельные плоскости будут также определены.
Можно разбить точки на значимые для определения видимости и дополнительные нужные только для отрисовки в параллельных плоскостях, избавимся немного от оверхеда, который получили уходом от нормалей. Грани оставить по оригинальному алгоритму. Мне кажется так будет побыстрее и точно избавит от проблем с видимостью. Тут основное по затратам времени получение экранных координат точек, надо смотреть сколько лишних будет при таком подходе и компенсирует ли оно экономию на нормалях.
В любом случае оптимизация реально поможет.
krt17, тема замечательная, рассказчик ты неплохой! Много дела, мало мата - значит всё у нас как надо!
На счёт косяка неправильного определения видимости грани. Возможно что баг в коде, но возможно дело в следующем:
Видимость нормали проверяется без учёта перспективы. Есть такие случаи, когда координата Z(условно) нормали отрицательна (вроде бы повёрнута в нашу сторону), но не смотрится именно из точки взгляда.
На рисунке точка О - откуда глядим, Z направление взгляда, AB - отрезок символизирующий грань. (сечение грани плоскостью рисунка) n - вектор нормали грани.
Про перспективу было такое предположение, пока не могу сказать точно. Не настолько идет искажение на заставке. Пока решил не отказываться от нормалей для определения видимости, а потихоньку расписать все матричные преобразования, там одновременно и поворот объекта происходит, и у меня большое подозрение что приведение матрицы поворота делается каждый раз заново, а это дикий оверхед, и тоже самое с точками. В любом случае и для истории пригодится и может какие идеи появятся для оптимизации.