Как я создавал свою DUNE IV

( Демьянишин Владислав )


Этапы разработки игры DUNE IV:

??.Добавил объект Smoke для всех движущихся объектов. 21.Добавил объект Explose для движущихся объектов. Пока настроил "взрыв" для солдат. 22.Добавил взрывы для Trike,BTR,Tank,BTank,... Изменил процедуры прорисовки движения солдата и трупера чтобы они двигались более плавно. 24.Добавил объект Shut для всех боевых единиц кроме Девиатора и Соник-Танка. 25.Добавил выстрелы для Sonik-Tankа. 26.Перебросил многие вспомогательные процедуры в утилиту dvga.tpu. 27.Изменил процедуру Barrier для каждого Unitа чтобы пехота проходила через горы, а БТРы объезжали пехоту и другие Unitы, а танки чтобы давили пехоту. 28.Добавил систему атаки для Unitов. 29.Увеличил угол поворота при патрулировании vrUp,..,vrUpLeft. Добавил в объект Shut вызов метода Damaging объекта Solder-хозяина, и при атаке стрельба продолжается, пока не взорвется атакуемый объект. 30.Добавил систему охраны для Unitов, при появлении противника в пределах дистанции атаки Unit переходит в режим атаки и атакует этого врага. 31.Добавил прорисовку взрыва от попадания выстрела по цели. 32.Добавил в процедуру function ChaseComplete:Tbit1; в методе TSolder.Commander строку > эта строка для того, чтобы преследователь не петлял и не > делал единичные шаги в стороны от траектории преследования цели > vector:=GetVector(mapx,mapy,mx,my); 33.Заменил процедуру GetVector на GetMovingVector(GetShutVector), которая определяет вектор по углу направления к цели. Нашел и исправил ошибку - солдаты атакованы танком, и тут же задавлены харвестером. Солдаты пытались атаковать харвестер но он уже был на них и их координаты были равны и в процедуре GetShutVector возникала ошибка арифметики. 34.Добавил Arnifighter. 35.Исправил процедуры Barrier для всех объектов, чтобы все наземные объекты не были препятствием для воздушных объектов, и чтобы воздушные объекты не были препятствием для наземных объектов. Добавил прорисовку стрельбы и взрыва для Arnifighter. 36.Добавил стрельбу для Deviator и прорисовку газа, и настроил временный переход врага на сторону Девиатора. 37.Добавил движущимся объектам реакцию при нападении на них, они в ответ атакуют нападающего. 38.Исправил файл shutes.dat - нарисовал новые ракеты. Для PSD убрал реакцию на нападение. 39.Удалил из файлов army3.dat и army4.dat картинки теней авиа объектов, вместо этого сделал две процедуры рисования тени 16x16 и 24x24 черным цветом. Это экономит место в памяти около 2k+9k=11k. Добавил настройки для Носителя и убрал для него атаку. 40.Добавил 2 шага прорисовки полёта выстрела, а то за два шага выстрел пропадал. 42.Исправил файл army.dat, при погоне за атакуемым объектом преследователи наезжали на друг друга и дальше двигались в одной позиции. Это устранено. Сделал раздельную прорисовку не только пехоты и танков, но и авиации в последнюю очередь, чтобы летающие объекты рисовались над всеми остальными. 56.Добавил прорисовку KDvor,Plita,Energy,Turret,RTurret. Добавил стрельбу, атаку для Turret,RTurret. Добавил в процедуру Barrier определение зданий как препятствия, кроме плиты. 58.Добавил объекты Smoke,Explose для объекта Build. Добавил процедуру BuildEnemyFound для объекта Solder, атаке подвергаются все здания кроме плиты. 59.Исправил метод DecLife объекта Build чтобы дым не рисовался вовремя взрыва. 60.Исправил метод GetPoint объекта Build и теперь этот метод возвращает правильное значение Y, а не произвольное. Теперь истребители не летят куда-то вниз, а правильно атакуют здание. 61.Убрал из использования Turbo.tpl и заменил его файлами DOS.TPU и SYSTEM.TPU. 62.Перенес все объекты в утилиту dvga.pas и расширил экран и подправил прорисовку в пределах этого экрана. 63.Добавил в утилиту dvga.pas процедуры для работы с мышкой, и курсоры для неё. 64.Добавил мерцание цвета Ветряка и цвета выделения врага и цели. 65.Добавил опрос состояния мыши, распознавание NoEvent,Click, DblClick,RClick. Сделал слежку за курсором мыши, если курсор попадает на какой-нибудь объект (боевая единица или здание), то форма курсора меняется и цвет показывает враг это или друг. 66.Добавил выбор объекта Clickом и если это дружественный Unit то по нажатии RClick он двигается в точку где курсор. 67.Добавил прокрутку игрового экрана с помощью мыши и добавил курсоры для прокрутки. 68.Добавил вывод панели без кнопок. 69.Добавил выход по Clickе на слове MENU на панели. 70.Добавил позиционирование положения на карте через Click на мини карте и прорисовку прямоугольника на мини карте. 71.Попытался добавить рисование прямоугольника при передвижении мыши и нажатой левой клавише. Рисует но еще не выделяет объекты. 72.Квадратом при движении мыши и нажатой левой клавише выбирает один объект. 73.Добавил рисование прямоугольника на объекте если он выбран. 74.Исправил в процедуре DrawSelection захват объекта и если захвачен другой объект, то предыдущий объект освобождается вызовом его метода UnSelect. 75.Добавил рисование иконки объекта с полоской жизни. 76.Добавил рисование кнопок управления для Unitов. 77.Добавил метод ToDestroy для объекта Solder. Добавил метод ToPutKDvor для объекта Solder. 78.Добавил управление по кнопке МАРШ, АТАКА, РАЗРУШИТЬ, ПОМЕСТИТЬ и настроил курсор для этого. 79.Добавил рисование Unitов и зданий на мини-карте. 80.Добавил выделение нескольких Unitов (своих) по захвату их в прямоугольник. Добавил управление этой группой Unitов. 81.Добавил рисование иконок для выделенных Unitов. 82.Исправил ошибки связанные с таблицей выбранных Unitов. 83.Исправил управление Unitов по правому клику в отношении зданий(атака/движение). 84.Исправил ошибку в процедуру DrawJIcons так как в цикле просматривались только player.select Unitов, а должно просматривать все 14 Unitов. И поэтому когда убивали 1 Unit то из выделенных 4-х могло остаться 2, а то и ни одного. 85.Добавил рисование иконки здания как кнопки. 86.Добавил процедуру выделения и теперь можно сэкономить на памяти под кнопки, так как можно всю менюшку с кнопками хранить в буфере а выделять процедурой VGetPut_Block. 88.Начал переход на использование resurs.pas. Настроил выделение кнопок меню для KDvor. 89.Добавил создание здания по вызову процедуры CreateBuild. Добавил объект TMessage, который управляется через процедуру PutMessage. 90.Добавил в меню KDvor рисование иконок зданий и прокрутку по кнопкам Up, Down. 91.Добавил в процедуру print определение ширины каждого выводимого символа для выравнивания текста с символами разной ширины. 92.Добавил в объект TBuild метод ToBuild и TheBuilding. 93.Добавил обработку msClick в меню для Kdvor (Up, Down, Построить, Продолжить). 94.Добавил рисование кнопки РЕМОНТ если жизнь здания меньше его максимальной величены. 95.Добавил Строить,Стоп при нажатии на большую кнопку справо на экране. 96.Добавил CreateUnit и всё что для этого нужно, но еще не готовы меню для Kazarma, Akademy, Lzavod, Tzavod, Azavod. Добавил в меню KDvor проверку хватает ли финансов у альянса перед тем как создавать что-либо. В метод ToBuilding объекта TBuild добавил проверку - если строительство не завершено или создаваемый объект ещё не создан, то прежде чем начать другое строительство деньги возвращаются в казну альянса. 97.Добавил включение Ремонта по клике на клавише ремонт, и остановке ремонта по клику или по нехватке финансов. 98.Добавил включение доделки в KazarmaMenu для объекта TBuild и исправил скроллинг иконок объектов в меню строительства. Kazarma создаёт солдат. 99.Добавил AkademyMenu,LzavodMenu и вернул загрузку ресурсов и придётся отлаживать без отладчика. 100.Заменил процедуры Vput16x16,24x24 на assembler. 104.Заменил процедуры Vput32x32,Vput_Img на assembler. 105.Исправил рисование маленьких иконок(интервал по X-у 1 точка а не 2). Исправил процедуру CreateUnit на возврат денег. Добавил в процедуру FoundEmptyPlaceForCreateUnit поиск места в два ряда а не в один вокруг здания. 106.Добавил процедуру AzavodMenu. 107.Добавил отсчёт кадров прорисовки(или квантов активности) в минуту. При старых PAS-процедурах прорисовки и при 3-х юнитах FPM не превышало 694/мин, а теперь при ASM-процедурах прорисовки и при 34 юнитах около 694..792/мин, а то и 832/мин. 108.Исправил метод Motion объекта TSolder и теперь если группу юнитов послать в какую-нибудь точку то они не будут ездить вокруг до опупения, а остановятся в непосредственной близости к этой точке. 109.Добавил установку здания по мышке, но еще много ошибок в процедуре поиска пустого места для установки и не учитывает горы и песок. Теперь исправлено. 160.Перенёс на Delphi 3.01. Добавил меню для всех производящих заводов. Добавил объект TSpice. Добавил в харвестер режим сбора спайса и исчезновение спайса при исчерпании. 165.Добавил для носителей режим загрузки(cmLoad) и выгрузки(cmUnLoad) юнитов. Причём если загружен харвестер то больше на борт носитель ничего не берёт. 168.Исправил режим сбора спайса для харвестера. Когда на указанном участке спайса находится препятствие, то харвестер ищет новый участок со спайсом, а не крутится вокруг этого препятствия (обычно юнита) как это было раньше. 169.Добавил режим очистки(ToClear,TheClear) для очистителя и режим возврата (ToBack,TheBack) для харвестера. 170.Добавил рисование элеватора с харвестером, и рисование мигающей посадочной площадки на элеваторе. 171.Исправил рисование носителя с грузом - теперь рисует с грузом. Изменил определение цели для разных юнитов, лёгкая пехота, БТРы, танки не могут стрелять по авиа юнитам, а только по наземным юнитам. Тяжёлая пехота, РПУ и арнифайтер могут стрелять по любым видам юнитов. 172.Добавил рисование высыпающегося спайса из харвестера в режиме сборки. 173.Добавил для элеватора проверку, если есть XCenter, то при разгрузке харвестера денег получается на 20% больше. 174.Добавил для ветряка проверку потребления и выработки энергии и если энергии вырабатывается меньше чем потребляется, то жизнь ветряка уменьшается каждые 30 секунд на 1%. Исправил ошибку в методе ToAttake объекта TSolder при определении доступа к цели здание идентифицировалось как объект с номером TSolder target.num. 175.Исправил в методе Attake объекта TSolder процедуру GetGoodNewCoord на NewGetGoodNewCoord которая ищет ближайшее место к цели(пункту) в пределах квадрата 5 на 5 вокруг цели. 176.Исправил в методе ToMove объекта TSolder процедуру GetGoodNewCoord на NewGetGoodNewCoord которая ищет ближайшее место к цели(пункту) в пределах квадрата 5 на 5 вокруг цели. 178.Попытался исправить метод ToBack и TheBack чтобы харвестер искал ближайший свободный элеватор, если другой к которому он шёл занят, или подступы к небу блокированы. Исправил рисование спайса и добавил для спайса ещё четыре картинки. Исправил рисование юнита за левым краем(был не видим если на 1 позицию за левым краем). 179.Добавил для элеватора проверку на количество ёмкостей для хранения спайса и если ёмкостей не хватает, то не принимать харвестер на разгрузку. Добавил вывод информации на панель информации о спайсе в выбранном силосе или элеваторе, и информацию о энергии для выбранного ветряка. Исправил ошибку - при входе в меню какого-нибудь здания при нажатии клавиш вверх, вниз, влево, вправо изменялись координаты положения экрана игры и при выходе из этого меню получалось, что экран уже в другом месте на карте. 180.Добавил рисование следов на песке для тяжёлых юнитов. 181.Добавил рисование рельефа на мини-карте. Исправил - при взрыве силоса или элеватора деньги не утрачивались, а теперь нормально. Исправил - при создании соник-танка на самом деле создавался солдат, теперь нормально. 182.Добавил для харвестера выброс спайса если харвестер подбит и находится на песке и если в нём спайса было больше 70%. Добавил определение жизни здания по кол-ву плит на которые оно устанавливается и уничтожение этих плит как объектов. 183.Попробовал оптимизировать рисование рельефа местности в игровом окне через VPut_page16x16 и VPut_sprite16x16. было FPS: моих=27 DelphiX=19..20, а стало моих=32 DelphiX=24..25. 184.Вынес объект TExplose из объектов TSolder,TBuild и сделал его общим массивом как Solders:array и Build:array. 185.Вынес объект TShut(TBShut) из объектов TSolder,TBuild и сделал его общим массивом как Solders:array и Build:array. 186.Ограничил количество вызовов цикла квантов для спайса, раньше вызывались как и все объекты( раз за одно обновление экрана), а теперь только каждый 9-ый раз обновления экрана. было FPS=24..25 стало FPS=25..27 (DelphiX FullScreen) 187.Сделал прорисовку рельефа местности в зависимости, если экран игры на прежнем месте, то сам рельеф не рисуется а просто копируется его копия на экран, а если игрок применил скроллинг по карте то перерисовывается экран рельефа и копируется в буфер хранения копии. моих FPS=37, DelphiX FPS=25..28 (FullScreen). Исправил рисование спайса у правой граници экрана, а раньше правый столбик спайса не рисовался. 188.Исправил метод ToAttack объекта TSolder, раньше по команде ToAttack юнит(сам или в группе с другими юнитами) мог взять себя же на цель и быть в режиме атаки, хотя и не стрелять по себе, а теперь он не берёт себя на цель. Исправил методы ToAttack и Stoping объекта TSolder для РПУ(RTank) чтобы он не мог брать на цель объекты ближе чем ближняя дистанция. Исправил повреждение Соник-Танка, если по Соник-Танку выстрелил Соник-Танк, то вред не наносится, а раньше наносился. Добавил нанесение повреждений всем объектам(кроме Носителя, Арнифайтера и Соник-Танка),которые находятся на траектории выстрела Соник-Танка. 189.Попытался перенести первый вызов процедуры Runprog(из DXTimer1Activate) в процедуру инициализации таймера DXTimerActivate. Попытался разделить процедуру tKvant на две dKvant и tKvant, процедуру dKvant(draw all elements) оставил в цикле Test, а процедуру tKvant(kvants of all elements) поставил в обработчик стандартного таймера Timer, который вызывается 18 раз в секунду. Производительность повысилась. 190.Изменил метод Motion для объекта TSolder.При поиске пути к цели если оба пути (lcounter, rcounter) исчерпали свой лимит на позиции координат, то возвращается stepnum=0 (а раньше stepnum=9) и юнит будучи в замкнутом пространстве не зацикливается (а зацикливался из-за того что данные брались из неопределённой позиции в таблице поиска и вектор был неопределён и юнит вращался на месте не давая себя переключить в другой режим). 191.Добавил объект TCrow. 192.Дабавил выделение для объектов TCrow, TBuild при клике мышкой или захватом в прямоугольник. Добавил выделение здания гаснущим цветом. Добавил атаку объектов TSolder, TBuild(башня) на червя и определение его как врага если юнит в режиме Patrol и юнит(здание-башня) не Атредис. 193.Попытался исправить - раньше при переходе в полноэкранный режим был чёрный экран, а теперь нормально. 194.Сделал два режима атаки с преследованием(amFollow) и держать позицию (amStay). При режиме используется режим атаки amStay. 195.Добавил несколько картинок для рисования червя когда он съедает какой-нибудь юнит. Получается более плавно. 196.Добавил объект TGlau и настроил атаки и клики для него и если юнит проезжает по месторождению глаукеви, то происходит выброс спайса, а юнит погибает. 197.DblClick.Добавил выделение всех юнитов одного ранга на экране по двойному клику. 198.Добавил рисование иконки прицела на кнопке на панели управления. 199.Сделал рисование червя как поднятого песка(методом масштабирования) из 16х16 до 24х24 и с прозрачными углами чтобы создавалось впечатление округлости горбика песка. 200.Убрал из утилиты dobjects.pas все ненужные переменные. 201.Добавил несколько взрывов для разного размера зданий. Сделал рисования квадрата выделения юнита под юнитом, а не на юните. Исправил метод ToClear, а то раньше выполнялся даже когда элеватор уничтожен. 202.Добавил режимы скорости юнитов для разных скоростей игры. 203.Добавил разновидность пауз между выстрелами в зависимости от скорости игры. 204.Исправил процедуру FoundEmptyPlaceNearElevator и теперь харвестер действительно подъезжает к элеватору по кротчайшему пути. 205.Добавил рисование кратеров(объект TCrater) от взрывов юнитов и зданий. 206.Добавил рисование тени и очистку тени от юнитов игрока. Сделал отключение тени по переменной DEBUG=ON. 207.Добавил очистку тени от вражеских юнитов, если они стреляют по юнитам игрока. Изменил иконки для Ордос-Трайка, Девиатора(маленькие и большие). 208.Добавил рисование тени на миникарте. Добавил очистку тени от зданий игрока. Добавил очистку тени от вражеских зданий, если они стреляют по юнитам игрока. 209.Добавил процедуру создания поля спайса на карте PrepareShadowField. 210.Исправил процедуру PlayerKvant чтобы когда юнит игрока выбран и курсор в режиме выбора места для движения или атаки и когда этот юнит уничтожается чтобы курсор выводился из этого режима в нормальный режим (ms_control:=mcNormal; Ms_Setcolor(ms_green); ). 211.Изменил процедуру DrawElevator так чтобы когда Харвестер на разгрузке то Харвестер рисуется цветом своего дома, а не цветом дома Элеватора. Исправил метод TCrow.Draw(DrawEat) чтобы квант съедания юнита выполнялся даже когда червь за пределами экрана. 212.Добавил метод TBuild.PalaceShut(mx,my:integer); для вызова Фрименов. Исправил метод TCrow.Draw чтобы квант съедания юнита выполнялся даже когда червь за пределами экрана. Исправил метод TSolder.Draw (для rgHarvester) ,когда Харвестер полон на 100% и нет ни одного Элеватора, чтобы он не рисовался как собирающий спайс. Исправил метод TBuild.DecLife (для acEmpire,acAther кроме acPlayer) чтобы при уничтожении последнего Элеватора или Силоса часть денег осталась. 213.Добавил процедуры MidiPlay(fname:string); WavePlay(volume,snd:integer); Добавил утилиту озвучивания Dsnd.pas и собрал файл звуковых эффектов dune.snd(dune.dxw). 214.Добавил еще озвучивание некоторых объектов и реакцию по клику на юните и группе юнитов, и реакцию на команду для юнита и группы юнитов. Исправил ошибку когда харвестер возвращается и элеватор занят, то он еще раз вызывает процедуру ToBackAgain метода TSolder.TheBack и направляется к свободному элеватору. 215.Исправил метод TSolder.TheHarvest чтобы когда Харвестер разгрузился и собирается на поле спайса и там место занято, то он ищет в радиусе 10 позиций не от себя(как это было раньше), а от того места где он последний раз собирал спайс. Исправил процедуру DrawMiniMap чтобы цвет Фрименов рисовало корректно(синим). Добавил вызов Саботера. Исправил метод TSolder.ToAttackStay чтобы если обнаружено вражеское здание а над ним завис дружественный Авиатранспорт, то чтобы на атаку цель выбиралась корректно(а то раньше мочили своего). Озвучил выстрелы зданий. 216.Добавил для Дворца выстрел ракетой. Добавил озвучивание "Наш объект ожидает", "Наш объект стартовал" и "Наш харвестер ожидает". Увеличил скорость полета ракеты для зданий(RTurret). Подкорректировал нанесение повреждений ракетой запущенной Дворцом по зданию. 217.Добавил методы ToHarvHelp,TheHarvHelp,TheHarvHelpBack(объекта TEnemy), которые обеспечивают помощь если ни одного Харвестера не осталось. 218.Добавил метод TEnemy.ToHarv который отслеживает простаивающие Харвестеры и посылает их на сбор спайса(только для альянсов компьютера alliance<>acPlayer). 219. 220.Вызывает MainMenu по клику кнопки MENU на панели информации. Рисует MainMenu и выделяет кнопки при наведении на них курсора мыши и озвучивает. 221.Вызывает QuitMenu по клику кнопки 'Выход' в MainMenu. Рисует QuitMenu и выделяет кнопки при наведении на них курсора мыши и озвучивает. Убрал с MainForm объекты DXImageList,DXImageList1. 222.Вызывает MissMenu по клику кнопки 'Задание' в MainMenu. Рисует MissMenu и выделяет кнопки при наведении на них курсора мыши и озвучивает. 223.Вызывает HelpMenu по клику кнопки 'Помощь' в MainMenu. Рисует скроллинг через объект LBox(TDListBox) и выделяет кнопки при наведении на них курсора мыши и озвучивает. 224.Рисует HelpMenu(рисуя шаблон 'bigmenu.img') и кнопку 'Назад' и реагирует на клик по ней. Рисует текст в окне скроллинга и обрабатывает нажатие клавиш Up, Down, PgUp, PgDown, Home, End. 225.Вызывает SaveMenu по клику кнопки 'Сохранить игру' в MainMenu. Рисует скроллинг через объект LBox(TDListBox) и выделяет кнопки при наведении на них курсора мыши и озвучивает. Рисует SaveMenu(рисуя шаблон 'bigmenu.img') и кнопку 'Отмена' и реагирует на клик по ней. Рисует объект DEdit(TDEditBox) и этот объект редактирует строку. 226.Вызывает LoadMenu по клику кнопки 'Сохранить игру' в MainMenu. Рисует скроллинг через объект LBox(TDListBox) и выделяет кнопки при наведении на них курсора мыши и озвучивает. Рисует LoadMenu(рисуя шаблон 'bigmenu.img') и кнопку 'Отмена' и реагирует на клик по ней. Добавил коррекцию скорости скроллинга игрового экрана (variebles scrolltime,scrollpause). Исправил процедуру выброса спайса(PutHarvSpice,CreateSpice) при взрыве Харвестера, теперь выбрасывается столько спайса сколько было в Харвестере. Изменил тип переменных MusicEnable,SoundEnable с (on/off) на boolean (true/false). 227.Вызывает и рисует OptionsMenu по клику кнопки 'Настройки' и рисует и обрабатывает клики на объектах DChaks[..] (array [..] of TDChackBox), DTrackBar[..] (array [..] of TDTrackBar). Перенес переменные SoundEnable,MusicEnable,Scrollpause, SoundVolume в список INI. 228.Впихнул в OptionsMenu все настройки. Изменил процедуру GetGoodNewCoord чтобы группа юнитов при перемещении на новое место не выстраивалась в вертикальную линию, а занимала места как можно ближе к месту назначения. 229.Создал утилиту DMenus.pas и перенес в нее все процедуры для менюшек (OptionsMenu,LoadMenu,SaveMenu,HelpMenu,MissMenu, QuitMenu,MainMenu). Исправил объект TDEditBox.KeyPress, раньше при вводе символа в середину строки последние символы исчезали, теперь нормально. 230.Перенес в утилиту DMenus.pas все процедуры для (Azavod,Lzavod,Akademy,Kazarma,Tzavod,KDvor). 231.Добавил в прорисовку OptionsMenu надписи для скроллинга 'низк' и 'высок'. 232.Теперь Клиент и Сервер могут отправлять друг другу сообщения. 238. 233..238 - Добавил пересылку запросов(от клиента к серверу) для действий ToMove, ToAttack, ToPatrol, ToHarvest, ToLoad, ToUnLoad, команд(от сервера к клиенту) для этих же действий. Вызывает NetMenu('Сервер', 'Ник', 'Работать сервером', 'Русский чат'). Исправил процедуры ServerComDecoding, ClientComDecoding чтобы при посылке сообщения воспринимало пробелы не как разделители а как пробелы. Реализовал возможность сетевого чата на русском языке. 239.Анимировал IntroMenu. 240.Добавил кнопки в IntroMenu и заглавие игры. Добавил в LoadMenu, SaveMenu вызов процедуры FoundSaveFiles. 241.Добавил распознавание нескольких команд в одной посылке. Добавил сетевые команды ToGlouBlowUp, ToKillPehota, ToUnitInit, ToSpiceCreate. 242.Увеличил возможный максимальный размер карты с 64х64 до 256х256, при этом стала наблюдаться сильная заторможенность программы в режиме игрового окна, тогда оптимизировал процедуру DrawMiniMap(рисование рельефа и тени), раньше для каждой позиции карты и тени проводились просчеты масштаба, теперь прощитывается только MiniMapSizeX x MiniMapSizeY (64x40) позиций в карте и тени(независимо от размера карты). Увеличил длину прокладываемого маршрута от 100 позиций до Map.Intx(Map.IntY) что позволяет юнитам двигаться даже по большой карте (а раньше отказывались двигаться далее чем на 100 позиций). 243.Исправил процедуру FindFile(resurse:word; ...) чтобы правильно происходил поиск файла во всех ресурсных файлах ((было предусмотрено но были ошибки) стало возможным использование более одного ресурсного файла). Исправил объекты TTimer1, TTimer2 чтобы они работали от и тогда они всегда будут мигать. 245.244,245 - Начал преобразовывать в более-менее синхронизированный сетевой вариант с регулярной рассылкой ключевых визуальных и функциональных параметров объектов. Теперь всё выполняется только на сервере, а клиенты визуализируют объекты и шлют на сервер запросы на обработку событий вызванных игроком на клиенте. 246.Добавил рассылку сервером команд на выстрел клиентам, чтобы выстрел рисовался. Добавил в декодер команд клиента образование следов от транспорта при движении. 250.247..250 - Создал объект TDColorBox для выбора цвета для игру по сети. Добавил HostMenu с выбором карты и использованием объекта TDColorBox. 252.251,252 - Испробовал вариант с групповой игрой в три игрока - это прикольно. 254.253,254 - Добавил выбор цвета для клиента уже после того как клиент законнектится с сервером и тот перешлёт клиенту список свободных(ещё не выбранных цветов). 255.Убрал из всех сетевых команд фрагмент ini.playername и оставил только в команде для посылки сообщения по чату. Это должно сократить возможный объём трафика, индентификация сервером пославшего сообщение проводиться по номеру альянса пославшего клиента, так как цвета, альянсы и номера коннектных линий содержаться в таблице Partner[..] сервера. 256.Добавил команду ncGroupToPatrol в которой указывается кол-во юнитов и номера этих юнитов. Добавил команду ncToDestroy. Добавил команду ncBuildShut Добавил команду ncBuildDecLife. 257.Добавил команду ncToRepair. 258.Добавил команду ncToBuilding. 259.Создаёт юниты сервер-игрок и клиент-игрок. Исправил посылку чат-сообщений, теперь для этого используется процедура PutChat, а для отправки игровых сообщений используется процедура PutMessageToNet. 261.260,261 - Добавил команды ncBuildInit, ncToPutKDvor, ncToCreateBuild, ncTheCreateBuild, ncEnemyUpDate. 262.Добавил команду ncToPalaceShut, подкорректировал метод TBuild.ToClear чтобы корректно ставило все альянсы в равные условия при сетевой игре. Подкорректировал метод TBuild.PalaceShut, чтобы при сетевой игре при любом значении House Дворец работал как в обычной игре при House=hoHarkonen или House=hoSardukar. Исправил процедуру PrepareRunNetProg, чтобы не портила значение Player.House, выбранное игроком в HostMenu(for Server). Вместо команды ncCanselMake добавил команды ncToCanselMake, ncTheCanselMake которые обеспечивают нормальную остановку и продолжение производства на заводе. Исправил процедуру HostMenuMClick(For Server), когда игроком выбирался цвет для House, то он заносился в Partners[1].House, но не заносился в Player.House, теперь нормально. 263.Исправил метод TBuild.ToClear чтобы при сетевой игре каждый игрок был в равных правах и их харвестеры не могли разгружаться, если Элеваторы и Силосы переполнены, и при уничтожении Элеватора или Силоса терялась бы соответствующая сумма спайса(денег). Озвучил завершение создания юнита, здания, установку здания, начало разгрузки Харвестера для Клиента. Добавил команду ncEnergyUpDate. 264.Добавил в NetMenu объект TDTrackBar для INI.Partners и объект TDChackBox для INI.CrowEnable. Исправил TDEditBox.MClick так чтобы в МЕНЮ два таких объекта могли работать корректно(если кликнуть на одном из них, то будет активен соответствующий). 265.Добавил команду ncToHarvBack. ---------------- Обнаружил: ---------------- 1) когда заканчивается спайс на поле где проводился сбор то объект почему-то не отправляет Харвестеры на новое поле; 2) когда игрок дает команду АТАКА Девиатору, то Девиатор переключившись в режим АТАКА делает один выстрел и почему-то переключается в режим ОХРАНА. Исправил метод TEnemy.ToHarv чтобы при исчерпании спайса на одном поле Харвестер отправлялся на новое поле ('...command=cmHarvest...' заменил на '...command=cmFree...'). 266.Удалил метод TEnemy.ToHarv а вместо него подкорректировал метод TBuild.TheClear чтобы при одиночной игре вражеские Харвестеры отправлялись к новому полю спайса если старое поле исчерпано, а при сетевой игре чтобы ВСЕ Харвестеры отправлялись только на старое поле, т.е. это уже личное дело каждого сетевого игрока, так как если Харвестер попрётся на вражеское поле спайса, то может получить по шее, а игрок и знать не будет пока не получит соответствующее извещение о гибели Юнита. 267.Добавил команды ncCrowToEat,ncCrowUnEat,ncCrowUpDate,ncCrowDeclife чтобы у клиента Червь корректно рисовался. 268.Добавил ncCrowsEnable, ncCrowsDisable, ncCrowCreate. 269.Попытался перевести сетевую игру к более реальному началу, т.е. выделение каждому игроку по ПСД и 1000 денег. Обнаружил ошибки 1) когда Клиент начинает строить Элеватор то деньги отнимаются, но тут же поднимаются обратно 2) когда вылетает вражеский(Серверный) носитель чтобы принести новый Харвестер, то на карте Клиента в углу появляется участок чистый от тени 270.Исправил ошибку 2), теперь если создается Харвестер для переноса на Элеватор, то фраза "Наш объект ожидает" не произносится (на Клиенте). При окончании разгрузки Харвестера(на Клиенте) теперь произносится фраза "Наш Харвестер ожидает" так же как и на Сервере. Исправил ошибку 1). 271.Проверил работу переведённой игры(смотри пункт 269) при 3-х игроках. Исправил когда носитель приносил новый Харвестер на Элеватор и при Этом спайс уже не помещался в хранилищах, то носитель зависал над Элеватором и ждал, а теперь он в любом случае выгружает Харвестер на разгрузку. Исправил когда носитель несёт новый Харвестер, то Элеватор не мигал огнями, а теперь мигает. Исправил когда у Сервера вызывалась процедура PrepareRunNetProg, то Partner[1].House уже был установлен но затерался процедурой PrepareRunNetProg , а теперь она перенесена в HostMenu и вызывается перед занесением значения в Partner[1].House(For Server). Исправил когда завершается модернизация противника, то на Сервере выводилось сообщение "Доделка завершена", и у Клиентов это сообщение не выводилось, теперь у Сервера выводится это сообщение только если это его касается, а у клиентов выводится это сообщение когда их это касается и в виде "Модернизация завершена", Обнаружена ошибка: 1) когда у Клиента (только у альянса 2) уже построен Элеватор и Харвестер возвращается с поля не пустой, то показания денег у Клиента на экране скачут как будь-то уже Харвестер разгрузился и назад до суммы как и было, затем после разгрузки сумма уже соответственно больше и скачет постоянно. 273.Исправил метод TEnemy.TheHarvHelpBack чтобы он вызывал процедуру оглашения инициализации Юнита номер 0 для клиентов, а то после обслуживания последнего клиента носитель оставался видимым у клиента, но к конфликтам это не приводило. Добавил запись(по клавишам Ctrl + [ 0..9 ]) и вызов групп юнитов (по клавишам 0..9). 274.Анимировал курсоры(стрелка, прицел, объект), теперь совсем другое дело. 275.Замедлил ремонт зданий, а то очень быстро ремонтировались. Изменил процентные ставки на нанесение повреждений объектам от ракеты Дворца. Исправил метод TSolder.Demaging чтобы при выстреле по Глаукеви все клиенты оповещались что Glau.Init. Добавил TEnemy.VerifyLose чтобы было видно другим игрокам что какой-то игрок побеждён. 276.Попытался перейти к реальному определению MaxUnit и MaxBuild относительно кол-ва альянсов в ini.partners и оповещение всех клиентов об этом. Исправил мерцание отображения денег 1), а то показывало деньги клиента 2 то деньги сервера, теперь нормально. 277.Добавил процедуру PutDescend чтобы выделять каждому игроку регион для дисантирования. Исправил оповещение всех игроков о уничтожении игрока используя параметр partner[enemy.alliance].house, хотя сам факт значения параметра enemy.house=hoColor0 у клиентов не исправлен. Перенёс установку параметра IsConnect=true из обработки команды ncSetMapName в обработку команды ncSetPlayerWindow (на клиенте). Исправил когда вражеский Харвестер заходит на разгрузку на Элеватор находящийся в тени, то выдавался звук захода на разгрузку, а теперь нормально. Исправил когда игрок на вражеский юнит наводил курсор мышки, то курсор менялся на красный, теперь нормально. 278.Начал составлять файл Dune.hlp. Исправил когда игрок на вражеское здание наводил курсор мышки, то курсор менялся на красный, теперь нормально. Тоже самое исправлено в отношении червя.(исправил функцию Spy). Исправил функцию AllSpy чтобы при захвате в квадрат юниты которые находятся в тени не захватывались. Исправил параметр vwintx=320(было 256), чтобы прорисовка червя проводилась полностью до правого края экрана. 279.Добавил в процедуру TForm1.Timer1Timer(Event OnTimer) фрагмент pmKDvor,pmKazarma,pmAkademy,pmLzavod,pmAzavod, pmTzavod:if GameMode=gmNetServerGame then if IsConnect then inc(readtimer); чтобы сетевая игра не останавливалась пока игрок на сервере в меню завода. Доработал метод TSolder.Commander до эквивалента метода TSolder.Kvant(аналогично доработал метод TBuild.Commander до TBuild.Kvant), чтобы уменьшить затраты производительности на квантирование объектов. Перебросил все неиспользуемые и пробные процедуры из Dvga.pas в файл Dgarbage.txt. Добавил в процедуру PlayerLoadGroup фрагмент player.otype:=otUnit; чтобы когда выбрано здание при вызове записанной группы юнитов вызов происходил корректно, а не вызывалось что-то случайное и случайного типа(otUnit,otBuild,otGlau,otCrow). 280.Добавил параметр AutoBuild для объекта TBuild. Добавил прорисовку ChackBox для AutoBuild и денег в меню заводов. Исправил метод TEnemy.ToHarvHelp,TEnemy, TheHarvHelp, чтобы когда Носитель несёт Харвестер на Элеватор, Носитель рисовался с грузом на борту. 281.Исправил процедуру CenteredWindowOfObject чтобы правильно центрировало игровой экран если выбрано здание или червь. Добавил мерцание белого цвета Ms_Whites для червя и выделения зданий. Исправил тип Word параметра P(TBuild.TheRepair) на тип Real, чтобы при очень больших ценах зданий не было нулевого приращения ремонта. Добавил процедуру SndRadarOn(house:THouse). 282.Добавил курсор аля StarCraft. Добавил константу MaxSpiceMelange=1500(было 1000). Добавил SndCrowWarning когда червь берёт юнит на преследование, и SndRadarTheOn когда радар устанавливается на местность. Исправил метод TEnemy.TheHarvHelp фрагментом solder[0].loadcount:=0; чтобы носитель рисовался с грузом а потом без груза когда возвращается solder[HarvHelpNum].Init; чтобы созданный Харвестер уничтожался когда Элеватор уже уничтожен и выгружать его некуда. 283.Добавил команды ncZeroSolderLoad, ncZeroSolderUnLoad когда оказывается помощь при утере Харвестера чтобы клиент правильно рисовал загруженный и разгруженный нулевой Носитель(solder[0]). Добавил команду ncCrowWarning чтобы у клиента произносилось звуковое предупреждение что червь погнался за юнитом этого игрока. Добавил вызов метода TSolder.Select для выделенного юнита при высадке десанта для сетевых игроков. Добавил TDChackBox в OptionsMenu для переключения типа курсор-стрелка. Добавил процедуру VerifyRegionForDescend чтобы десант не высадить прямо на месторождение Глаукеви, а то сразу игроку каюк будет. 284.Добавил EditMenu. 286.285,286 - Добавил CreateMapMenu,LoadMapMenu,SaveMapMenu. 287.Добавил процедуру ClearОldCrater чтобы при создании нового кратера старый кратер удалялся, и процедуру ClearCraterUnderBuild чтобы при установке здания где есть кратеры, эти кратеры удалялись из списка, ведь они всё равно не рисуются под зданием. 290.288..290 - Добавил в EditGame объект TDPageList, чтобы выбирать рельеф и редактировать карту, можно загружать, сохранять карту. Убрал с EditTKvant, TKvant, NetTKvant цикл spice[i].kvant и исправил методы TSpice.Init, TSpice.Create ..NearSpiceKvant.. чтобы при создании и исчерпании спайса, его близлежащие участки спайса изменили свою форму, а то при квантировании каждый 9-й раз все MaxSpice спайса проверяли по MaxSpice спайса соседей что не правильно, вроде бы достаточно только близлежащие проверять, а остальные трогать незачем. 294.291..294 - Исправил метод TSolder.Moving чтобы авиа-объекты не попадали в западню Глаукеви. Добавил процедуру ClearMapObjects в SaveMapMenu, LoadMapMenu. Исправил процедуру Scroll чтобы скроллинг работал только при IsConnect=true(Сетевая игра). Убрал вызов процедуры DrawSelection из процедуры EditDKvant чтобы при удерживании левой кнопки мыши нажатой не рисовался прямоугольник выделения для захвата юнитов. Добавил в EditGameMMove,GameMMove вызов процедуры MiniMapScroll чтобы происходило перемещение по карте при движении курсора мыши по Миникарте и удерживании левой кнопки мыши нажатой. 295.Исправил процедуру LoadEditMap добавив фрагмент map.intx:=intx, map.inty:=inty, а то раньше при загрузке карты размеры карты при отображении оставались прежними. Исправил процедуру EditMenuClick добавив фрагмент player.vmapx:=1; player.vmapy:=1; а то при загрузке меньшей карты после большей при первом отображении экрана возникала ошибка так как координаты экрана оказывались за пределами карты. 297.Добавил методы TEnemy.ToNosHarv, TEnemy.TheNosHarv чтобы когда Харвестер отправляют собирать спайс там куда сам Харвестер добраться не сможет, тогда вызывается на помощь свободный Носитель и переносит Харвестер прямо на место сборки спайса. А метод TEnemy.Harvesting(для alliance<>acPlayer) отыскивает все бездельничающие Харвестеры(в том числе и те которые были только что выгружены Носителем для работы) и включает режим сборки ближайшего спайса. 300.Добавил TEnemy.ToNosHarvBack чтобы Носитель забирал Харвестер когда тот сам не может вернуться на разгрузку. Обнаружены ошибки: 1) когда ближайшее поле спайса находится в недоступном месте и нет Носителей или воздушные перевозки не доступны, то альянс зацикливается на этом поле и Харвестеры никуда не ездят, хотя сам процесс не виснет, попытки прогнозирования маршрута очень затратны и заметно подтормаживают прогу, пока от прогнозирования маршрута отказался, а чтобы таких случаи не возникали просто не рисовать карты с замкнутыми участками гор; 2) Червь тоже страдает от недоступности цели, когда юнит на песке, но этот участок песка окружён землёй; Исправил в процедуру Attain в методе TCrow.Stoping добавил фрагмент var astage,astepnum:integer; astage:=stage; astepnum:=stepnum; stage:=16; stepnum:=0; motion; stage:=astage; stepnum:=astepnum; так как вызов метода TCrow.Motion изменял значение stage=15(<16) и в методе TCrow.Kvant не вызывалась процедура Attacking и Червь стоял на месте и ни за кем не гнался, к тому же из-за значения stage<16 метод TCrow.Motion сразу делал Exit; и по сути после сканирования первого подходящего юнита на съедение маршрут просто не проверялся а значение Stepnum оставалось прежним. 301.Добавил процедуру VPut_sprite16x16crater чтобы Кратеры рисовало так чтобы они не появлялись слева на экране когда кратер попадает за правый край экрана, а то кратеры могут позиционироваться в любой точке квадрата 16 на 16 и съезжать с сетки квадратов, теперь нормально. Увеличил радиус обзора Радара при установке Радара(очищается от тени). 302.Добавил метод TEnemy.BuildThing чтобы сам альянс мог строить нужные юниты. Исправил процедуру GetThingOfRang, а то там в самом начале входной параметр Rang устанавливался равным Rang:=rgSolder и как будь-то все входные параметры всегда равны Rang=rgSolder, а ведь должны быть такие какие указаны в вызове этой процедуры (rgSolder..rgArnifighter), теперь нормально. 303.Исправил метод TSolder.Explose чтобы когда Носитель уничтожен то и те юниты, которые в этот момент были на его борту тоже вызвали свои методы TSolder.Init . Исправил методы TSolder.TurnMind и TSolder.Kvant так чтобы Носитель и Арнифайтер не заражались газом. Добавил методы TEnemy.PrepareAttackList, TEnemy.PrepareGuardList для подготовки таблиц возможных юнитов для формирования отряда Охранения, Резервного отряда, Штурмового отряда. Добавил методы TEnemy.RefreshGuards, TEnemy.RefreshReserv, TEnemy.RefreshArmy для пополнения(строительства) отрядов. Добавил методы TEnemy.AddUnit, TEnemy.DeleteUnit чтобы при создании и гибели юниты сообщали своему альянсу(компьютеру) что они готовы к выполнению боевой задачи или что они уже не в состоянии её выполнять. И соответственно исправил методы TSolder.Create, TSolder.Explose, TSolder.TurnMind, TSolder.Kvant так чтобы из них вызывались методы TEnemy.AddUnit, TEnemy.DeleteUnit . Исправил методы TEnemy.ToNosHarv, TEnemy.NosHarvToBack чтобы у игрока не производились самопроизвольно Носители когда Носителей не хватает для уборки спайса. 304.Исправил метод TSolder.ToLoad, вместо вызова функции GetNumObject поставил вызов новой функции GetNumUnitWithOutFly чтобы Носитель при определении номера и типа объекта(юнита) не мог брать себя как загружаемого если этот Носитель уже висит над целью. Вроде бы настроил систему отправки Харвестеров альянса компьютера с помощью Носителей, а так же для игрока но так чтобы Харвестеры не выходили из подчинения игрока. 305.Исправил методы TEnemy.TheNosHarv, TEnemy.TheNosHarvUnLoad, TEnemy.TheNosHarvBack, TEnemy.TheNosHarvToBack чтобы данная операция деактивировалась когда Носитель или Харвестер, участвующие в данной операции, уничтожены. А то при уничтожении операция всё равно считалась активной хотя Харвестер ждал сбитого Носителя, а другой Носитель не прилетал так как эта операция активна, или наоборот Носитель прилетал на место гибели Харвестера и просто ждал, а не занимался другим Харвестером. Исправил метод TSpice.Kvant чтобы плавно рисовало углы Спайса, был замечен частный случай и причина устранена, добавил ещё пару изображений для спайса чтобы плавнее рисовало. Добавил в метод TEnemy.Kvant вызов под процедуры FreshArmys чтобы происходило обновление армии компьютера. Исправил процедуру PositionsFor5x5 так как обычно она вызывается так PositionsFor5x5(mapx-2,mapy-2,... то при Mapx=1;Mapy=1; может произойти ошибка, добавил строки ... if mapx<1 then mapx:=1; if mapy<1 then mapy:=1; ... Исправил метод TSolder.Stoping в отношении вызова под процедуры OnGlaukevy а то она не была исправлена для сетевого режима как это было сделано с методом TSolder.Moving и к тому же при остановке авиа юнит над Глаукеви объект пропадал и происходил выброс спайса, как будь-то это наземный Юнит наехал на него. 306.Добавил методы TEnemy.ToSearchGlau, TEnemy.TheSearchGlau чтобы альянс компьютера посылал один юнит из группы Охраны выстрелить в ближайшее месторождение Глаукеви, когда больше нет нигде полей спайса, 307.Добавил метод TEnemy.SetPlaza и в метод TEnemy.AddUnit добавил вызов под процедуры ToPlaza чтобы при создании нового юнита этот юнит отсылался на плац где строятся все войска компьютера(CPU). 308.Добавил методы TEnemy.ToBGuarding, TEnemy.TheBGuarding чтобы альянс компьютера мог обороняться. Обнаружена ошибка 1) при вызове метода TSolder.ToAttack если координаты попадают на свой юнит, то атакует своего(это годится для юнитов игрока, но если компьютер посылает оборонять базу и атакует свой авиа юнит, то это плохо, для альянса компьютера(CPU) конечно). 309.Добавил в метод TEnemy.AttackWarning проверку какой юнит подвергся нападению со стороны противника(для альянса CPU), если Харвестер то он давит противника если его атаковала пехота, если атакован Носитель то он отправляется к Плацу. Добавил методы TEnemy.ToURetornToBase, TEnemy.ToBReturnToBase вместо TEnemy.ToReturnToBase чтобы нападения на здания и юниты обрабатывались раздельно. Добавил метод TSolder.ToAttackEnemy чтобы при обороне базы юниты альянса CPU случайно не замочили свои объекты. Исправил процедуру DrawObjectInfo чтобы при клике по Носителю CPU не выводилась информация о юнитах на его борту(для gmSingleGame). Исправил процедуры DKvant, NetDKvant чтобы трупы пехоты for ... do if Explos[i].rangrgTrupers then Explose[i].Draw рисовало перед прорисовкой юнитов. Исправил процедуру NetMenuMClick чтобы происходила установка переменной MaxUnit:=INI.MaxUnitForAlliances*INI.Partners . 310.Переделал метод-процедуру TEnemy.ToBGuarding в метод-функцию, чтобы было видно был ли хоть кто ни будь послан на оборону базы. Изменил метод TEnemy.AttackWarning так чтобы если некого послать на оборону базы, но напавшие - пехотинцы, то посылается первый попавшийся Харвестер, независимо занят он или нет, так как только он расправится с пехотой его перехватит служба TEnemy.Harvesting и он опять двинется заниматься своими прямыми обязанностями. Исправил метод TSolder.Moving чтобы пехота давилась и тогда когда танк(любая тяжёлая техника) остановилась, а не только когда едет. Двигается юнит при Stage<16 а стоит при Stage=16. Исправил метод TEnemy.TheBGuarding так чтобы охрана не преследовала врага далеко от плаца. 311.Исправил метод TSolder.Draw чтобы проверка видимости плит и башен проводилась перед прорисовкой а не в процессе прорисовки, и чтобы рисовались через VPut_page16x16 а не VPut_block16x16. 312.При исследовании метода TSolder.Kvant на скорость оказалось что львиную долю производительности потребляет вызов метода TSolder.Stoping, метод TSolder.Kvant вызывается 18 раз в сек, а значит и метод TSolder.Stoping тоже вызывается так же часто, пришлось таймировать 1 раз в секунду поиск врага вокруг юнита по вызову под процедуры Alert. 313.Добавил методы TEnemy.ToUGuarding, TEnemy.TheUGuarding чтобы при нападении на Харвестер не пехоты вызывался патруль из резерва и преследовал напавшего. 314.Исправил при переходе из полноэкранного режима в оконный параметр BorderStyle=bsSingle(как и при инициализации, а раньше было bsSizeble). Исправил метод TEnemy.ToBGuarding так чтобы координаты возврата на плац изменялись только для юнитов, задействованных в первые, к тому же задействованными отмечаются только те юниты, которые переключились в режим атаки, так как зачем метить юниты которые не могут атаковать данную цель и не отреагировали на вызов их метода TSolder.ToAttackEnemy. Исправил метод TEnemy.ToGuardReturnToBase так чтобы возвращались только задействованные юниты а не все подряд, а то незадействованный юнит имеет неопределённые(случайные) координаты возврата на плац и при вызове этого метода юниты двигались к случайной позиции что ошибочно. 316.Убрал авто пополнение групп Attack и Guard, а вместо этого когда нужно обороняться в группу Guard проводится набор из группы Reserv. При обороне проводится проверка жив ли хоть один юнит из группы Guard, и если все погибли то проводится новый набор из группы Reserv. Когда необходимость в группе Guard отпадает, то все юниты из неё перебрасываются в группу Reserv и возвращаются на плац. 317.Добавил в метод TEnemy.BaseAttackWarning вызов метода TBuild.ToRapair для своих юнитов, чтобы пострадавшие здания ремонтировались когда происходит нападение на базу. Ремонт производится в любом случаи независимо от того послан гарнизон на оборону или нет. 319.318,319 Добавил методы TEnemy.ToAttacking, TEnemy.TheAttacking, TEnemy.UnitFromARota, TEnemy.ToAttackingEnemy, TEnemy.ToFoundTarget, TEnemy.KillSTarget, FoundTarget чтобы обеспечить более-менее приличное нападение на базу игрока, выбирается главная цель(здание) и становиться текущей целью для атакующей группы, если по ходу продвижения к текущей цели атакующая группа встречает сопротивление, то текущей целью становится обороняющий юнит противника, когда он уничтожен главная цель вновь становиться текущей, но если главная цель уничтожена, то производится поиск новой главной цели(здания) и всё повторяется вновь. Исправил метод TSolder.ToAttackEnemy чтобы когда здание принимается на цель юнитом, то точка в которую будет производится выстрел определялась по вызову метода TBuild.GetPoint, а то при вызове метода TSolder.ToAttackEnemy точка цели указывается равной главным координатам здания(mapx,mapy), но точка подхода к зданию определяется по вызову метода TBuild.GetPoint и при подходе с права от здания получалось что юнит уже подошёл к зданию на расстояние выстрела, а при вызове метода TSolder.Shuting в нём выясняется что юнит стоит на одну позицию дальше от здания и выстрел не производится. Исправил метод TSolder.Shuting так чтобы пауза между выстрелами была случайно на 1 или на 0 тактов таймера больше, а то все как сговорились стреляют как один(юниты одного ранга). Исправил процедуру KDvorMove так чтобы когда на кнопки (вверх/вниз) наводился курсор мыши происходило не только выделение соответствующей кнопки, но и проводилась проверка нажата ли левая кнопка, и если нажата то проводился скроллинг, а то замахаешся кликать пока доберешься до дальних зданий(силос, радар, ...). 321.320,321 Перенёс регулярный вызов процедуры Runprog из метода TMainForm.TimerTimer в метод TMainForm.DXTimerTimer, при этом скорость обновлений экрана возросла с 18 fps до 24 fps (full screen 37 fps), при этом стала возникать ошибка при квантировании зданий для здания с numobject=0 что само по себе не возможно так как массив зданий начинается с индекса 1, пришлось в метод TBuild.Kvant поставить заплату begin if numobject=0 then exit; . . Ещё стала возникать ошибка acPlayer=0 при квантировании альянсов, пришлось в главную область begin .. end. утилиты Dvga.pas поставить начальную инициализацию acPlayer:=1; Наблюдавшееся ранее замедление, при напрвлнении группы юнитов(своих или чужих) на атаку, осталось не исправленным. 323.322,323 Исправил скроллинг для меню KDvorMenu, TzavodMenu. Перевёл объекты TSmoke, TBSmoke, TShut, TBShut, TExplose на зависимость от MainTimer, а не от ReadTimer. Исправил управление скорости игры INI.GameSpeed так чтобы изменялась скорость таймера ReadTimer а не переопределялись размеры интервалов. 326.324..326 Исправил метод TEnemy.Harvesting так чтобы если осталось менее 2-х харвестеров то производился еще один харвестер. Исправил метод TCrater.CreateAny чтобы к координатам на карте добавлялось по единице и тогда правильно происходит определение где будет находиться создаваемый кратер, на земле или на песке. Исправил метод TBuild.TheRepair, а то я забыл убрать EXIT; поставленный там ранее при отладке. Исправил метод TEnemy.TheBGuarding так чтобы если противник (игрок) напал а потом отошёл то группа обороны не преследовала его далее чем на треть карты от плаца(раньше было 30 позиций). Исправил метод TBuild.ThePatrol так чтобы башни проводили поиск врага раз в секунду а не каждый вызов метода TBuild.Kvant(TBuild.ThePatrol) (18 раз в сек) при этом возросло число кадров с 24 до 26..28 fps (full screen 37..41 fps). 328.327,328 Исправил процедуру DrawObjectInfo так чтобы при одиночной игре Фримены и Сардукары (пехота) не назывались "пехота" или "гвардия", а назывались Фримен(ы) или Сардукар(ы). 329.Исправил процедуру DrawObjectControl так чтобы управление Дворцом соответствовало династии, т.е. для Атреидесов иконка фрименов и надпись "ФРИМЕН", а для Ордосов иконка саботажника и надпись "САБОТАЖНИК". 331.330,331 Исправил метод TSolder.Moving так чтобы процедуры OnGlaukevy, KillPehota вызывались только когда юнит переходит с позиции на позицию окончательно, а не 16 раз (за 16 стадий stage). Но это не дало ощутимого ускорения и при атаке противника числом 20 юнитов всё равно приблизительно 7 fps (раньше 5 fps). Исправил константу AddMelange чтобы спайс собирался в двое медленнее, а то раньше он собирался в четверо быстрее чем в Дюне II. Добавил звук для клика по Energy. 332.Добавил ещё две картинки для рисования земли на карте(Earthes.dat). 333.Добавил в объект TSpice определение если спайс со всех сторон окружён спайсом то этот спайс Rich и рисуется как Rich для этого я добавил файл RSpices.dat с графическими данными. 334.Изменил редактирование карты так чтобы землю рисовало как и спайс (куда ведешь так и рисует) чтобы не приходилось выбирать отдельные картинки и расставлять их по карте, для этого добавил процедуры EarthCreate, EarthKvant, NearEarthKvant и переделал файл Earthes.dat. 335.Добавил рисование дюн на карте для этого переделал файл Gravels.dat. 340.336..340 Добавил процедуры для меню редактирования сценариев и добавил редактирование расположения юнитов и здания. Добавил объект TDIconList(object(TDPageList)) для выбора типа и ранга объекта (юнита.здания.червя) на панели экрана. Добавил удаление объекта нажатием правой кнопки мыши. 341.Добавил в окно редактирования сценария движки для выбора номера альянса и династии. 343.342,343 Добавил в меню редактирования сценария кнопку и меню установки разрешения объектов(Mission.Enables) для этого добавил объект TDCheckListBox(object(TDListBox)). 344.Добавил в меню редактирования сценария кнопку и меню установки максимальной модернизации, кол-ва альянсов, уровня. В меню место кнопки "Своя Игра" поставил кнопку "Редактор" и теперь в редактор карт можно попасть кликнув по этой кнопке. 345.Добавил параметр AlreadyDraw в объект TSpice чтобы было видно рисовался уже этот спайс или нет. Если нет то в методе TSpice.Draw вызывается процедура NearSpiceKvant и больше из этого метода она не вызывается. А из метода TSpice.Create вызов процедуры NearSpiceKvant убрал, а то при загрузке карты при большом (до 1000) кол-ве спайса время загрузки может достигать 1 мин 40 сек (пень 133) что ни в какие ворота не лезет. Вызов процедуры NearSpiceKvant производится обязательно только из метода TSpice.Init. Добавил в окно редактирования сценария установку квоты для альянсов. 346.Добавил LoadScnMenu, SaveScnMenu, и процедуру для этих меню FoundScnFiles. 348.347,348 Добавил процедуры ReadScnObjects, WriteScnObjects, LoadEditScn,SaveEditScn чтобы можно было сохранять сценарии. 349.Добавио NewGameMenu чтобы выбирать Дом(династию), за которую будет играть игрок. 352.350..352 Добавил вместо метода TEnemy.SetPlaza метод TEnemy.FoundPlaza чтобы сам альянс мог определять место своего плаца. Теперь при создании казармы она сама вызывает метод TEnemy.FoundPlaza чтобы альянс компьютера перерегестрировал свои плацы. И когда взрывается казарма она снова вызывает метод TEnemy.FoundPlaza чтобы убрать свой плац из регистрации. 359.353..359 Добавил меню WinsMenu, LoseMenu. Добавил объект TMission. Добавил параметр Debug. Добавил обработку параметров командной строки. 364.Добавил форму которая позволяет просматривать пакетный файл Dune.res (графический) и извлекать из него все или выборочно файлы и сохранять их. 366.365,366 Доработал объект TSpice так чтобы он быстрее обдумывал тип своей картинки в зависимости от окружающего спайса.(было 42 секунды, стало 7 секунд). 369.Переделал главное меню MainMenu так чтобы оно рисовалось через вывод Bigmenu.img и кнопок по отдельности и меню BeginMenu так чтобы выводился герб Дома за который играешь. 374.370..374 Добавил для менюшек LoadMapMenu,SaveMapMenu,LoadScnMenu,SaveScnMenu,LoadSMapMenu процедуры MDblClick чтобы происходило чтение и сохранение по двойному клику. Добавил в процедуры загрузки сценария и в меню регулировки кол-ва альянсов строки для установки переменных MaxUnit, MaxBuild. 377.375..377 Оптимизировал процедуру DrawMiniMap, чтобы обновлялась MiniMapSurface не чаще чем 2 раза в секунду а пока время обновления не пришло, чтобы рисовалась старая копия MiniMapSurface. Так при исследовании уровня 3 миссии Атрейдисов производительность увеличилась с 22..25 fps до 35..44 fps что в 1.59..1.76 раза быстрее. Добавил в NewGameMenu ожидание с помощью процедуры WaitTime при клике на одном из гербов, чтобы успело прозвучать название Династии. 378.Добавил процедуры SaveGame, LoadGame для сохранения текущей игры. Увеличил длину имени карты, которое сохраняется в файле сценария до 127 символов. Исправил метод TEnemy.ToHarvHelp так чтобы нулевой юнит для носителя освобождался когда новый харвестер не может быть создан из-за нехватки казарм. 379.Добавил Load2Menu которое дублирует LoadMenu но при клике на кнопку ОТМЕНА выходит не в MainMenu а в IntroMenu. Исправил процедуры FoundSaveFiles, FoundMapFiles, FoundScnFiles так чтобы если найдено только один файл, то чтобы в списке тоже был один файл а не два как раньше. Исправил процедуру VPut_block32x32 чтобы здания 32 на 32 для фрименов рисовало их цветом. 380.Добавил в меню победы и поражения вызов звукового спича и ожидания 4 секунд. Добавил в метод TMission.Kvant слежение за временем, теперь этот метод вызывается только раз в 8 секунд. Исправил процедуру GetMaxUnitCount так чтобы КДвор позволял строить только 5 дополнительных юнитов. 381.Добавил третий шрифт для вывода информации о ресурсах игрока и о кол-ве юнитов. Шрифт для вывода текстового списка взял с меньшим шагом и теперь в строке TDListBox помещается 42 символа (раньше 35). 385.382..385 Добавил менюшки MentatList, MentatInfo и для них создал объекты TDRichListBox, TDSmallListBox. В меню SaveMenu активизировал кнопку функции DeleteFile. Добавил в формат файла сохранения игры позицию для сохранения значения переменной MainTimer, а то при загрузке игры, которая была сохранена в момент полёта выстрела и рисования взрыва, получалось что значение переменной MainTimer стало наращиваться со значения 0 и ещё не достигло значений в объектах TShut, TBShut, TExplose и постоянно рисовало одну застывшую фазу взрыва или полёта выстрела и только по достижении переменной MainTimer должного значения продолжалась анимация как положено. Теперь все объекты нормально продолжают себя вести после загрузки сохранённой игры. Добавил в окно редактирования карт и сценариев вывод параметров кол-ва юнитов, зданий, спайса, червей, месторождений с максимальными величинами, а то раньше не было видно сколько можно добавлять объектов. Вывод координат на карте тоже отображается с размерами текущей карты. 389.386..389 Исправил метод TSpice.DecMelange так чтобы он вызывал процедуру NearSpiceKvant, а то он раньше просто вызывал метод и при исчерпании спайса соседние спайсы не изменяли свой облик, теперь нормально. Исправил метод TEnemy.Create чтобы при типе миссии на продержаться 30 минут атаки происходили через каждые 15 секунд, а при обычной миссии каждые 30 секунд, а то раньше было через 90 секунд, так заснуть можно. Добавил музыку по атаке и просто когда нет боя. 394.390..394 Переделал метод TSolder.Stoping так чтобы в режиме охраны при поиске врага искало ближайшего в приделах радиуса нанесения удара. А то раньше был общий цикл от 1 до максимальной дистанции в котором столько раз проверялся весь список юнитов, зданий и червей. Теперь же на один вызов Alert происходит одна проверка списка юнитов и если враг не найден, то один раз проверяется список зданий и для червей также. Получился выигрыш на 2 fps(раньше 19..27fps, теперь 20..33). Добавил для управления GameSpeed из окна игры по нажатию клавиш [-],[+]. 395.Исправил функцию AllSpy, а то там где была тень юниты игрока не захватывались в группу выделением даже если тень была отключена.Теперь нормально. Добавил для меню LoadSMapMenu вызов метода LBox.MouseDown(ms_x,ms_y), а то для всех менюшек с LBox(ListBox) сделал а для этого забыл. Обнаружена некорректность при загрузке нового уровня через вызов процедур LoadScn(ReadScnObject), т.е. если в сценарии уже есть радар, то сразу же при создании всех объектов вызывается звуковой сигнал SndRadarTheOn и спич SndRadarOn(house:THouse) что в меню по выводу текста задания миссии выглядит по идиотски. 397.Добавил на форму dresource.pas компоненты RusHelpMemo ,RusMissionMemo с текстами миссий и помощи и теперь не надо их загружать с диска как файлы а просто загружать в LBox через метод LBox.Lines.Assign(например RusHelpMemo.Lines). 398.Исправил метод TEnemy.ToAttackingEnemy так чтобы управление юнитами своего альянса происходило, а то послать чужие(игрока) юниты в атаку на своих же не могло из-за использования метода TSolder.ToAttackEnemy, а вот остановить чужой юнит методом TSolder.ToPatrol могло и делало. Теперь нормально. Исправил процедуры AllToMove, AllToAttack, PlayerLoadGroup так чтобы если в списке Player.Rota или Player.Group[..] попался всё таки вражеский юнит или свой но погибший юнит, то его не посылало как раньше а в данной позиции группы заносилось пустое значение. Теперь нормально. 400.Исправил метод TEnemy.ToFoundTarget так чтобы искало случайный тип здания врага(игрока) и если такого здания нет, то ищет первое попавшееся здание врага(игрока). Исправил метод TSolderBuildChaseComplete так чтобы пересматривало маршрут движения к цели только если участок маршрута пройден() или если цель(юнит врага или атакуемый юнит) изменила свои координаты, т.е. двигается. Перебросил вызов метода Mission.Kvant из процедуры DKvant в процедуру TKvant. 401.Добавил в процедуру MentatInfo вызов процедуры LoadMentatText, которая читает текст из объекта RusMentatMemo. 402.Исправил для объекта TDEdit чтобы значение заносилось через вызов метода TDEdit.PutText, а не через TDEdit.Text:=..., и тогда курсор будет находится в конце слова а не в начале при запуске менюшек с объектом TDEdit. Исправил процедуру TheAutoBuild в методе TBuild.Kvant чтобы прежде чем начать строить юнит происходила проверка а можно ли строить ещё больше юнитов, а то раньше построит, говорит что изготовление завершено, но так как создать ещё один юнит для игрока не может, то начинает строить его заново, и так по кругу пока не будет уничтожен какой-нибудь юнит. Исправил метод TEnemy.ReservRefresh чтобы более эффективно строило юниты а не строило пехоту чаще чем крутые танки. Теперь нормально. 405.Исправил метод TSolder.ToAttackStay так чтобы в этом методе не проводились никакие проверки ... if GetNumObject(mx,my,num,target.otype)=no then exit; ... EnemyAcces(rang,num)=error) then exit; ... так как они проводятся в под процедуре Alert метода TSolder.Stoping. Это должно сэкономить время при режиме обороны. 406.Исправил метод TSolder.ToAttackEnemy и в соответствии с этим исправил методы TEnemy.ToBGuarding, TEnemy.ToUGuarding, TEnemy.ToAttacjkingEnemy так как в этих методах перед вызовом метода TSolder.ToAttackEnemy все параметры цели уже известны и нет надобности вызывать процедуру GetNumEnemy(mx,my,alliance,num,target.otype) для определения типа цели и его номера по его координатам. Уменьшил вероятность создания кратеров при выполнении метода TSolder.Explose, при взрыве Трайка или БТРа вероятность меньше чем при взрыве Танков. 407.Добавил для зданий карту препятствий(мест где находятся здания и проехать нельзя) BBMap и каждое здание при создании регистрирует свою площадку как непроходимую, а после уничтожения регистрирует свою площадку как свободную. На основании этой карты BBMap процедура BuildBarrier вызываемая из процедуры Barrier позволяет определить препятствие(здание) для юнита. Это привело к увеличению производительности в узких местах где раньше было 0..1 fps теперь 3..4 fps. Исправил процедуру PutHarvSpice для харвестеров и процедуру PutHarvSpice метода TGlau.BlowUp так чтобы при выбросе спайса на поверхность проверялось есть спайс в этом месте, если есть то его параметр TSpice.Melange нарастить на нужную величину, а если нет то создать на этом месте новый спайс. Это исправило глюк когда харвестер взрывался на поле спайса то спайс не продумывал свой вид относительно соседнего спайса, а теперь и продумывает и логичнее получается. 410.Добавил меню AboutMenu с бегущим вверх текстом, для этого создал объект TDRunList. 411.Меню AboutMenu переделал с фона обоев на вид как в IntroMenu, только без кнопок. 412.Добавил переход в полноэкранный режим если программа запущена в нормальном режиме а не в отладочном. Из меню AboutMenu убрал рисование курсора мыши, просто убрал вызов процедуры Ms_Draw. 414.413,414 Добавил меню статистики после боя StatisticMenu, и для этого создал объект TDStatisticTab. И только после этого меню игрок попадает в меню BeginMissMenu или AboutMenu в зависимости от того, был ли последний уровень финальным в сценарии. Сделал вывод сообщений и Чата с тенью, стало гораздо выразительней. 417.415..417 Добавил для сетевой игры удаление последнего символа для Чата при нажатии BACKSPACE, и убрал добавление символов в строку Чата с кодом ниже 27. Исправил регистрацию имени игрока-клиента на сервере, а то раньше имя игрока было пустой строкой, для этого исправил процедуру NetAllianceAccepted было procedure NetAllianceAccepted(alliance:integer); var com:string; begin com:='['+IntToStr(ncAllianceAccepted)+' '+ IntToStr(alliance)+' '+ini.playername+' '+']'; здесь alliance на самом деле содержит номер коннекта этого клиента-отправителя и когда сервер получает это сообщение, то записывает так partner[onum].name:=amess; т.е. не по номеру альянса а по номеру коннекта, и конечно когда в чат клиент послал сообщение, то сервер берёт его имя по номеру альянса, а не по номеру коннекта ClientSend(com); end; стало procedure NetAllianceAccepted(connection,alliance:integer); var com:string; begin com:='['+IntToStr(ncAllianceAccepted)+' '+ IntToStr(connection)+' '+IntToStr(alliance)+' '+ini.playername+' '+']'; теперь клиент отсылает не только номер своего коннекта, но и номер своего альянса, и сервер зарегистрирует его имя корректно и в чате все послания будут под корректным ником-именем клиента. ClientSend(com); end; и для этого исправил процедуру ServerComDecoding для сетевой комманды от клиента было ncAllianceAccepted: begin onum:=GetNextInt(index,long,s); amess:=GetNextMess(index,long,s); partner[onum].name:=amess; NetToAcceptHousesList(partner[onum].alliance,CBox.Items); end; теперь ncAllianceAccepted: begin onum:=GetNextInt(index,long,s); mel:=GetNextInt(index,long,s); amess:=GetNextMess(index,long,s); partner[mel].name:=amess; NetToAcceptHousesList(partner[onum].alliance,CBox.Items); end; Исправил меню NetMenu а то заглавия полей ввода Ника и имени сервера были перепутаны и к тому же их содержимое всё равно не заносилось в соответствующие переменные ini.playername и ini.server, и конечно это могло привести к одним и тем же именам игроков, и неизменности адреса сервера. Исправил HostMenu а то раньше всегда в ini.server заносилось значение 'Server' что не правильно, если учитывать что ранее оно могло быть введено пользователем, видимо это я сам сделал для отладки, и забыл исправить. Добавил в объект TDColorBox рисование квадрата(выделение выбранного или установленного по умолчанию) цвета для сетевого игрока. 418.Исправил все меню заводов чтобы можно было строить если финансов равно или больше чем надо, а то раньше было условие чтобы финансов было больше чем надо. Исправил процедуру CreateJustUnit чтобы создавало юнит если общее число юнитов плюс единица меньше или равно максимальному или допустимому для альянса, а то раньше было условие, что только если меньше и из-за этого было на 1 юнит меньше(это привело только к исправлению ошибки при создании харвестера для помощи альянсу когда харвестер был утерян). Исправил под процедуру AllIsDead метода TEnemy.TheBGuarding чтобы при проверке охраны, хоть кто ни будь выжил учитывался альянс, а то номер юнита остался в списке охраны, а на самом деле этот юнит уже погиб, и под его номером живой юнит игрока или другого альянса. Теперь нормально. Ещё в эту процедуру добавил вызов каждого живого охранника чтобы они атаковали нападающих, а то они считаются охраной, а просто стоят когда предыдущую цель замочили. Теперь нормально. 419.Исправил метод TEnemy.VarifyLose чтобы при потере всех единиц альянс при одиночной игре не деактивировался через "active:=no;", а только при сетевой игре. Исправил под процедуру FoundAnyEnemyBuild метода TMission.Kvant так чтобы производился поиск только зданий не считая плит, а то раньше считались все объекты TBuild альянса и конечно когда все здания были разрушены, то плиты оставались и миссия не была завершена. То же самое исправил в под процедуре FoundAnyPlayerBuild этого метода. 420.Исправил под процедуры DrawESolder, DrawESolders метода TExplose.Draw так чтобы при гибели саолдата..труперов на горе рисавались лишь их трупы как и на земле, а то раньше после трупов рисовались трупы присыпаные песком как-будто юнит погиб на песке, это происжходило потому что проверка проводилась только для земли а надо для земли и для гор. 421.Добавил метод TSolder.DrawSmoke и перенёс в неё вызов метода Smoke.Draw(..) а в процедурах DKvant и NetGameDKvant после циклов прорисовки юнитов поставил такие же циклы но прорисовки дыма юнитов Soler[j].DrawSmoke . Это сделало отображение дыма правильным, а то раньше дым мог перекрываться другим энитом если он имеет больший Solder.numobject чем дымящий. 422.Исправил метод TBuild.Create чтобы, при загрузке сценария( если создаётся Радар ), не звучал спичь "Радар активирован" и звук включения радара, для этого использовал тот факт, что при загрузке сценария значение ReadTimer=0 и при создании Радара это проверяется и не даёт звучать этим звукам. Расширил окно Memo где хранится описание миссий чтобы не переносились слова строк, которые не помещаются в окне. 423.Исправил метод TEnemy.TheAttaking чтобы выполнялась проверка, если время следующей атаки настало а атака ещё не завершена, значит она зависла так как цель не доступна или ещё по какой то причине. И раз так то атака прекращается чтобы при очередном вызове метода TEnemy.ToAttaking началась новая атака при которой будет выбрана новая цель. А то раньше очень редко но бывало что противник перестаёт атаковать и ждёт до посинения только потому что те юниты которые считаются в атаке принимают команду Атака, но при проложении маршрута выясняется что подойти к цели не могут. Теперь нормально. 424.Добавил реакцию на клавишу PrintScreen и сохранение скриншота в BMP файл. 425.Исправил меню заводов так чтобы если завод уже занят модернизацией, то новую модернизацию он не начнёт пока не закончит текущую модернизацию. 426.Так как в полноэкранном режиме перехват нажатия клавиши "PrintScreen" не срабатывает, то сделал сохранение экрана по нажатию "F12". Теперь нормально. 427.Исправил под процедуру BuildUnitError метода TEnemy.RefreshReserv так чтобы не штамповало одни только максимальные танки на Tzavodе, а по случайному определяло что из доступного можно построить на Tzavodе. Теперь CPU строит не только RTankи но Tankи тоже в перемешку. Ещё исправил этот метод так чтобы солдат штамповало только при экономичном режиме альянса, а то можно строить крутые танки, а казармы штампуют солдат толпами, так как казарм обычно более одной и кол-во казарм доходит обычно до 4. 428.Исправил метод TBuild.ThePatrol так чтобы Turret не атаковала авиа юниты, а чтобы RTurret атаковала всех подряд, и сделал поиск врага как у юнитов , т.е. просмотр всех юнитов и кто ближе того и атаковать, а то раньше была проверка по определённой дистанции и так в цикле дистанция наращивалась до максимальной для башни и опять все юниты просматривались, и это вносило задержку, теперь работает быстрее, и исправил метод TBuild.ToAttack так как и TSolder.ToAttackStay чтобы не вызывалась процедура опознавания объекта по координатам, теперь просто включает атаку так как все параметры цели TBuild.Target устанавливаются в методе TBuild.ThePatrol . 429.Исправил процедуру CreateJustUnit чтобы в методе TEnemy.ToHarvHelp при попытке создания харвестера не получилось так что он создаётся под 0-ым индексом. Теперь нормально. Исправил метод TEnemy.RefreshReserv так чтобы пыталось проверить и создать два юнита, а паузу между вызовами этого метода увеличил с 1 сек до 2 сек, а то при каждом вызове проверялось кол-во юнитов этого альянса, и это потребляет производительность. Исправил метод TEnemy.ToAttacking так чтобы если не 8-й тип миссии то после каждой атаки пауза до следующей атаки увеличивалась на 1 сек, а то альянс посылает с каждым разом всё больше юнитов в атаку, а регенерировать армию не успевает. Исправил метод TEnemy.Harvesting так чтобы если у альянса менее 3 харвестеров, то чтобы строило ещё один, а если уровень игры более 6-го, то чтобу строило не менее 5 харвестеров. 430.Исправил процедуру PrintAllianceInfo так чтобы если за счёт кол-ва казарм максимальное кол-во армии игрока перевалило за "100", то чтобы показывало что максимум "99". Исправил метод TEnemy.Harvesting чтобы взависимости от кол-ва Элеваторов CPU строил определённое кол-во Харвестеров, а то свой начальный запас альянс быстро расходует и не успевает собирать достаточно нового спайса. 431.Исправил меню заводов так , чтобы они проверяли можно ли строить ещё юнит или предел уже достигнут. Исправил процедуру ControlButtonsPanel так чтобы тоже проводилась проверка можно ли строить ещё один юнит, или предел уже достигнут(проверка для всех заводов кроме KDvor). Исправил процедуру EditDKvant так чтобы имя загруженной(редактируемой) карты отображалось на экране редактора как это уже делается в редакторе сценариев. Исправил под процедуру TheAutoBuild метода TBuild.Kvant так чтобы при вызове метода TBuild.ToBuilding(thing,makeprice) вместо параметра makeprice стояла бы лакальная переменная aprice:=GetThingPrice(thing), а то по умолчанию для Akademy makeprice:=GetThingPrice(tgTrupper) и в режиме AutoBuild при строительстве Truppers получается что строило Trupers по цене Truper, а не по цене Trupers. Теперь правильно, так как автоматом работает для всех заводов. 432.Исправил метод TMission.Kvant чтобы корректно определяло результат миссии(победа/поражение) при типе миссии №9. Для этого же типа миссии увеличил время с 30 до 60 минут чтобы разрушить базу противника. Исправил процедуру DKvant так чтобы корректно выводило обратный отсчёт времени. 433.Исправил метод TEnemy.ToNosHarv и TEnemy.ToNosHarvBack так чтобы они не проверяли Mission.AzavodUpgrade<1 , а то Носитель доступен и при апгрейде=0, а служба включается только при апгрейде=1. Теперь нормально. Исправил этот же метод, сделал его функцией и если служба включилась(true), то Харвестер ждёт, а если функция вернула значение(false), то Харвестер идёт своим ходом в пункт назначения. Исправил метод TSolder.Motion так чтобы Харвестер вызывал Носитель не только при недосягаемости пункта назначения, но и при его отдалённости более чем на 20 позиций карты. Исправил процедуру GameMRClick так чтобы если Харвестер полон на 100%, а клик был на спайсе, то чтобы Харвестер просто двигался туда как по команде MOVE. 434.Исправил процедуру Spy в целях оптимизации. 435.Исправил процедуру Spy, а то предыдущим изменением этой процедуры внёс ошибку. Теперь нормально. Исправил процедуру TKvant, а то в цикле for a:=acPlayer to acAther do enemy[a].kvant; если кол-во альянсов дболее 2-х, то действовали только 2 альянса, а 3-й не активировался, так как константа acAther=2 for a:=acPlayer to Mission.alliances{acAther} do enemy[a].kvant; Теперь нормально. 436.Исправил процедуру PrepareProgAfterLoadGame так чтобы после загрузки значения переменной maintimer инициализировались курсоры мыши, чтобы не замерала анимация курсора. Добавил в метод OnNotify строку Notify:=true; чтобы выполнялось следующее событие OnNotify. 437.Исправил меню HelpMenu, Load2Menu, LoadMenu, SaveMenu, MentatListMenu, MentatInfoMenu так чтобы при выходе из этих меню освобождались объекты списков через метод Free этих объектов(LBox,SBox,RBox), а то по 1-2 кБайта постепенно наращивалась, занимаемая программой, память. Теперь нормально. 438.Исправил меню LoadScnMenu, SaveScnMenu так чтобы при выходе из этих меню освобождались объекты списков. Исправил систему редактирования сценариев чтобы корректно показывало династию и номер альянса и не изменяло выбранную закладку (юниты, здания, шай-хулуд,..). 439.Исправил меню LoadMapMenu, SaveMapMenu так чтобы при выходе из этих меню освобождались объекты списков. 440.Исправил методы TShut.Create TShut.Draw для Deviator так, чтобы при попадании ракеты и при рисовании облака газа не появлялась ещё одна картинка пролетевшей ракеты дальше цели. Добавил под процедуры FoundLeftWay FoundRightWay (new4) оптимизированные и исправленные так чтобы юниты находили путь к цели ещё с большей вероятностью. 441.Бета-тестирование завершено. Релизовая версия(на русском языке). 442.Уменьшил шаг вывода строк отладочной информации при Debug-режиме. 444.Установил Port=1025 для Сокетов по умолчанию. 445.Исправил процедуру PrepareForRunNetProg для клиента, а то раньше сервер устанавливал mission.alliances:=ini.partners а сервер нет и при клике в меню заводов на изготавление юнита происходило деление на нуль так как mission.alliances было равно нулю. Теперь нормально. 446.Добавил включение/отключение отображения отладочной информации в Debug-режиме по нажатию ALT+I. 447.Добавил установку режима hicolor15/16 bits через параметр PaletteType в INI-файле. Добавил Виноградова Кирилла как ещё одного тестера. 448.Добавил отслеживание трафика(байт/с) для сетевой игры и вывод её как информации отладки.
Фенита ля комедия?...


BACK   MAIN