Вис691 Автор темы 663 Опубликовано 9 ноября, 2017 Я бы весь функционал в GameMode вынес. А в MenuMode просто бы флаг менял. А дальше уже сверяем наше предыдущее количество предметов с текущим. Если они разнятся, значит игрок что-то скрафтил. Обновляем предыдущее значение и начисляем опыт. Ну и флаг сбрасываем, когда закончили. Поделиться сообщением Ссылка на сообщение
Old Vault Boy 560 Опубликовано 11 ноября, 2017 А как реализовать переменную флаг? Как это выглядит технически? Скрипт начинается с формы Begin GameMode, а как это увязать с MenuMode? Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 11 ноября, 2017 Цитата из первого поста 3) Дальше идёт основная часть скрипта. Блоки, начинающиеся на Begin и заканчивающиеся на End. Типы блоков бывают разными, но основные GameMode и MenuMode. Первый работает во время игры, второй - в каком-либо меню (пип-бой, окно бартера, контейнер и т.д.). В одном скрипте можно использовать несколько блоков одновременно. Подробнее тут Begin GameMode // какие-то команды end Begin MenuMode // ещё команды end Поделиться сообщением Ссылка на сообщение
Old Vault Boy 560 Опубликовано 11 ноября, 2017 В одном скрипте можно использовать несколько блоков одновременно. Подробнее тут Это из той оперы, где я смотрю в книгу и вижу фигу. Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 11 ноября, 2017 А что конкретно не понятно? Делаешь 2 блока в скрипте. В одном переменную увеличиваешь на 1, в другом делаешь проверку, а потом понижаешь. Поделиться сообщением Ссылка на сообщение
Old Vault Boy 560 Опубликовано 11 ноября, 2017 А переменную к функции привязывать? scn CraftingRewardXP Int iFlag; переменная флаг Int iPreviousValue; предыдущее значение Int iCurrentValue; текущее значение Begin GameMode Set iFlag to (MenuMode 1077) Set iPreviousValue to (GetPCMiscStat "Items Crafted") Let iCurrentValue := 1 Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 11 ноября, 2017 Ой, ой, ой, так нельзя. Он же даже не сохранится. Я специально про 2 блока написал. Begin MenuMode 1077 Let iFlag := 1 End Begin GameMode If iFlag ... Let iFlag := 0 Endif End Поделиться сообщением Ссылка на сообщение
Old Vault Boy 560 Опубликовано 12 ноября, 2017 scn CraftingRewardXP Int iFlag; переменная флаг Int iPreviousValue; предыдущее значение Int iCurrentValue; текущее значение Int iCraftXP Begin MenuMode 1077 Let iFlag := 1 End Begin GameMode If iFlag Let iPreviousValue := ? Let iCurrentValue := ? Let iCraftXP:= (iCurrentValue - iPreviousValue) If iCurrentValue > iPreviousValue Player.RewardXP iCraftXP Let iFlag := 0 Endif Endif End А как отследить значения изготовленных предметов? Понятно, что за это отвечает функция GetPCMiscStat "Items Crafted". Если функция показывает предыдущее значение, то как выставить текущее? Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 12 ноября, 2017 Не надо каждую новую строчку табулировать. Это делается только, когда новый блок появляется. Например, if/endif. А всё что внутри него должно быть с одинаковым отступом. If ... Команда 1 Команда 2 If ... Команда 3 Endif Endif Как можно видеть каждый Endif находится ровно под своим If'ом. Удобно, не правда ли? А как отследить значения изготовленных предметов? Понятно, что за это отвечает функция GetPCMiscStat "Items Crafted". Если функция показывает предыдущее значение, то как выставить текущее? Она как раз таки текущее и показывает. Но ведь наша переменная не поменяется, пока строка на изменение переменной вновь не выполнится, правильно? Поделиться сообщением Ссылка на сообщение
Паха007 545 Опубликовано 12 ноября, 2017 Как можно видеть каждый Endif находится ровно под своим If'ом. Удобно, не правда ли? Если бы все скриптеры это соблюдали, ковыряться в чужих скриптах было бы намного удобнее, но увы... Поделиться сообщением Ссылка на сообщение
Old Vault Boy 560 Опубликовано 12 ноября, 2017 scn CraftingRewardXP Int iFlag; переменная флаг Int iPreviousValue; предыдущее значение Int iCurrentValue; текущее значение Int iCraftXP Begin MenuMode 1077 Let iFlag := 1 End Begin GameMode If iFlag Let iCurrentValue := (GetPCMiscStat "Items Crafted") Let iPreviousValue := ? Let iCraftXP:= (iCurrentValue - iPreviousValue) If iCurrentValue > iPreviousValue Player.RewardXP iCraftXP Let iFlag := 0 Endif Endif End Но ведь наша переменная не поменяется, пока строка на изменение переменной вновь не выполнится, правильно? Тут я вообще ничего не понял. Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 12 ноября, 2017 Ну смотри. Ситуация следующая. Игрок скрафтил какую-то вещь, счётчик показывает значение 100. Как только он вышел из меню крафта это значение записалось в нашу переменную (ибо мы так скрипт построили). Теперь при следующем входе в меню игрок скрафтил ещё 5 предметов. Пока он в меню, в нашей переменной всё ещё значение 100. Как только он выходит, начинает работать блок GameMode. Скрипт выполняется построчно, т.е. когда он дойдёт до строки Let iCurrentValue := (GetPCMiscStat "Items Crafted"), значение в переменной поменяется. Что это значит? Это значит, что нужно поменять структуру скрипта: вначале в предыдущее значение записываем текущее (Let iPreviousValue := iCurrentValue), затем уже в текущее записываем значение из функции (Let iCurrentValue := (GetPCMiscStat "Items Crafted")). Надеюсь, теперь стало понятнее. Вообще, я бы ещё некоторые элементы в скрипте переставил, но об этом позже. Вот как правильно должен быть оформлен твой текущий кусок кода. Сравни его со своим оформлением. scn CraftingRewardXP Int iFlag; переменная флаг Int iPreviousValue; предыдущее значение Int iCurrentValue; текущее значение Int iCraftXP Begin MenuMode 1077 Let iFlag := 1 End Begin GameMode If iFlag ; <- вообще, лично я выношу всё, что в блоке Begin/End, хотя это и необязательно Let iCurrentValue := (GetPCMiscStat "Items Crafted") Let iPreviousValue := ? Let iCraftXP:= (iCurrentValue - iPreviousValue) If iCurrentValue > iPreviousValue ; <- само новое условие не нужно табулировать, только его содержимое Player.RewardXP iCraftXP Let iFlag := 0 ; <- у тебя тут не совпадал отступ с предыдущей строкой Endif Endif End Поделиться сообщением Ссылка на сообщение
Old Vault Boy 560 Опубликовано 12 ноября, 2017 Подредактировал код. scn CraftingRewardXP Int iFlag; переменная флаг Int iPreviousValue; предыдущее значение Int iCurrentValue; текущее значение Int iCraftXP Begin MenuMode 1077 Let iFlag := 1 End Begin GameMode If iFlag Let iPreviousValue := iCurrentValue; предыдущее значение равно текущему Let iCurrentValue := (GetPCMiscStat "Items Crafted"); текущее значение берётся из функции Let iCraftXP:= (iCurrentValue - iPreviousValue) If iCurrentValue > iPreviousValue Player.RewardXP iCraftXP Let iFlag := 0 Endif Endif End Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 12 ноября, 2017 В принципе должно работать, проверяй. Естественно, скрипт вешается на квест. Но всё равно одна вещь меня не устраивает. Пока что, есть случай, когда скрипт будет работать в GameMode постоянно. Исправить нетрудно, подумай над этим. Поделиться сообщением Ссылка на сообщение
cat-boy 204 Опубликовано 14 ноября, 2017 Здравствуйте. Подскажите программу, которой можно отредактировать скрипт в Ф-4 (.рех) Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 14 ноября, 2017 Здравствуйте. Никогда не занимался скриптингом в Ф4, поэтому ничем помочь, увы, не могу. Поделиться сообщением Ссылка на сообщение
cat-boy 204 Опубликовано 14 ноября, 2017 Спасибо за ответ. К сожалению в инете по этой теме вообще ничего нет. Всего то нужно заменить True на False но это глобальная проблема!!!!! Я для ФНВ сам делал простенькие скрипты когда-то, и это делалось в ГЕККе без проблем. Поделиться сообщением Ссылка на сообщение
Old Vault Boy 560 Опубликовано 14 ноября, 2017 Проверил доработанный скриптец в игре - всё работает. Опыт за крафт начисляется исправно. Владимиру - моя безмерная благодарность за помощь и терпение. 1 Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 14 ноября, 2017 Проверил доработанный скриптец в игре - всё работает. Опыт за крафт начисляется исправно. Владимиру - моя безмерная благодарность за помощь и терпение. Да тут мне надо тебя благодарить за трудолюбие. Приятно встретить человека, который готов поработать над тем, что он хочет получить. А не ждёт, пока за него всё сделают. В итоге получился вполне себе полный мод, который даже можно зарелизить. Добавить к нему, скорее всего, нечего, разве что какую-нибудь формулу для начисления опыта придумать. А то может немного читерным оказаться. Но всё равно одна вещь меня не устраивает. Пока что, есть случай, когда скрипт будет работать в GameMode постоянно. Исправить нетрудно, подумай над этим. А вот с этим что? Чисто от себя, как от администратора школы, хочу сказать, что очень рад, что смог помочь ученику. Я бы даже не против возобновить работу школы, вот только надо оно кому? Помнится, Даша говорила, что ей не помешало бы разобраться в азах... Так что пишите здесь, если хотите увидеть новые задания от меня или если захотите что-то создать (по типу мода от OldVaultBoy). Не стесняйтесь. Поделиться сообщением Ссылка на сообщение
Old Vault Boy 560 Опубликовано 14 ноября, 2017 Добавить к нему, скорее всего, нечего, разве что какую-нибудь формулу для начисления опыта придумать. А то может немного читерным оказаться. Почему? Формулу 1XP за 1 скрафченный предмет я взял из F4. Там вполне себе можно прокачивать перса строительством, крафтом и т.д. Чем же Вегас хуже? Тут навык ремонта почти бесполезен, а теперь он не хуже боевых навыков и вполне может использоваться для заработка опыта и прокачки персонажа. Особенно если билд строится на принципе no kill (например я убиваю только для пропитания во время охоты, а по квестам достаю оружие лишь в том случае, когда нельзя решить конфликт любым другим мирным путём). А вот с этим что? Сделал так. scn SFWCraftingRewardXPScript Int iFlag Int iPreviousValue Int iCurrentValue Int iCraftXP Begin MenuMode 1077 Let iFlag := 1 End Begin GameMode If iFlag == 1; сделал уточнение Let iPreviousValue := iCurrentValue Let iCurrentValue := (GetPCMiscStat "Items Crafted") Let iCraftXP:= (iCurrentValue - iPreviousValue) If iCurrentValue > iPreviousValue Player.RewardXP iCraftXP Let iFlag := 0 Endif Endif End Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 14 ноября, 2017 Уточнение здесь вовсе необязательное, у переменной iFlag всегда одно из двух значений - 0 или 1. Было бы их было больше, тогда да, было бы важно. Ну а в скрипте всё ещё есть ситуация, когда постоянно будет работать почти весь код, что в GameMode. А это не очень хорошо (хотя на таком мелком скрипте и не будет проблем, но всё же понимание того, что большой скрипт в подобной ситуации будет грузить игру, нужно). Поделиться сообщением Ссылка на сообщение
Old Vault Boy 560 Опубликовано 14 ноября, 2017 Хорошо, а если так? scn SFWCraftingRewardXPScript Int iFlag Int iPreviousValue Int iCurrentValue Int iCraftXP Begin MenuMode 1077 Let iFlag := 1 End Begin GameMode If iFlag Let iPreviousValue := iCurrentValue Let iCurrentValue := (GetPCMiscStat "Items Crafted") Let iCraftXP:= (iCurrentValue - iPreviousValue) If iCurrentValue > iPreviousValue && iFlag == 1; расширил условие выполнения Player.RewardXP iCraftXP Let iFlag := 0 Endif Endif Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 14 ноября, 2017 Не, не надо ничего добавлять и усложнять. Надо всего лишь 1 строчку перенести, чтобы проход был единственным. Какая строка отвечает за остановку проходов? Т.е., какая строка влияет на НЕвыполнение условия If iFlag ? И куда её нужно перенести, чтобы она в любом случае выполнилась после одного прохода? Поделиться сообщением Ссылка на сообщение
Old Vault Boy 560 Опубликовано 14 ноября, 2017 Так, стоп. Не совсем понимаю эти "проходы". Если флаг в положении 1, блок GameMode выполняется и закрывается флагом в положении 0. Если я всё правильно понимаю, то блок GameMode отдыхает до следующего переключения флага в положение 1. Так ведь? Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 14 ноября, 2017 Да. Но пока что есть ситуация, когда блок не закрывается. Поделиться сообщением Ссылка на сообщение