Перейти к содержанию

Рекомендуемые сообщения

Я бы весь функционал в GameMode вынес. А в MenuMode просто бы флаг менял. А дальше уже сверяем наше предыдущее количество предметов с текущим. Если они разнятся, значит игрок что-то скрафтил. Обновляем предыдущее значение и начисляем опыт. Ну и флаг сбрасываем, когда закончили.

Поделиться сообщением


Ссылка на сообщение

А как реализовать переменную флаг? Как это выглядит технически? Скрипт начинается с формы Begin GameMode, а как это увязать с MenuMode?

Поделиться сообщением


Ссылка на сообщение

Цитата из первого поста  :)

 

 

3) Дальше идёт основная часть скрипта. Блоки, начинающиеся на Begin и заканчивающиеся на End. Типы блоков бывают разными, но основные GameMode и MenuMode. Первый работает во время игры, второй - в каком-либо меню (пип-бой, окно бартера, контейнер и т.д.). В одном скрипте можно использовать несколько блоков одновременно. Подробнее тут

Begin GameMode
// какие-то команды
end

Begin MenuMode
// ещё команды
end 

 

Поделиться сообщением


Ссылка на сообщение

 

 

В одном скрипте можно использовать несколько блоков одновременно. Подробнее тут

Это из той оперы, где я смотрю в книгу и вижу фигу. :)

Поделиться сообщением


Ссылка на сообщение

А что конкретно не понятно? Делаешь 2 блока в скрипте. В одном переменную увеличиваешь на 1, в другом делаешь проверку, а потом понижаешь.

Поделиться сообщением


Ссылка на сообщение

А переменную к функции привязывать?

scn CraftingRewardXP

Int iFlag; переменная флаг
Int iPreviousValue; предыдущее значение
Int iCurrentValue; текущее значение

	Begin GameMode

	Set iFlag to (MenuMode 1077)
	Set iPreviousValue to (GetPCMiscStat "Items Crafted")
	Let iCurrentValue := 1

Поделиться сообщением


Ссылка на сообщение

Ой, ой, ой, так нельзя. Он же даже не сохранится. Я специально про 2 блока написал.

Begin MenuMode 1077

   Let iFlag := 1

End

Begin GameMode

   If iFlag

...

      Let iFlag := 0
   Endif

End 

Поделиться сообщением


Ссылка на сообщение
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". Если функция показывает предыдущее значение, то как выставить текущее?

Поделиться сообщением


Ссылка на сообщение

Не надо каждую новую строчку табулировать. Это делается только, когда новый блок появляется. Например, if/endif. А всё что внутри него должно быть с одинаковым отступом.

If ...
   Команда 1
   Команда 2
   If ...
      Команда 3
   Endif
Endif

Как можно видеть каждый Endif находится ровно под своим If'ом. Удобно, не правда ли?  :)

 

 

А как отследить значения изготовленных предметов? Понятно, что за это отвечает функция GetPCMiscStat "Items Crafted". Если функция показывает предыдущее значение, то как выставить текущее?

Она как раз таки текущее и показывает. Но ведь наша переменная не поменяется, пока строка на изменение переменной вновь не выполнится, правильно?  :)

Поделиться сообщением


Ссылка на сообщение

 

 

Как можно видеть каждый Endif находится ровно под своим If'ом. Удобно, не правда ли?

Если бы все скриптеры это соблюдали, ковыряться в чужих скриптах было бы намного удобнее, но увы...

Поделиться сообщением


Ссылка на сообщение
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

 

 

Но ведь наша переменная не поменяется, пока строка на изменение переменной вновь не выполнится, правильно?

Тут я вообще ничего не понял. :) 

Поделиться сообщением


Ссылка на сообщение

Ну смотри. Ситуация следующая. Игрок скрафтил какую-то вещь, счётчик показывает значение 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

Поделиться сообщением


Ссылка на сообщение

Подредактировал код.

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

Поделиться сообщением


Ссылка на сообщение

В принципе должно работать, проверяй. Естественно, скрипт вешается на квест. Но всё равно одна вещь меня не устраивает. Пока что, есть случай, когда скрипт будет работать в GameMode постоянно. Исправить нетрудно, подумай над этим.

Поделиться сообщением


Ссылка на сообщение

Здравствуйте. Подскажите программу, которой можно отредактировать скрипт в Ф-4 (.рех) 

Поделиться сообщением


Ссылка на сообщение

Здравствуйте. Никогда не занимался скриптингом в Ф4, поэтому ничем помочь, увы, не могу.

Поделиться сообщением


Ссылка на сообщение

Спасибо за ответ. К сожалению в инете по этой теме вообще ничего нет. Всего то нужно заменить True на False но это глобальная проблема!!!!! Я для ФНВ сам делал простенькие скрипты когда-то, и это делалось в ГЕККе без проблем.

Поделиться сообщением


Ссылка на сообщение

Проверил доработанный скриптец в игре - всё работает. Опыт за крафт начисляется исправно. :)

Владимиру - моя безмерная благодарность за помощь и терпение.  :thank_you:

  • Нравится 1

Поделиться сообщением


Ссылка на сообщение

Проверил доработанный скриптец в игре - всё работает. Опыт за крафт начисляется исправно. Владимиру - моя безмерная благодарность за помощь и терпение.

Да тут мне надо тебя благодарить за трудолюбие. Приятно встретить человека, который готов поработать над тем, что он хочет получить. А не ждёт, пока за него всё сделают.  :good:

В итоге получился вполне себе полный мод, который даже можно зарелизить. Добавить к нему, скорее всего, нечего, разве что какую-нибудь формулу для начисления опыта придумать. А то может немного читерным оказаться.

Но всё равно одна вещь меня не устраивает. Пока что, есть случай, когда скрипт будет работать в GameMode постоянно. Исправить нетрудно, подумай над этим.

А вот с этим что?  ;)

 

Чисто от себя, как от администратора школы, хочу сказать, что очень рад, что смог помочь ученику. Я бы даже не против возобновить работу школы, вот только надо оно кому? Помнится, Даша говорила, что ей не помешало бы разобраться в азах... Так что пишите здесь, если хотите увидеть новые задания от меня или если захотите что-то создать (по типу мода от OldVaultBoy). Не стесняйтесь.

Поделиться сообщением


Ссылка на сообщение

 

 

Добавить к нему, скорее всего, нечего, разве что какую-нибудь формулу для начисления опыта придумать. А то может немного читерным оказаться.

Почему? Формулу 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

Поделиться сообщением


Ссылка на сообщение

Уточнение здесь вовсе необязательное, у переменной iFlag всегда одно из двух значений - 0 или 1. Было бы их было больше, тогда да, было бы важно. Ну а в скрипте всё ещё есть ситуация, когда постоянно будет работать почти весь код, что в GameMode. А это не очень хорошо (хотя на таком мелком скрипте и не будет проблем, но всё же понимание того, что большой скрипт в подобной ситуации будет грузить игру, нужно).

Поделиться сообщением


Ссылка на сообщение

Хорошо, а если так?

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

Поделиться сообщением


Ссылка на сообщение

Не, не надо ничего добавлять и усложнять. Надо всего лишь 1 строчку перенести, чтобы проход был единственным.  :)

Какая строка отвечает за остановку проходов? Т.е., какая строка влияет на НЕвыполнение условия If iFlag ? И куда её нужно перенести, чтобы она в любом случае выполнилась после одного прохода?

Поделиться сообщением


Ссылка на сообщение

Так, стоп. Не совсем понимаю эти "проходы". Если флаг в положении 1, блок GameMode выполняется и закрывается флагом в положении 0. Если я всё правильно понимаю, то блок GameMode отдыхает до следующего переключения флага в положение 1. Так ведь?

Поделиться сообщением


Ссылка на сообщение

Да. Но пока что есть ситуация, когда блок не закрывается.

Поделиться сообщением


Ссылка на сообщение

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


×
×
  • Создать...