а разрабы не додумались на кнопку "Save As" брать изначальный путь картинки?
то есть им норм каждый раз весь путь с нуля писать в пустое поле, да? и папку и новое имя да? это удобно должно быть?
и если проект закрыт и не обновляется - то почему исходники не выложены?
а если таких ректов 200 ?
давай я тебе скину карту и список координат, а ты мне вернёшь карту с уже созданными ректами в WE по этому списку
идёт? тебе же это раз плюнуть вроде
а потом ещё пару раз, для карт с другим номером vерсии карты
имелось ввиду, что в j файле погода идёт отдельными строками, а не в координатных =Rect() строках, которые юзер будет вставлять на сайт:
а цвет вообще хранится только в w3r файле и нигде больше, т.е. восстановить цвет после удаления w3r никак не получится:
set gg_rct_Rect4 = Rect( 896.0, 1280.0, 1440.0, 1920.0 )
set we = AddWeatherEffect( gg_rct_Rect4, 'RAhr' )
лучше будет, если ты его таким и оставишь (с правым окном)
потому как я себе тоже делал подобный парсер чисел, чтобы сравнивать изменения координат при смене версий карты
после обфускации кода по названиям переменных уже не сравнить, а остаётся только по конкретным 4-х числовым координатам сравнивать
(т.е. нужда в переводе j-текста в обычные числа тоже есть)
ещё можно второй вид представления добавить вида "Rect1\t1111,0\t2222,0\t3333,0\t4444,0" чтобы список был максимально числовым с табуляцией без лишнего текста
тогда получится два инструмента в одном - и w3r конвертор, и обработчик координат из j файла
потестил, парсер прекрасный, обрабатывает даже без пробелов и числа без нулей после точки вида:
set gg_rct_Rect001 = Rect(3071.,1536.,3200.,1664.)
если кнопку "скачать" передвинуть направо под список minX minY, то будет интуитивно понятнее, что качаешь что-то обработанное
а если она слева - то как будто качаешь что-то своё, которое сам вставил необработанное
nazarpunk: я так понимаю, что ты хочешь из взломанной карты вернуть ректы в WE?
да, исходника карты у меня нету
а нужно это для визуального отображения, потому как w3r влияет только на отображение в WE и не влияет на исполнение j файла (поэтому протекторы и удаляют w3r собственно)
благо в формате =Rect() нет ни погоды, ничего - можно занулить всё и оставить только 4 координаты и имя, и номер порядковый
nazarpunk: Каким образом такой рект интерпретировать:
если будет инструмент-конвертер хотя бы для чистых числовых координат,
то такой рект (или много ректов в цикле) можно автоматом просчитать и вывести через прелоад в текстовик в виде готовых чисел и сразу скормить их на сайт
в WE тоже нельзя задать переменные в координаты ректа, и в w3r чистые цифры, поэтому перевод из букав в цифры ложится на картодела
а легкий способ по переводу я уже указал
а зачем усложнять? надо сразу на ASM писать карту, языки для слабых
а по пути удалить WE, JNGP, VSCode, UjAPI, просмотровщики моделей и прочие джас хелперы с блендерами
вот результаты тестов:
по общему впечатлению карта с глобалками на промежутке 40~50 фпс работает на пару фпс ниже-выше (прыжками туда сюда), сложно отловить, но тренд небольшой есть на обоих проверках
в целом - отличий на высоких фпс практически нет, зато как только фпс начинают падать - так сразу появляется небольшой выйгрыш на 5-10 фпс перед предсмертной агонией, т.е. небольшой выйгрыш таки есть, цена этому - сотня замен по всему коду и при выходе новых версий временнозатратно будет их патчить
goodlyhero: В целом, вместо ренжа 200 вам хватит и 128
перепроверил с радиусом 128, а также выключил -pro режим, который был включен при первом (с радиусом 200) тесте и съедал фпс на себя
итоговые результаты поразительны - количество коллизий уменьшилось в 3 раза, а максимальное количество коробок стало в 2 раза выше
и если в оригинальном виде - было под 80000 просчётов коллизий и максимум 8 объектов (не путать с 1ым графиком, там чуть щадящая система оценки была и можно сдвинуть на 1 влево)
то в enum128 варианте - происходит только 35000 просчетов коллизий, и макс 15 объектов, что уже ощутимо вырывается по отличиям
мало того, эта система еще и гибкая - т.е. в реальных игровых условиях результаты будут еще чуть лучше, потому что многие объекты стоят отдельно на уровне а не в единой цепочке с остальными
с имеющимся кодом и лимитами варика - думаю осталось два путя:
1 - оптимизировать MushroomMoving_RectCondition, там по 3 раза вызывается MushroomMoving_CollisionCheck на каждый чих а не по 1 и есть шанс еще в 3 раза повысить производительность без потери текущей физики
2 - как предложил Daro делать на триггерах вхождения юнитом в регион (на карте подобная система уже присутствует при нырянии в воду)
возможно есть и другие методы, а также те люди, кто в будущем захочет этим заняться и довести максимальное количество объектов до 50, как и задумано в карте с лабораторией - заспавнить 50 коробок
пожалуй заберу метод с радиусом как облегчение игрокам с низкими фпс
тем более что картоделы тоже страдают от этого лимита коробок, поэтому на карте больше 7+6=13 объектов обычно не появляется
function UnitIndex takes unit u returns integer
local integer i=1
loop
exitwhen i>PLAYER_MAXINUM+Stage_BoxsCount
if u==OrangeMushroom[i] then
set u=null
return i
endif
set i=i+1
endloop
set u=null
return 0
endfunction
function MushroomMoving_CollisionCheck takes integer i,real x,real y returns boolean
local integer j=1
local real otherx
local real othery
local group G = CreateGroup()
local unit u=null
if LevelClearState[i]==false then
call GroupEnumUnitsInRange(G, x,y, 128, null)
loop
set u = FirstOfGroup(G)
exitwhen u==null
if MB_Frame_On==1 then
set MB_CollisionY = MB_CollisionY+1
endif
if u!=OrangeMushroom[i] then
set j=UnitIndex(u)
set otherx=GetUnitX(OrangeMushroom[j])
set othery=GetUnitY(OrangeMushroom[j])
if (GetPlayerSlotState(GetOwningPlayer(OrangeMushroom[j]))==PLAYER_SLOT_STATE_PLAYING or j>PLAYER_MAXINUM) then
if ContainsCoords(otherx-64,othery-64,otherx+64,othery+64,x,y)==true then
if PropellyCondition==true then
if GetUnitTypeId(OrangeMushroom[j])!='orai' then
set u=null
call DestroyGroup(G)
set G=null
set Frame_MainPlayerY=j
return false
endif
else
set u=null
call DestroyGroup(G)
set G=null
set Frame_MainPlayerY=j
return false
endif
endif
endif
endif
call GroupRemoveUnit(G, u)
endloop
call DestroyGroup(G)
set G=null
endif
return true
endfunction
в варианте с енум чтобы коллизия работала с грибами - надо подредактировать юнитов в WE и убрать там Aloc, а потом в самом j коде второй раз убрать Aloc, но это уже другая история
goodlyhero: 1. У вас есть вторая функция которая делает также: MushroomMoving_Collision
она для движений по X, и совсем не нагружает код, по сравнению с MushroomMoving_CollisionCheck
на скрине она в текущем фрейме просчитывается по X 0 раз, а по Y 111 раз
поэтому с её переделкой я даже не заморачивался
goodlyhero: 2. нужно уничтожать группу через DestroyGroup
я проводил тесты, да и в том цикле есть условие по exitwhen u==null
разве когда берётся юнит из пустой группы - call GroupEnumUnitsInRange(G, x,y, 200, null) - то переменная u не обнуляется?
чем отличается u=null после выборки из пустой группы и ручное set u=null ?
у меня сначала были строки set u=null, но потом я решил что все равно u обнуляется перебором юнитов в группе и такие строки будут излишни
goodlyhero: 4. В этот ренж попадает и сам юнит, Нужно его пропустить, например банальной проверкой
там же стоит именно такая проверка -- if u != OrangeMushroom[i] then
в карте у всех юнитов стоит abiList:
Aloc - москиты locust - что делает юнита некликабельным и не показывает тултип
Avul - неуязвимый invulnerable - что убирает показывание полоски жизни
GroupEnumUnitsInRect и GroupEnumUnitsInRange - не работает с москитами, т.е. юнита с такой абилкой - не добавляет в группу
если убрать Aloc с коробки - то коллизии начинают работать
если убрать Aloc с гриба - то коллизии почему-то не срабатывают когда гриб под коробкой - если коробка сверху, то она проваливается в него, хотя на коробке гриб стоит нормально
после редактирования карты и убирания москитов с коробок такие результаты:
-bridge 12 в новом коде выдает 19200 коллизий против 79200 коллизий в прошлом
варик без пробуксовывания может обрабатывать максимум уже не -bridge 12 а -bridge 18 - 28600 коллизий
-ladder2 10 в новом коде выдает 26300 коллизий против 82000 коллизий в прошлом
варик без пробуксовывания может обрабатывать максимум уже не -ladder2 10 а -ladder2 12 - 32200 коллизий
вот получившийся код через GroupEnumUnitsInRange 200
пока через радиус, с ректом не морочился
код GroupEnumUnitsInRange 200
function UnitIndex takes unit u returns integer
local integer i=1
loop
exitwhen i>PLAYER_MAXINUM+Stage_BoxsCount
if u==OrangeMushroom[i] then
set u=null
return i
endif
set i=i+1
endloop
set u=null
return 0
endfunction
function MushroomMoving_CollisionCheck takes integer i,real x,real y returns boolean
local integer j=1
local real otherx
local real othery
local group G = CreateGroup()
local unit u=null
if LevelClearState[i]==false then
call GroupEnumUnitsInRange(G, x,y, 200, null)
loop
set u = FirstOfGroup(G)
exitwhen u==null
if MB_Frame_On==1 then
set MB_CollisionY = MB_CollisionY+1
endif
if u!=OrangeMushroom[i] then
set otherx=GetUnitX(u)
set othery=GetUnitY(u)
set j=UnitIndex(u)
if (GetPlayerSlotState(GetOwningPlayer(OrangeMushroom[j]))==PLAYER_SLOT_STATE_PLAYING or j>PLAYER_MAXINUM) then
if ContainsCoords(otherx-64,othery-64,otherx+64,othery+64,x,y)==true then
if PropellyCondition==true then
if GetUnitTypeId(OrangeMushroom[j])!='orai' then
set G=null
set Frame_MainPlayerY=j
return false
endif
else
set G=null
set Frame_MainPlayerY=j
return false
endif
endif
endif
endif
call GroupRemoveUnit(G, u)
endloop
set G=null
endif
return true
endfunction
nazarpunk: А имелось в виду сверять только ближайшие координаты, чтоб хоть как-то понизить сложность.
какой нативкой можно сверять ближайшие координаты у других юнитов рядом с заданным?
nazarpunk: Зачем получать координаты из игры, если стандартная система перемещений отключена? Почему не хранить их в массиве не пользоваться только Set?
прекрасное замечание, завтра попробую пошаманить и перевести координаты на глобалки
goodlyhero: Попробуйте проверять на коллизию не всех юнитов на карте а только ближайших, например через поиск их в ректе.
а разве именно это не делает эта имеющаяся строка в коде?:
if ContainsCoords(otherx-64,othery-64,otherx+64,othery+64,x,y)==true then
более того - если эту проверку убрать и оставить только считывание координат всех юнитов - то скорость особо не изменится, т.к. тормоза идут именно из-за считывания координат, которые потом сравниваются - близко они или далеко
» WarCraft 3 / какие свойства есть у абилки 'Aloc' и чем их воспроизвести?
Ред. host_pi
» WarCraft 3 / какие свойства есть у абилки 'Aloc' и чем их воспроизвести?
Ред. host_pi
» WarCraft 3 / каким софтом можно редактировать цвет прозрачного альфа слоя?
Ред. host_pi
» WarCraft 3 / BLP Laboratory (blplab)
то есть им норм каждый раз весь путь с нуля писать в пустое поле, да? и папку и новое имя да? это удобно должно быть?
Ред. host_pi
» WarCraft 3 / каким софтом можно создать w3r файлы из координат?
давай я тебе скину карту и список координат, а ты мне вернёшь карту с уже созданными ректами в WE по этому списку
идёт? тебе же это раз плюнуть вроде
Ред. host_pi
» WarCraft 3 / каким софтом можно создать w3r файлы из координат?
Ред. host_pi
» XGM Team / Онлайн-инструменты для геймдев и моддинг арта
а цвет вообще хранится только в w3r файле и нигде больше, т.е. восстановить цвет после удаления w3r никак не получится:
потому как я себе тоже делал подобный парсер чисел, чтобы сравнивать изменения координат при смене версий карты
после обфускации кода по названиям переменных уже не сравнить, а остаётся только по конкретным 4-х числовым координатам сравнивать
(т.е. нужда в переводе j-текста в обычные числа тоже есть)
ещё можно второй вид представления добавить вида "Rect1\t1111,0\t2222,0\t3333,0\t4444,0" чтобы список был максимально числовым с табуляцией без лишнего текста
тогда получится два инструмента в одном - и w3r конвертор, и обработчик координат из j файла
Ред. host_pi
» WarCraft 3 / каким софтом можно создать w3r файлы из координат?
а если она слева - то как будто качаешь что-то своё, которое сам вставил необработанное
Ред. host_pi
» XGM Team / Онлайн-инструменты для геймдев и моддинг арта
а нужно это для визуального отображения, потому как w3r влияет только на отображение в WE и не влияет на исполнение j файла (поэтому протекторы и удаляют w3r собственно)
благо в формате =Rect() нет ни погоды, ничего - можно занулить всё и оставить только 4 координаты и имя, и номер порядковый
Ред. host_pi
» WarCraft 3 / каким софтом можно создать w3r файлы из координат?
когда у тебя есть только координаты и ты выбираешь:
Ред. host_pi
» XGM Team / Онлайн-инструменты для геймдев и моддинг арта
то такой рект (или много ректов в цикле) можно автоматом просчитать и вывести через прелоад в текстовик в виде готовых чисел и сразу скормить их на сайт
в WE тоже нельзя задать переменные в координаты ректа, и в w3r чистые цифры, поэтому перевод из букав в цифры ложится на картодела
а легкий способ по переводу я уже указал
Ред. host_pi
» XGM Team / Онлайн-инструменты для геймдев и моддинг арта
Ред. host_pi
» XGM Team / Онлайн-инструменты для геймдев и моддинг арта
Ред. host_pi
» WarCraft 3 / каким софтом можно создать w3r файлы из координат?
а по пути удалить WE, JNGP, VSCode, UjAPI, просмотровщики моделей и прочие джас хелперы с блендерами
» Game Dev / Шлемы-тыквы - иконки от ИИ
» Game Dev / Шлемы-тыквы - иконки от ИИ
Ред. host_pi
» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?
по общему впечатлению карта с глобалками на промежутке 40~50 фпс работает на пару фпс ниже-выше (прыжками туда сюда), сложно отловить, но тренд небольшой есть на обоих проверках
в целом - отличий на высоких фпс практически нет, зато как только фпс начинают падать - так сразу появляется небольшой выйгрыш на 5-10 фпс перед предсмертной агонией, т.е. небольшой выйгрыш таки есть, цена этому - сотня замен по всему коду и при выходе новых версий временнозатратно будет их патчить
итоговые результаты поразительны - количество коллизий уменьшилось в 3 раза, а максимальное количество коробок стало в 2 раза выше
и если в оригинальном виде - было под 80000 просчётов коллизий и максимум 8 объектов (не путать с 1ым графиком, там чуть щадящая система оценки была и можно сдвинуть на 1 влево)
то в enum128 варианте - происходит только 35000 просчетов коллизий, и макс 15 объектов, что уже ощутимо вырывается по отличиям
мало того, эта система еще и гибкая - т.е. в реальных игровых условиях результаты будут еще чуть лучше, потому что многие объекты стоят отдельно на уровне а не в единой цепочке с остальными
1 - оптимизировать MushroomMoving_RectCondition, там по 3 раза вызывается MushroomMoving_CollisionCheck на каждый чих а не по 1 и есть шанс еще в 3 раза повысить производительность без потери текущей физики
2 - как предложил Daro делать на триггерах вхождения юнитом в регион (на карте подобная система уже присутствует при нырянии в воду)
возможно есть и другие методы, а также те люди, кто в будущем захочет этим заняться и довести максимальное количество объектов до 50, как и задумано в карте с лабораторией - заспавнить 50 коробок
тем более что картоделы тоже страдают от этого лимита коробок, поэтому на карте больше 7+6=13 объектов обычно не появляется
вот код с глобалками + енум - xgm.guru/files/100/315886/comments/520383/BoxLab_1.1_EN_global_e...
вот чистый енум:
Ред. host_pi
» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?
на скрине она в текущем фрейме просчитывается по X 0 раз, а по Y 111 раз
поэтому с её переделкой я даже не заморачивался
разве когда берётся юнит из пустой группы - call GroupEnumUnitsInRange(G, x,y, 200, null) - то переменная u не обнуляется?
чем отличается u=null после выборки из пустой группы и ручное set u=null ?
у меня сначала были строки set u=null, но потом я решил что все равно u обнуляется перебором юнитов в группе и такие строки будут излишни
Ред. host_pi
» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?
Aloc - москиты locust - что делает юнита некликабельным и не показывает тултип
Avul - неуязвимый invulnerable - что убирает показывание полоски жизни
GroupEnumUnitsInRect и GroupEnumUnitsInRange - не работает с москитами, т.е. юнита с такой абилкой - не добавляет в группу
если убрать Aloc с гриба - то коллизии почему-то не срабатывают когда гриб под коробкой - если коробка сверху, то она проваливается в него, хотя на коробке гриб стоит нормально
варик без пробуксовывания может обрабатывать максимум уже не -bridge 12 а -bridge 18 - 28600 коллизий
варик без пробуксовывания может обрабатывать максимум уже не -ladder2 10 а -ladder2 12 - 32200 коллизий
пока через радиус, с ректом не морочился
Ред. host_pi
» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?
благо карта позволяет всё измерить сразу же
Ред. host_pi
» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?
варик начинают загружать именно эти две строки:
Ред. host_pi
» XGM Team / Онлайн-инструменты для геймдев и моддинг арта
хотелось бы списочек того - что про геймдизайн
» XGM Конкурсы / [Итоги] Большой Турнир Ландшафтеров 2023
» XGM Конкурсы / [Итоги] Большой Турнир Ландшафтеров 2023
» Мир безумного / Activision Blizzard присоединяется к Microsoft