Sinistra на этом проблемы не закончились. Уже вручную и почти случайно обнаружила поломанные типы, используемые игрой (должны остаться английскими, т. к. это идентификаторы).
Что делает редактор в этом случае? Не уверена насчет проблем с наполнением списка в меню и поиском, но как минимум редактор скатывается в англоязычный файл. То ли встроен где-то, то ли как.
Пример правильный. Тут типы не переведены: Кэш-игры: Восстановить угол поворота боевой единицы
_RestoreUnitLocFacingAngleBJ_Parameters="Восстановить ",~Label," ",~Category," из ",~Game Cache," для ",~Player," в ",~Location," поворот ",~Angle
Пример неправильного перевода, испорчены типы: Хэш-таблица: Save Gamecache Handle
_SaveGameCacheHandleBJ_Parameters="Сохранить ",~кэш игры," как ",~значение," - ",~значение," в ",~Hashtable,"."
По-простому, всё что вне двойных скобок - это может восприниматься игрой не как текст. Потому работают запятые и названия ~customtype. Поэтому для корректной работы этого русификатора надо восстановить эти названия из англ. файла. А таких мест много.
Оглашаю весь список, пожалуйста
Номер строки в файле
3677:_TriggerRegisterDeathEvent_Parameters=~Разрушаемый объект," уничтожен"
3683:_TriggerRegisterDestDeathInRegionEvent_Parameters="Уничтожены в ",~области,""
3691:_TriggerRegisterDialogEventBJ_Parameters="Нажата кнопка диалогового окна ",~кнопка диалогового окна
3706:_TriggerRegisterVariableEvent_Parameters=~Действительное число," становится ",~Operation," ",~Value
3730:_TriggerRegisterCommandEvent_Parameters="Кнопка способности ",~способность," с приказом ",~приказ," нажата"
3736:_TriggerRegisterBuildCommandEventBJ_Parameters="Кнопка строительства ",~здание," нажата"
3742:_TriggerRegisterTrainCommandEventBJ_Parameters="Кнопка найма ",~боевая единица," нажата"
3748:_TriggerRegisterUpgradeCommandEventBJ_Parameters="Кнопка исследования ",~исследование," нажата"
3754:_TriggerRegisterCommonCommandEventBJ_Parameters="Кнопка приказа ",~приказ," нажата"
3774:_TriggerRegisterPlayerChatEvent_Parameters=~Player," напечатал такое сообщение ",~текст," как ",~Match Type
3856:_TriggerRegisterTimerExpireEventBJ_Parameters=~Таймер," истекает"
3864:_TriggerRegisterUnitEvent_Parameters=~Боевая единица," ",~Event
3882:_TriggerRegisterEnterRectSimple_Parameters="Боевая единица входит в область ",~область
3888:_TriggerRegisterLeaveRectSimple_Parameters="Боевая единица покидает область ",~область
3894:_TriggerRegisterUnitInRangeSimple_Parameters="Боевая единица в радиусе ",~Range," от ",~боевой единицы
3901:_TriggerRegisterUnitLifeEvent_Parameters=~У боевой единицы," здоровье становится ",~Operation," ",~Value
3907:_TriggerRegisterUnitManaEvent_Parameters=~У боевой единицы," мана становится ",~Operation," ",~Value
3936:_OperatorCompareBuffId_Parameters=~Значение," ",~Operator," ",~значение
3942:_OperatorCompareDestructible_Parameters=~Значение," ",~Operator," ",~значение
3954:_OperatorCompareButton_Parameters=~Value," ",~Operator," ",~значение
3978:_OperatorCompareItem_Parameters=~Значение," ",~Operator," ",~значение
4066:_OperatorCompareString_Parameters=~Value," ",~Operator," ",~значение
4072:_OperatorCompareTechCode_Parameters=~Value," ",~Operator," ",~значение
4084:_OperatorCompareTrigger_Parameters=~Значение," ",~Operator," ",~значение
4090:_OperatorCompareUnit_Parameters=~Value," ",~Operator," ",~значение
4102:_GetBooleanAnd_Parameters=~Условие 1," и ",~условие 2
4109:_GetBooleanOr_Parameters=~Условие 1," или ",~условие 2
4142:_CommentString_Parameters="-------- ",~Текст," --------"
4148:_CustomScriptCode_Parameters="Личный сценарий: ",~код сценария
4168:_WaitForCondition_Parameters="Ждать ",~условие,", проверяя каждые ",~Interval," секунд"
4183:_SetVariable_Parameters="Установить ",~переменную," = ",~значение
4205:_IfThenElse_Parameters="Если ",~условие,", то делать ",~действие,", иначе ",~действие
4226:_ForLoopVarMultiple_Parameters="Для каждого (Числа ",~целое число,") от ",~Start," до ",~End,", делать"
4233:_ForLoopA_Parameters="Для каждого (числа A) от ",~Start," до ",~End,", делать ",~действие
4240:_ForLoopB_Parameters="Для каждого (числа B) от ",~Start," до ",~End,", делать ",~действие
4247:_ForLoopVar_Parameters="Для каждого (числа ",~целое число,") от ",~Start," до ",~End,", делать ",~действие
4549:_AdjustCameraBoundsForPlayerBJ_Parameters=~Расширить/сузить," границы камеры для ",~Player," на запад ",~West,", на восток ",~East,", на север ",~North,", и на юг ",~South
4699:_SetDialogueTextKey_Parameters="Установить идентификатор текста диалога для звука ",~звук," идентификатор текста диалога ",~текст,"
4705:_SetDialogueSpeakerNameKey_Parameters="Установить идентификатор имени диктора для звука ",~звука," идентификатор имени диктора ",~текст,"
4711:_PlayDialogueFromSpeakerEx_Parameters="Воспроизведение диалога ",~игрок," от ",~боевая единица," с типом ",~боевая единица (тип),". Воспроизвести ",~звук,". Изменить продолжительность: ",~Method," ",~Time," секунд и ",~Wait/Don't Wait
4718:_PlayDialogueFromSpeakerTypeEx_Parameters="Воспроизведение диалога ",~группе игроков," от ",~игрока," ",~боевой единицей (тип)," к пользовательскому интерфейсу в местоположении ",~местоположение,". Произвести ",~звук,". Изменить продолжительность: ",~Method," ",~Time," секунд и ",~Wait/Don't Wait
4776:_EnableOcclusionBJ_Parameters=~Включить/Отключить," окклюзию для ",~Player Group
4782:_EnableWorldFogBoundaryBJ_Parameters=~Включить/Отключить," обрезку краев для ",~Player Group
4912:_ModifyGateBJ_Parameters=~Open/Close/Destroy," ",~Ворота
4918:_ChangeElevatorWalls_Parameters=~Open/Close," ",~Walls," ",~Подъёмник
4924:_ChangeElevatorHeight_Parameters=Установить высоту ,~Подъёмника," до ",~Height
5171:_SetTextTagSuspendedBJ_Parameters="Изменить ",~Floating Text,": ",~Включить/Отключить," приостановку"
5177:_SetTextTagPermanentBJ_Parameters="Изменить ",~Floating Text,": ",~Включить/Отключить," постоянство"
5203:_DisplayTextToForce_Parameters="Показывать для ",~Player Group," текст: ",~Текст
5209:_DisplayTimedTextToForce_Parameters="Показывать для ",~Player Group," в течение ",~Time," секунд текст: ",~Текст
5541:_SaveRealBJ_Parameters="Сохранить ",~действительное число," как ",~значение," - ",~значение," в ",~Hashtable
5547:_SaveIntegerBJ_Parameters="Сохранить ",~целое число," как ",~значение," - ",~значение," в ",~Hashtable
5553:_SaveBooleanBJ_Parameters="Сохранить ",~логическое значение," как ",~значение," - ",~значение," в ",~Hashtable
5559:_SaveStringBJ_Parameters="Сохранить ",~строку," как ",~значение," - ",~значение," в ",~Hashtable
5565:_SavePlayerHandleBJ_Parameters="Сохранить ",~игрока," как ",~значение," - ",~значение," в ",~Hashtable,"."
5571:_SaveWidgetHandleBJ_Parameters="Сохранить ",~виджет," как ",~значение," - ",~значение," в ",~Hashtable,"."
5577:_SaveDestructableHandleBJ_Parameters="Сохранить ",~разрушаемый объект," как ",~значение," - ",~значение," в ",~Hashtable,"."
5583:_SaveItemHandleBJ_Parameters="Сохранить ",~предмет," как ",~значение," - ",~значение," в ",~Hashtable,"."
5589:_SaveUnitHandleBJ_Parameters="Сохранить ",~боевую единицу," как ",~значение," - ",~значение," в ",~Hashtable,"."
5595:_SaveAbilityHandleBJ_Parameters="Сохранить ",~способность," как ",~значение," - ",~значение," в ",~Hashtable,"."
5601:_SaveTimerHandleBJ_Parameters="Сохранить ",~таймер," как ",~значение," - ",~значение," в ",~Hashtable,"."
5611:_SaveTriggerHandleBJ_Parameters="Сохранить ",~триггер," как ",~значение," - ",~значение," в ",~Hashtable,"."
5617:_SaveTriggerConditionHandleBJ_Parameters="Сохранить ",~условие триггера," как ",~значение," - ",~значение," в ",~Hashtable,"."
5623:_SaveTriggerActionHandleBJ_Parameters="Сохранить ",~действие триггера," как ",~значение," - ",~значение," в ",~Hashtable,"."
5629:_SaveTriggerEventHandleBJ_Parameters="Сохранить ",~событие триггера," как ",~значение," - ",~значение," в ",~Hashtable,"."
5635:_SaveForceHandleBJ_Parameters="Сохранить ",~группу игроков," как ",~значение," - ",~значение," в ",~Hashtable,"."
5641:_SaveGroupHandleBJ_Parameters="Сохранить ",~отряд," как ",~значение," - ",~значение," в ",~Hashtable,"."
5647:_SaveLocationHandleBJ_Parameters="Сохранить ",~местоположение," как ",~значение," - ",~значение," в ",~Hashtable,"."
5653:_SaveRegionHandleBJ_Parameters="Сохранить ",~область," как ",~значение," - ",~значение," в ",~Hashtable,"."
5659:_SaveRectHandleBJ_Parameters="Сохранить ",~область," как ",~значение," - ",~значение," в ",~Hashtable,"."
5665:_SaveBooleanExprHandleBJ_Parameters="Сохранить ",~логическое значение," как ",~значение," - ",~значение," в ",~Hashtable,"."
5679:_SaveSoundHandleBJ_Parameters="Сохранить ",~звук," как ",~значение," - ",~значение," в ",~Hashtable,"."
5689:_SaveEffectHandleBJ_Parameters="Сохранить ",~эффект," как ",~значение," - ",~значение," в ",~Hashtable,"."
5695:_SaveUnitPoolHandleBJ_Parameters="Сохранить ",~резервную боевую единицу," как ",~значение," - ",~значение," в ",~Hashtable,"."
5701:_SaveItemPoolHandleBJ_Parameters="Сохранить ",~резервный предмет," как ",~значение," - ",~значение," в ",~Hashtable,"."
5707:_SaveQuestHandleBJ_Parameters="Сохранить ",~задание," как ",~значение," - ",~значение," в ",~Hashtable,"."
5713:_SaveQuestItemHandleBJ_Parameters="Сохранить ",~требование задания," как ",~значение," - ",~значение," в ",~Hashtable,"."
5719:_SaveDefeatConditionHandleBJ_Parameters="Сохранить ",~условие поражения," как ",~значение," - ",~значение," в ",~Hashtable,"."
5725:_SaveTimerDialogHandleBJ_Parameters="Сохранить ",~таймер диалога," как ",~значение," - ",~значение," в ",~Hashtable,"."
5731:_SaveLeaderboardHandleBJ_Parameters="Сохранить ",~таблицу рекордов," как ",~значение," - ",~значение," в ",~Hashtable,"."
5737:_SaveMultiboardHandleBJ_Parameters="Сохранить ",~статистическую таблицу," как ",~значение," - ",~значение," в ",~Hashtable,"."
5743:_SaveMultiboardItemHandleBJ_Parameters="Сохранить ",~элемент из статистической таблицы," как ",~значение," - ",~значение," в ",~Hashtable,"."
5749:_SaveTrackableHandleBJ_Parameters="Сохранить ",~трекэбл," как ",~значение," - ",~значение," в ",~Hashtable,"."
5755:_SaveGameCacheHandleBJ_Parameters="Сохранить ",~кэш игры," как ",~значение," - ",~значение," в ",~Hashtable,"."
5761:_SaveDialogHandleBJ_Parameters="Сохранить ",~диалог," как ",~значение," - ",~значение," в ",~Hashtable,"."
5767:_SaveButtonHandleBJ_Parameters="Сохранить ",~кнопку диалога," как ",~значение," - ",~значение," в ",~Hashtable,"."
5781:_SaveTextTagHandleBJ_Parameters="Сохранить ",~текстовый тег," как ",~значение," - ",~значение," в ",~Hashtable,"."
5787:_SaveLightningHandleBJ_Parameters="Сохранить ",~молнию," как ",~значение," - ",~значение," в ",~Hashtable,"."
5793:_SaveImageHandleBJ_Parameters="Сохранить ",~изображение," как ",~значение," - ",~значение," в ",~Hashtable,"."
5799:_SaveUbersplatHandleBJ_Parameters="Сохранить ",~текстуру земли," как ",~значение," - ",~значение," в ",~Hashtable,"."
5805:_SaveFogStateHandleBJ_Parameters="Сохранить ",~туман войны," как ",~значение," - ",~значение," в ",~Hashtable,"."
5811:_SaveFogModifierHandleBJ_Parameters="Сохранить ",~видимость," как ",~значение," - ",~значение," в ",~Hashtable,"."
5888:_SuspendHeroXPBJ_Parameters=~Включить/Выключить," получение опыта для ",~Hero
6084:_SetImageConstantHeight_Parameters="Изменить высоту ",~Image,", который ",~Включить/Отключить," на ",~Height
6102:_SetImageRender_Parameters="Изменить ",~Image,": ",~Включить/Отключить," прорисовку"
6108:_SetImageRenderAlways_Parameters="Изменить ",~Image,": ",~Включить/Отключить," постоянную прорисовку"
6114:_SetImageAboveWater_Parameters="Изменить ",~Image,": ",~Включить/Отключить," над водой, ",~Включить/Отключить," прозрачность от воды"
6306:_CreateMultiboardBJ_Parameters="Создать статистическую таблицу с ",~Columns," колонками и ",~Rows," рядами, под названием ",~название,"."
6343:_MultiboardSetTitleText_Parameters="Изменить название ",~Multiboard," на ",~название
6378:_MultiboardSetItemValueBJ_Parameters="Изменить текст ",~Multiboard," ячейки в ",~Column," колонке, в ",~Row," ряду на текст ",~текст
6427:_WaygateActivateBJ_Parameters=~Enable/Disable," ",~портал
6433:_WaygateSetDestinationLocBJ_Parameters="Определить для ",~портала," место назначения ",~Target
6445:_UnitSetUsesAltIconBJ_Parameters="Переключить специальную иконку мини-карты ",~On/Off," для ",~нейтральное здание
6551:_EnableCreepSleepBJ_Parameters=~Включить/Выключить," сон для всех нейтрально-враждебных"
6569:_SetPlayerAbilityAvailableBJ_Parameters=~Включить/Выключить," ",~Ability," для ",~Player
6649:_CreateCommandButtonEffectBJ_Parameters="Создать кнопку способности для ",~способность," и ",~приказ
6655:_CreateTrainCommandButtonEffectBJ_Parameters="Создать кнопку найма для ",~боевой единицы
6661:_CreateBuildCommandButtonEffectBJ_Parameters="Создать кнопку строительства для ",~здания
6667:_CreateUpgradeCommandButtonEffectBJ_Parameters="Создать кнопку исследования для ",~исследования
6673:_CreateLearnCommandButtonEffectBJ_Parameters="Создать кнопку изучения для ",~способности
6679:_CreateCommonCommandButtonEffectBJ_Parameters="Создать кнопку приказа для ",~приказа
6685:_DestroyCommandButtonEffect_Parameters="Уничтожить кнопку ",~кнопку
8228:_IssueTrainOrderByIdBJ_Parameters="Приказать ",~зданию," нанять ",~боевую единицу,"
8234:_IssueUpgradeOrderByIdBJ_Parameters="Приказать ",~зданию," провести исследование ",~Tech-Type
8240:_IssueBuildOrderByIdLocBJ_Parameters="Приказать ",~рабочему," построить ",~Unit-Type," в ",~Point
8384:_CreateUbersplatBJ_Parameters="Создать ",~Location," тип ",~Type," с цветом (",~Red,"%, ",~Green,"%, ",~Blue,"%) и ",~Transparency,"% прозрачностью (",~Включить/Отключить," неподвижность, ",~Enble/Disable," пропуск времени появления)"
8414:_SetUbersplatRender_Parameters=~Ubersplat,": ",~Включить/Отключить," прорисовку"
8420:_SetUbersplatRenderAlways_Parameters=~Ubersplat,": ",~Включить/Отключить," постоянную прорисовку"
11673:_GetOwningPlayer_Parameters="Владелец ",~боевой единицы
11679:_GetItemPlayer_Parameters="Владелец ",~предмета
11685:_ForcePickRandomPlayer_Parameters="Случайный игрок из ",~группы игроков
Список можно создать тебе самому, команды ripgrep или grep: rg '~[^A-Za-z0-9]' 'путь/к/файлу'
строка 4715 оставлена декларация функции "function PlayDialogueFromSpeakerTypeEx ..." -- надо убрать. Вообще лучше сразу // комментарием вставлять, чтобы случайно проблем не возникло.
строка 11004 по ошибке две двойных скобки, хватит и по одной с каждой стороны ^_^:
И можно исправить уже предшествующие ошибки Близзардов:
_BlzGetAbilityRealLevelField_Limites должно называться "Limits"
У следующих триггеров дважды встречается поле _Defaults, хотя по логике второе из них (где вдвое больше параметров) на самом деле является _Limits:
_TriggerRegisterUnitInRangeSimple_Defaults
_SetTimeOfDayScalePercentBJ_Defaults
_SetUnitLifeBJ_Defaults
_BlzSetAbilityIntegerLevelFieldBJ_Defaults
_CreateFogModifierRadiusLocBJ_Defaults
_BlzSetAbilityIntegerLevelField_Defaults
И надеюсь, ты вовремя заметил, что строки не оканчивающиеся на ...Hint в TriggerStrings.txt на самом деле ничего не делают (и в точности повторяют те из triggerdata.txt). Но их проредили только в версии 1.36 и теперь их там нет. Я не знаю, для чего они там были, видимо, для упрощения жизни переводчикам?
Спасибо за перевод, скоро что-то будет! Желаю мира и добра!
rawcode: оно в формате в самом деле не используется. То к какому юниту относится эта часть данных видно в самом конце (обращай внимание на иерархию таблиц):
Ну вот что мне с тобой, заклятым виндузятником, делать? Винда тебе при сохранении через pipe кодировку ломает на UTF-16 LE и тексту конец (сравнение в пред. скриншоте):
Делать-то я знаю что, придется делать опцию --output для особо одаренных систем...
Все оказалось куда проще, чем я думала. (PS: rsfghd уже это же и написал, но ты его не понял)
В первом варианте у тебя "Units in range matching condition", к ней подсказка
Use 'Matching Unit' to refer to the unit on whom the comparison is being performed.
А ты использовал (Picked unit)! Почему так нельзя? Потому что, matching condition = значит там Filter внутри, а внутри фильтра используется функция GetFilterUnit т.е. (matching unit).
из triggerstrings.txt:
GetEnumUnitHint="When using the 'Pick Every Unit...' action, this refers to each unit as it is picked."
GetFilterUnitHint="Use this to refer to the unit being considered for 'Units Matching Condition' functions."
А вот (Picked unit) можно использовать, когда просто есть проход по группе, как в твоем втором варианте.
Я тут вытащила код триггера из карты из war3map.j
Сгенерированный код триггера
=========================================================================== Trigger: IshillUltimte ===========================================================================
function Trig_IshillUltimte_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A001' ) ) then
return false
endif
return true
endfunction
function Trig_IshillUltimte_Func002Func001Func002C takes nothing returns boolean
if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_STRUCTURE) == false ) ) then
return false
endif
if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_GROUND) == true ) ) then
return false
endif
if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_MAGIC_IMMUNE) == false ) ) then
return false
endif
if ( not ( IsUnitAlly(GetEnumUnit(), GetOwningPlayer(GetSpellAbilityUnit())) == false ) ) then
return false
endif
if ( not ( IsUnitEnemy(GetEnumUnit(), GetOwningPlayer(GetSpellAbilityUnit())) == true ) ) then
return false
endif
if ( not ( GetOwningPlayer(GetEnumUnit()) != GetOwningPlayer(GetSpellAbilityUnit()) ) ) then
return false
endif
return true
endfunction
function Trig_IshillUltimte_Func002Func001C takes nothing returns boolean
if ( not Trig_IshillUltimte_Func002Func001Func002C() ) then
return false
endif
return true
endfunction
function Trig_IshillUltimte_Func002A takes nothing returns nothing
if ( Trig_IshillUltimte_Func002Func001C() ) then
call GroupAddUnitSimple( GetEnumUnit(), udg_UltimateIshillEffect )
else
endif
endfunction
function Trig_IshillUltimte_Actions takes nothing returns nothing
call QuestMessageBJ( GetPlayersAll(), bj_QUESTMESSAGE_UPDATED, "TRIGSTR_019" )
call ForGroupBJ( GetUnitsInRangeOfLocAll(600.00, GetUnitLoc(GetSpellAbilityUnit())), function Trig_IshillUltimte_Func002A )
call ForGroupBJ( udg_UltimateIshillEffect, function Trig_IshillUltimte_Func003A )
call TriggerSleepAction( 20.00 )
call ForGroupBJ( udg_UltimateIshillEffect, function Trig_IshillUltimte_Func005A )
call GroupClear( udg_UltimateIshillEffect )
endfunction
===========================================================================
function InitTrig_IshillUltimte takes nothing returns nothing
set gg_trg_IshillUltimte = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_IshillUltimte, EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerAddCondition( gg_trg_IshillUltimte, Condition( function Trig_IshillUltimte_Conditions ) )
call TriggerAddAction( gg_trg_IshillUltimte, function Trig_IshillUltimte_Actions )
endfunction
Маленькие оптимизации:
IsUnitAlly+GetOwningPlayer(GetSpellAbilityUnit()) и IsUnitEnemy по идее взаимоисключающие, хватило бы только IsUnitEnemy(...)
call ForGroupBJ( GetUnitsInRangeOfLocAll(600.00, GetUnitLoc(GetSpellAbilityUnit())), function Trig_IshillUltimte_Func002A )
Тут утечка локации, потому что GetUnitLoc создает новую, но она потом не удаляется. Решение в ГУИ: записать GetUnitLoc в глобальную (или локальную) переменную, пройтись по группе, и удалить локацию (DestroyLocation).
Проблема: у тебя, как называется в местном жаргоне, триггер не MUI. То есть он работает только с одним юнитом одновременно, если два юнита используют заклинание, то оно сломается.
Посмотри на Trig_IshillUltimte_Actions. Ты там используешь udg_UltimateIshillEffect до засыпания на 20с и после. Что будет если в этот промежуток времени кто-нибудь снова вызовет триггер? Ацская сотона. Я не знаю как принято, но по-моему единственный выход - это локально создать группу, чтобы она у кастующего юнита была своя, а в конце триггера её удалять.
Прочитай пару туториалов про локальные переменные и утечки. Если не прозреешь - перепишу всё на кастомный код за тебя, чтобы как пример был наглядный.
Старая идея, но покою не дает и мне :)
Про 1.32 остается подтвердить: каждый preload файл загружается только ЕДИНОЖДЫ за карту.
1.33, если кто еще не в курсе и будет читать, сломал у прелоадов все, что только можно. Файл загружается ЕДИНОЖДЫ за все время запуска игры. Поэтому автоматический save/load не работает - он на каждом старте карты ожидал обновленные данные из preload.
Впрочем, и то и другое обходится одним путем: при каждом сохранении генерировать другое имя файла, допустим codefile_version_123 - и карта будет подгружать версию 123. После следующего сохранения _124 и т.п. Со стороны карты решается например горячей клавишей, по которой увеличивается версия и грузится последний файл. Осталось эту идею только воплотить.
что для макоюзера вызывает отторжение ибо CTRL там редко используется.
Ну тут же очевидно, что "общепринятое" будет отличаться для разных платформ. Мой пример - это когда в одной программе клавиша CTRL+Y, а в другой рядом же CTRL+SHIFT+Z для отмены отката.
а цвет близкий к фону, но чётко отделяющий блоки друг от друга.
Но у тебя в примере разделяется список на переднем плане, тогда и цвет линии должен основываться не на заднем фоне, а на переднем. В этом плане у линии цвет не ближе к заднему фону, а дальше от него, но она и слишком сильно от переднего отличается. С другой стороны, если делать линию полностью прозрачной (равна цвету заднего фона), то, по идее, можно добиться эффекта погружения (immersive).
А подсветка кода мне совсем не понравилась. Я давным-давно подогнала тему Obsidian в N++ под себя и с тех пор все остальные какие-то бесконтрастные, как и на сайте. Обычный текст (например переменные) должны больше отличаться от фона, у меня они почти белые, а не серые как у генератора.
ScorpioT1000 так по-моему в той же аське, скайпе Enter можно было переназначать. Если с кого и пошла мода на Enter=отправить, то с них.
Логика у меня простая: если однополосный ввод, то Enter=Отправить. Если большая форма ввода, то Enter=новая строка. С другой стороны это и есть на модальность, которой следует избегать в интерфейсах. Тем, кто чуть-чуть далеки от компьютера, эта логика не дается, потому что мало опыта.
Возьмём элентарное. Enter перенос строки, CTRL+Enter всегда верно?
Пишу не глядя: с тех пор как узнала, что на Facebook (в своё время) SHIFT+Enter = новая строка, а Ctrl+Enter = однозначно отправить, - то да. Enter = по усмотрению/настройкам. Теперь добавлю сноску, что я пользователь IBM-compatible PC, потому что спрашиваешь ты не просто так :D
Насчет линий не понятно (смотрю с телефона если что). Можно начать с другой стороны, какой критерий инородности? Объективный по цвету/контрасту или на глаз? А если на глаз, то какая цель и какие ограничения? Допустим, выбранный цвет не должен быть близким к внутреннему или внешнему фону.
ScorpioT1000 хорошо, спасибо. Но тогда это не метки, а категории. Ибо категории ∈ теги.
То что неряшливо смотрится - я согласна, но в целом, как пошаговое руководство, ни у кого не должно возникнуть проблем. Тем более, что тут в самом деле нужно было собрать несколько источников воедино, чтобы разобраться и использовать:
Buildconfigs
Использование blizzget, проблемы с ним
Запуск игры с -launch
Не ну конечно можно из каждого пункта делать отдельную статью, только они по отдельности практически бесполезны. (да, не юникс-вейно) Как минимум потому, что альтернатив нет. Да и тут интерес это примерно околонулевая группа пользователей таких как я, Firstrun70 и Unryze, которым может понадобиться копаться в разных версиях. Большинству хватит сборки Богдана, поэтому она вынесена вверх.
Мил человек, как тебе может быть что-либо интересно, если ты даже первых двух параграфов не прочитал? Эльрат Просто скачивает старые/любые релизы игры (из новых). Для обладателей лицензии - сразу могут запускать и играть, в обход лаунчера (ну почти, внутриигровую сессию надо поддерживать, т.е. в игре в аккаунт зайти). Без лицензии - просто в файлах поковыряться.
Это вообще ко мне? Я-то не дизайнер, расписать почему мне нужен бюджет в несколько миллионов на реализацию безумно важного и неотложного собственного шрифта я не умею 😅 Ровно как и то, почему именно я считаю тот или иной подход к структурированию и дизайну наиболее эргономичным. Хотя в книге Раскина Интерфейс по-человечески нашла много откликов. и нет, книгу не рекомендую, хотя там важные моменты есть, которые нашли у меня отклик. писал он её почти как научную статью и буквально зад... свой Canon Cat. Который за пределы одно-функционного компьютера по определению уйти не мог. Половина его рассуждений применимо к этому компьютеру только как редактору текста, для многофункциональной, многопрограммной парадигмы половина книги устарела так же как парусник по сравнению с пароходом.
Выбор хоткеев видел только в мануалах от JetBrains, остальные вообще свято уверены, что кроме WIN больше не существует десктопных ОС.
Ввиду-то я имела другое, но понимаю боль. Это как разница между переводом и локализацией, в которой не только надо перевести (читай, портировать), но и в нужных местах подогнать. Но даже тут пример есть. До Windows в качестве комбинации копирования (и сейчас в терминалах) использовались Ctrl+Insert, Shift+Insert. Пришел Windows, стало CTRL+C, CTRL+V. Стоило ли перенимать и добавлять виндовые клавиши? Я думаю да. Но использовать в приложениях Super/Win-Key это вообще дикость. (Хотя я мечтаю о клавишах F13-F24 и хотела бы еще один модификатор типа CTRL в добавок, только под себя)
Биндить за игрока на цифры плохая идея. На цифрах висят бинды на группы юнитов по дефолту.
В Рефе потом еще учитывать надо, что у некоторых Grid Keys включены (все абилки на трех рядах qwer, asdf, zxcv висят).
Если уж на то пошло, забиндить Numpad на мыше, или наоборот, использовать в CustomKeys мышиные кнопки типа нажатия колесика, browser back/forward на использование первых слотов.
С большинством не согласен, но есть часть годных вещей.
Потому что мой идеальный UI design - это примерно Windows Classic, самое главное в нем четкое выделения интерактивных кнопок, также четко-размеченное логическое разделение областей.
Маркдауна не будет - он не покрывает и 30% функций.
Тебе как давнишнему пользователю txt2 знаком. Мне как стороннему пользователю и разработчику, которая параллельно публикует на Github - txt2 -без словаря- мануала на втором мониторе даже комментарий не сверстать. Хоть Markdown я и сама ненавижу, но для простых текстов он хорошо подходит. А там где его функционала не хватает - пусть дальше пользуются txt2.
Цветные кнопки - вообще что-то из 2012, как раз уходить от этого надо
Цветные кнопки - отличная зацепка для глаза. И красиво не значит удобно. Вот мне нравится, что главная кнопка Send выделяется цветом. Не надо глазом ничего искать. Туда же искоренение иконок ото всюду. Вы видели контекстное меню в новом Скайпе (без иконок)? Давным-давно там были пиктограммы. И не надо было ЧИТАТЬ каждый пункт, чтобы найти нужный.
К базовым элементам пользователь уже привык и знает, как чем пользоваться. Тут как добавлять свой вариант горячей клавиши в программу, потому что "он удобнее", тогда как все используют общепринятый, выученный "неудобный" вариант. И до тех пор, пока твоё нововведение не станет превалировать - именно оно и будет неудобным, непонятным пользователю.
Про запутанность меню ничего не говорю, там все ужасно, если лезть дальше прокрутки ленты.
Язык запечен в карты, т.е. тебе придется и все карты тоже выкачивать. А обычные файлы локализации тебе только меню переведут. Проще через blizzget скачать русскую версию и на нее накатить старую озвучку.
В игре какой-то баг, ACCESS_VIOLATION от тебя не зависит. Ну то есть, карта может его и вызывает, но быть такого не должно. Разве что на более старых версиях попробывать поиграть, может в 1.33 что-то эдакое добавили. Сомневаюсь, что у кого-то есть желание лезть в код 1.33, тот десяток человек, кто работают с дисассемблированным варом, все новые версии из-за защит стараются избегать.
6.7. Функция rawequal без введения в метатаблицы тут вообще не к месту. Лучше убрать.
6.9. "Хотя 3 уже подразумевает это: если вы исходите из других языков, помните, что 0, а, пустая строка считается как true в условных контекстах в Lua." - может "что 0 и пустая строка"?
Таблицы истинности, а не правды. Далее: "Как вы можете видеть," вообще-то "Как видите", без кальки с английского 😤
require делается через эту систему сборки github.com/ceres-wc3/ceres наример. Есть ещё какая-то китайская на гитхабе. В самой игре - лучшее, что можно сделать, это через прелоад файлы. И то, им нельзя быть чистыми Луа скриптами, а иметь специально написанные комментарии, чтобы Lua-код преобразование через jass2lua пережил.
Короче говоря, нету require в WC3, работы с файлами у карт тоже нет. То что есть - новичкам не по зубам.
Так а сам .w3a файл и т. п. ничем не защищаются и не портятся. Я конечно могу на скорую руку набросать программу для текстового редактирования... Ты карту отдельными файлами редактируешь чтоли? Чтобы карта снова открывалась обычно много ума не надо. Архив MPQ новый создать и файлы туда перенести. В файле регионов обычно херь прописывается, т.е. его пустым заменить надо (все регионы в war3map.j конвертируются).
А там уже можно будет нормально редактором пользоваться.
dofile объясняется, только его в WC3 нет. Как и require, если не программировать под какую-нибудь систему сборки карт. Как минимум напомнить об этом надо.
» WarCraft 3 / Русификатор редактора карт Warcraft 3 Reforged
Что делает редактор в этом случае? Не уверена насчет проблем с наполнением списка в меню и поиском, но как минимум редактор скатывается в англоязычный файл. То ли встроен где-то, то ли как.
Кэш-игры: Восстановить угол поворота боевой единицы
_RestoreUnitLocFacingAngleBJ_Parameters="Восстановить ",~Label," ",~Category," из ",~Game Cache," для ",~Player," в ",~Location," поворот ",~Angle
Хэш-таблица: Save Gamecache Handle
_SaveGameCacheHandleBJ_Parameters="Сохранить ",~кэш игры," как ",~значение," - ",~значение," в ",~Hashtable,"."
Отредактирован Lasto4ka
» WarCraft 3 / Русификатор редактора карт Warcraft 3 Reforged
» WarCraft 3 / Warcraft 3 Custom Object Converter
» WarCraft 3 / Warcraft 3 Custom Object Converter
» WarCraft 3 / Странности условиях триггеров
Отредактирован Lasto4ka
» WarCraft 3 / Странности условиях триггеров
Trigger: IshillUltimte
===========================================================================
function Trig_IshillUltimte_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A001' ) ) then
return false
endif
return true
endfunction
if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_STRUCTURE) == false ) ) then
return false
endif
if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_GROUND) == true ) ) then
return false
endif
if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_MAGIC_IMMUNE) == false ) ) then
return false
endif
if ( not ( IsUnitAlly(GetEnumUnit(), GetOwningPlayer(GetSpellAbilityUnit())) == false ) ) then
return false
endif
if ( not ( IsUnitEnemy(GetEnumUnit(), GetOwningPlayer(GetSpellAbilityUnit())) == true ) ) then
return false
endif
if ( not ( GetOwningPlayer(GetEnumUnit()) != GetOwningPlayer(GetSpellAbilityUnit()) ) ) then
return false
endif
return true
endfunction
if ( not Trig_IshillUltimte_Func002Func001Func002C() ) then
return false
endif
return true
endfunction
if ( Trig_IshillUltimte_Func002Func001C() ) then
call GroupAddUnitSimple( GetEnumUnit(), udg_UltimateIshillEffect )
else
endif
endfunction
call EnableTrigger( gg_trg_IshillPoison )
call UnitAddAbilityBJ( 'A000', GetEnumUnit() )
endfunction
call DisableTrigger( gg_trg_IshillPoison )
call UnitRemoveAbilityBJ( 'A000', GetEnumUnit() )
endfunction
call QuestMessageBJ( GetPlayersAll(), bj_QUESTMESSAGE_UPDATED, "TRIGSTR_019" )
call ForGroupBJ( GetUnitsInRangeOfLocAll(600.00, GetUnitLoc(GetSpellAbilityUnit())), function Trig_IshillUltimte_Func002A )
call ForGroupBJ( udg_UltimateIshillEffect, function Trig_IshillUltimte_Func003A )
call TriggerSleepAction( 20.00 )
call ForGroupBJ( udg_UltimateIshillEffect, function Trig_IshillUltimte_Func005A )
call GroupClear( udg_UltimateIshillEffect )
endfunction
function InitTrig_IshillUltimte takes nothing returns nothing
set gg_trg_IshillUltimte = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_IshillUltimte, EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerAddCondition( gg_trg_IshillUltimte, Condition( function Trig_IshillUltimte_Conditions ) )
call TriggerAddAction( gg_trg_IshillUltimte, function Trig_IshillUltimte_Actions )
endfunction
Посмотри на Trig_IshillUltimte_Actions. Ты там используешь udg_UltimateIshillEffect до засыпания на 20с и после. Что будет если в этот промежуток времени кто-нибудь снова вызовет триггер? Ацская сотона. Я не знаю как принято, но по-моему единственный выход - это локально создать группу, чтобы она у кастующего юнита была своя, а в конце триггера её удалять.
» WarCraft 3 / Preload Reforged
Про 1.32 остается подтвердить: каждый preload файл загружается только ЕДИНОЖДЫ за карту.
1.33, если кто еще не в курсе и будет читать, сломал у прелоадов все, что только можно. Файл загружается ЕДИНОЖДЫ за все время запуска игры. Поэтому автоматический save/load не работает - он на каждом старте карты ожидал обновленные данные из preload.
» Администрация XGM / UX сайта xgm и о новых пользователях
А подсветка кода мне совсем не понравилась. Я давным-давно подогнала тему Obsidian в N++ под себя и с тех пор все остальные какие-то бесконтрастные, как и на сайте. Обычный текст (например переменные) должны больше отличаться от фона, у меня они почти белые, а не серые как у генератора.
Логика у меня простая: если однополосный ввод, то Enter=Отправить. Если большая форма ввода, то Enter=новая строка. С другой стороны это и есть на модальность, которой следует избегать в интерфейсах. Тем, кто чуть-чуть далеки от компьютера, эта логика не дается, потому что мало опыта.
» Администрация XGM / UX сайта xgm и о новых пользователях
» WarCraft 3 / Скачиваем старые и тестовые релизы игры с blizzget
То что неряшливо смотрится - я согласна, но в целом, как пошаговое руководство, ни у кого не должно возникнуть проблем. Тем более, что тут в самом деле нужно было собрать несколько источников воедино, чтобы разобраться и использовать:
Отредактирован Lasto4ka
» XGM Team / Stage 13 и Хэллоуин
» WarCraft 3 / Скачиваем старые и тестовые релизы игры с blizzget
» Администрация XGM / UX сайта xgm и о новых пользователях
» WarCraft 3 / Warcraft 3 Custom Object Converter
» WarCraft 3 / Как забиндить предметы?
В Рефе потом еще учитывать надо, что у некоторых Grid Keys включены (все абилки на трех рядах qwer, asdf, zxcv висят).
» Администрация XGM / UX сайта xgm и о новых пользователях
Про запутанность меню ничего не говорю, там все ужасно, если лезть дальше прокрутки ленты.
» Администрация XGM / UX сайта xgm и о новых пользователях
» WarCraft 3 / Как выбрать язык игры и редактора
Отредактирован Lasto4ka
» WarCraft 3 / Почему вылетает карта (Reforget)
Скачать старые версии вара www.hiveworkshop.com/threads/how-to-use-blizzget-to-download-off...
» WarCraft 3 / Как открыть и изменить файл формата .w3a не в WE?
» WarCraft 3 / 6. Логические выражения.
» WarCraft 3 / 4. Несколько полезных базовых функций Lua.
» WarCraft 3 / Как открыть и изменить файл формата .w3a не в WE?
А там уже можно будет нормально редактором пользоваться.
Отредактирован Lasto4ka
» WarCraft 3 / 6. Логические выражения.
Отредактирован Lasto4ka
» WarCraft 3 / 4. Несколько полезных базовых функций Lua.