Недавно kirlandiya сообщил, что выбранная сложность пользовательской кампании сбивается в следующей главе на стандарт. Проверил и выяснил, что проблема с действием Игра - 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).
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
13
6 лет назад
Отредактирован Пушистый
0
Если запускаемая сложность главы отличается от стандартной, то оставить так, как есть, а если нет - то попытаться считать то, что было записано в предыдущей главе (если не записано - сбросить к стандартной).
Вообще, сама функция не запускает уровень с какой-то сложностью. Она просто задает значение глобальной переменной:
Код функции
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).
Принятый ответ
0
26
6 лет назад
0
prog, ещё в процессе, так как многими способами проверяю. Но похоже, что не имеет значения нажмёшь ли Продолжить или Завершить главу, всё равно действия выполнятся.
Пушистый:
Если запускаемая сложность главы отличается от стандартной, то оставить так, как есть, а если нет - то попытаться считать то, что было записано в предыдущей главе (если не записано - сбросить к стандартной).
В оффтопе указал, почему это не вариант.
А вот про переписывание функции очень интересно, в jass почти не шарю, но как понял, нужно удалить эту строчку:
call SetGameDifficulty(GetDefaultDifficulty())
И где её искать? И что за дефайн ради удобства?
0
13
6 лет назад
Отредактирован Пушистый
0
8gabriel8, дефайн нужен для того, чтобы вызывать псевдофункцию для оглашения победы для конкретного игрока. Просто работа будет ровно такая же с GUI, но подразумеваться будет другая функция (без сброса сложности игры).
Можно и без него, но тогда использовать CustomScript (либо чистый код).
0
26
6 лет назад
0
Пушистый, прописывать define надо в нестандартном коде каждой карты? Есть вариант прописать лишь один раз для всей кампании в каком-то файле, если открыть кампанию MPQ редактором?
0
13
6 лет назад
0
8gabriel8, для всей кампании - вряд ли, потому что каждая карта обладает своим кодом. Просто копировать код в отдельный пустой триггер в качестве библиотеки или же прописывать в шапку карты переделанные функции с дефайном (главное, переделать все, чтобы и связующие были переделаны). Дефайн ведь не действует на то, что находится в Blizzard.j. Можно проще - импортировать Blizzard.j (свой) в кампанию с убранной строчкой о сложности.
0
24
6 лет назад
Отредактирован prog
0
BJ-функции - зло, ничего нового...
ИМХО, правильное решение - вызывать переход между картами через jass, кастом скриптом, минуя гуишные команды завершения игры.
0
26
6 лет назад
0
prog, мы с Пушистым сделали define для функции, но в будущем теоретически возможны трудности с компиляцией карты для кампании. Если будут, то да, буду строить диалог завершения игры.
0
13
6 лет назад
Отредактирован Пушистый
0
Либо всю ту кастомную поделку вызывать через личный сценарий и не заморачиваться с компиляцией, так как так уйдет дефайн и библиотека.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.