Недавно kirlandiya сообщил, что выбранная сложность пользовательской кампании сбивается в следующей главе на стандарт. Проверил и выяснил, что проблема с действием Игра - Set Next Level, оно запускает следующую карту со стандартной сложностью, а не выбранной.
Можно ли отловить нажатие кнопки главы с экрана кампании, либо отловить срабатывание действия Игра - Set Next Level?
Если интересно, то уже продумывал варианты:
Можно ли отловить нажатие кнопки главы с экрана кампании, либо отловить срабатывание действия Игра - Set Next Level?
Если интересно, то уже продумывал варианты:
- Конечно, можно было бы просто записывать в первой карте сложность в кэш и в остальных картах считывать её оттуда. Но это очень неудобно, если, например, игрок выберет Высокую сложность, но в последней или любой другой главе решит её понизить, всю игру придётся на меньшей сложности проходить ради последней главы.
- Ещё можно сверять сложность в каждой главе, совпадает ли со значением сложности в кэше предыдущей главы. Но опять же упирается в описанную выше проблему, что не получится так в одну главу по выбору на средней сложности поиграть, если предыдущую проходил на другой.
- Можно просто убрать действие Игра - Set Next Level, игрока после победы будет выкидывать на экран кампании, где он будет нажимать новую кнопку. В таком случае сложность не будет сбиваться. Но это не очень красиво, когда на экран выкидывает после каждой главы. Хотя пока самый подходящий вариант.
- Можно при инициализации карты игроку выводить диалог с выбором сложности. Но это хуже предыдущего варианта. Большинству игроков лучше один раз выбрать, чем каждый раз в новой главе на этот вопрос отвечать.
Принятый ответ
Если запускаемая сложность главы отличается от стандартной, то оставить так, как есть, а если нет - то попытаться считать то, что было записано в предыдущей главе (если не записано - сбросить к стандартной).
Вообще, сама функция не запускает уровень с какой-то сложностью. Она просто задает значение глобальной переменной:
Код функции
function SetNextLevelBJ takes string nextLevel returns nothing
if (nextLevel == "") then
set bj_changeLevelMapName = null
else
set bj_changeLevelMapName = nextLevel
endif
endfunction
Если копать глубже, то вся проблема здесь:
Код функций
function CustomVictoryOkBJ takes nothing returns nothing
if bj_isSinglePlayer then
call PauseGame( false )
// Bump the difficulty back up to the default.
call SetGameDifficulty(GetDefaultDifficulty())
endif
if (bj_changeLevelMapName == null) then
call EndGame( bj_changeLevelShowScores )
else
call ChangeLevel( bj_changeLevelMapName, bj_changeLevelShowScores )
endif
endfunction
function CustomVictoryQuitBJ takes nothing returns nothing
if bj_isSinglePlayer then
call PauseGame( false )
// Bump the difficulty back up to the default.
call SetGameDifficulty(GetDefaultDifficulty())
endif
call EndGame( bj_changeLevelShowScores )
endfunction
Если интересно, откуда все это берется, то нужно посмотреть устройство функции CustomVictoryBJ и все вызовы, следующие из нее.
Чтобы править проблему без создания костылей на кэше, то придется переписать близовскую функцию под себя (без сбрасывания сложности), а потом использовать ее вместо оригинальной в своей кампании (удобства ради можно использовать дефайн на cJass).
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Пушистый
Пушистый: В оффтопе указал, почему это не вариант.
А вот про переписывание функции очень интересно, в jass почти не шарю, но как понял, нужно удалить эту строчку:
Отредактирован Пушистый
Отредактирован prog
ИМХО, правильное решение - вызывать переход между картами через jass, кастом скриптом, минуя гуишные команды завершения игры.
Отредактирован Пушистый