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



 
                    
                
Ред. prog
Ред. Пушистый
Пушистый: В оффтопе указал, почему это не вариант.
А вот про переписывание функции очень интересно, в jass почти не шарю, но как понял, нужно удалить эту строчку:
Ред. Пушистый
Ред. prog
ИМХО, правильное решение - вызывать переход между картами через jass, кастом скриптом, минуя гуишные команды завершения игры.