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

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

Приветствую всех в школе скриптинга! Здесь, как я и говорил в своём ролике, я буду периодически давать задания на скрипты, а в конце срока оценивать полученные работы. Пока что никаких наград и призов не обещаю, но в будущем всё возможно. Ах да, знания - вот истинный приз!  :)

Давайте же приступим!

Задание #1.

Сроки: до 31.07.2017 (включительно)

Условие: необходимо сделать плагин, который каждую ночь (пускай это будет промежуток времени с 23:00 до 5:43), если игрок находится в Доме Дока Митчелла или на первом этаже казино Топс ("Топс" - казино) добавляет ему 500 фишек этого казино (без сообщения в углу экрана!), но только в том случае, если у игрока нет ни одной фишки казино "Гоморра". Делать это нужно только 1 раз за каждую ночь.
Критерии: пока ещё не придумал, но точно будут:

  • Правильность работы
  • Читаемость текста (табуляция)
  • Скорость работы плагина

Используйте любую удобную вам форму записи, любые удобные функции. Т.е. за Set/Let карать не буду. Но предпочтительней Let, конечно.

Как-то так для начала. К сожалению, я скоро уезжаю, поэтому на вопросы смогу ответить уже ближе к концу срока задания. Однако вся необходимая информация есть в ролике
[sharedmedia=videos:videos:234]

 

Желаю успехов!

 

Текстовая информация, по которой делался ролик. Обращаю внимание на то, что она устаревшая (нет применений Let, например).


Итак, структура, как и обещал. 
1) Любой скрипт начинается с его ID. По этому ID ты сможешь его найти в списке объектов. Тут ничего интересного, разве что можно писать ScriptName целиком или Scn

scn <ID твоего скрипта> // например scn aaaMyFirstScript

2) Объявление переменных. Переменные могут выполнять множество ролей. Например, можно сделать счётчик, таймер или просто сделать так, чтобы некая функция выполнилась всего 1 раз. Переменные бывают разных типов.

  • Short (или Int) - целочисленные переменные. Диапазон значений от -32768 до 32767
  • Long - тоже самое, только с другим диапазоном: от -2147483648 до 2147483647. Нигде не видел, чтобы их кто-то использовал
  • Float - дробные значения. По типу 3.4, 7.99
  • Ref - вот тут интересно. В эту переменную можно записать какой-то ID (восьмизначный). Начиная от игровой модели какого-либо NPC заканчивая оружием/броней/шлемом/etc у какого-либо NPC. В общем, сюда можно записать любой ID любого объекта из игры. Даже есть функция, которая возвращает ID объекта, который находится "под прицелом" ГГ. На самом деле, этими переменными пользоваться придётся нечасто, но всё же придётся. Так что придётся вникать)
  • Есть ещё переменные, например, string_var или array_var - переменная, содержащая строку и массив соответственно, но вряд ли тебе придётся с ними работать. Без них спокойно можно обойтись

Название переменной ты придумываешь сам, но удобно называть так, чтобы было понятно для чего она. Например, нужно выполнить что-то всего 1 раз. Переменную так и называют DoOnce. Также для удобства ставят вначале букву типа переменной. Если тип int, то iDoOnce, если ref, то rCurWeap и т.д.

int iMoney
ref rCurArmor

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

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

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

 
4) Что же писать внутри блоков? Тут и начинается твой скрипт. Здесь уже работаем по ситуации, я лишь расскажу, что нужно знать.

  • Присваивание переменной какого-либо значения. Допустим хотим узнать кол-во крышек у ГГ. В списке функций (не забываем, что там есть подкатегории для FOSE и NVSE, там тоже есть полезные функции) нужную. Как? Задумаемся, что нам нужно? Количество. Так, вбиваем в поиске по странице слово "Сount". Находим функцию GetItemCount. Как её использовать? Смотрим синтаксис. ContainerID - в нашем случае контейнер - это гг, поэтому player. ObjectID - ищем ID крышек в ГЕКК (можно на вики подсмотреть) - caps001. Для некоторых функций на странице есть примеры использования, обрати на это внимание. Итак, кол-во крышек число целое, поэтому заводим целочисленную переменную (например iMoney). Само присваивание происходит так
    Set <ID переменной> to <Функция>
    Set iMoney to (player.getitemcount caps001) // скобки ставить не обязательно, но так удобнее
  • Таким же образом можно менять переменную
    set iMoney to iMoney+1 // прибавили 1 к переменной
    set iMoney to iMoney*5 // и т.д.
    set iMoney to 10 //установили значение переменной 10
  • Условия. Очень полезная штука. Синтаксис прост
    if <какая-то переменная> == (>=, <=, >, <, !=) <число/другая переменная>
    // тут команды
    else
    // тут команды если НЕ выполняется условие
    endif 
    
    Также имеет место быть такая запись. Означает <переменная> неравна 0

  • if iMoney
    //
    endif
    
    Иногда вместо переменной ставят функцию

  • if player.getitemcount caps001 > 50
    //
    endif
    
    Можно делать несколько условий. Если нужно чтобы выполнялись сразу оба, то соединяют &&, если хотя бы одно из условие должно выполниться, то ||

  • if (iMoney > 50) && (iMoney < 1000) // у ГГ строго больше 50 и меньше 1000 крышек
    ...
    if (iMoney > 50) || (player.getsitting) // либо у ГГ > 50 крышек, либо он сидит, либо и то, и то 
    
  • Также можно просто выполнить какую-либо команду

  • player.addnote <ID объекта типа Note(заметка)>
    

Вроде бы ничего не забыл.

 

  • Нравится 4
  • Спасибо! 1

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


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

Написал скрипт, но есть проблемы.


Скрипт скомпилировался успешно, тип скрипта квестовый, повесил на квест. Но в игре не работает, сколько не бился. Так и не понял, где ошибка. :help: 
 

scn ExerciseOneSchoolOfScripts

Int iDoOnce

Begin GameMode

	If iDoOnce == 0; условие выполнения (единожды).
		If (GetCurrentTime < 5.7166667) && (GetCurrentTime > 23) ; условие времени в десятеричной системе.
			If (Player.GetInCell GSDocMitchellHouse) || (Player.GetInCell TOPSCasino) ; условие местонахождения игрока.
				If Player.GetItemCount TheTopsChip == 0 ; условие, при котором у игрока нет фишек казино "Топс".
					Player.AddItem TheTopsChip 500 0 ; добавить игроку 500 фишек казино "Топс", без сообщения в углу экрана.
				EndIf
			EndIf
		EndIf
	EndIf

End

 

 

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


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

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

Тут вроде всё очевидно. Смотрим на строчку

If (GetCurrentTime < 5.7166667) && (GetCurrentTime > 23)

Грубо говоря, нужно решить систему неравенств x < 5.7 && x > 23. Много у нас таких чисел? Что-то я не припомню ни одного...

А вообще, обратите внимание на функцию Print. Я постоянно использую, чтобы понять на какой именно строке ломается работа.

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


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

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

Тут вроде всё очевидно. Смотрим на строчку

If (GetCurrentTime < 5.7166667) && (GetCurrentTime > 23)

Грубо говоря, нужно решить систему неравенств x < 5.7 && x > 23. Много у нас таких чисел? Что-то я не припомню ни одного...

GetCurrentTime < 5.72 это значения времени после полуночи, а GetCurrentTime > 23 это значения до полуночи, ведь до 0.00  должен один час ещё пройти. Если я правильно понимаю игровое времяисчисление.

 

А вообще, обратите внимание на функцию Print. Я постоянно использую, чтобы понять на какой именно строке ломается работа.

Не совсем понял, как это функция работает и где используется. Попробовал  PrintToConsole (название скрипта) - в консоле тишина.

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


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

GetCurrentTime < 5.72 это значения времени после полуночи, а GetCurrentTime > 23 это значения до полуночи, ведь до 0.00  должен один час ещё пройти. Если я правильно понимаю игровое времяисчисление.

Да тут-то всё правильно. Проблемы с математикой. Назови мне число, которое больше 10, но меньше 5. Тут та же песня.

Не совсем понял, как это функция работает и где используется. Попробовал  PrintToConsole (название скрипта) - в консоле тишина.

Хех, никто тебе никогда самостоятельно не напишет, где проблема. Я просто на каждой строке пишу print "1", потом print "2" и т.д. PrintC тоже полезная штука, но тут и без неё можно обойтись.

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


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

Да тут-то всё правильно. Проблемы с математикой. Назови мне число, которое больше 10, но меньше 5. Тут та же песня.

Ага. Значит, если время представить в виде числовой прямой от 0 до 23, то получаем  следующее: If (GetCurrentTime < 23) && (GetCurrentTime > 5.72), но тогда выходит, что условие охватывает время от пяти утра, до одиннадцати вечера.

Значит нужно вводить переменную Float fTime и работать уже с ней. Я в правильном направлении мыслю?

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


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

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

Введение переменной погоды не изменит - всё равно её придётся с чем-то сравнивать.

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


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

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

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

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


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

Что ж, вот и закончился срок первого задания. Если честно, не такого результата я ожидал, ну да неважно. У нас есть присланный вариант от Old Vault Boy и сейчас мы его разберём по пунктам. Жаль, что вариант недоделанный, но у человека были на то свои причины. Ладно, хватит лишних слов: давайте приступать!
 
Присланный код:

 

scn ExerciseOneSchoolOfScripts

Int iDoOnce

Begin GameMode

	If iDoOnce == 0; условие выполнения (единожды).
		If (GetCurrentTime < 5.7166667) && (GetCurrentTime > 23) ; условие времени в десятеричной системе.
			If (Player.GetInCell GSDocMitchellHouse) || (Player.GetInCell TOPSCasino) ; условие местонахождения игрока.
				If Player.GetItemCount TheTopsChip == 0 ; условие, при котором у игрока нет фишек казино "Топс".
					Player.AddItem TheTopsChip 500 0 ; добавить игроку 500 фишек казино "Топс", без сообщения в углу экрана.
				EndIf
			EndIf
		EndIf
	EndIf

End

 


 
Предлагаю рассматривать код построчно и параллельно разбирать задание (его найти можно в первом посте).
Начало верное: объявление скрипта, введение переменной нужного типа, которая понадобится. Ведь не зря в задании есть фраза "Делать это нужно только 1 раз за каждую ночь". Режим GameMode выбран верно.

If iDoOnce == 0; условие выполнения (единожды).

Условие правильное, а вот его расположение - нет. Почему? Объясню чуть позже.

If (GetCurrentTime < 5.7166667) && (GetCurrentTime > 23) ; условие времени в десятеричной системе.

А вот тут с условием беда, с которой автор так и не разобрался. Назовите мне число, которое меньше 5, но больше 10. Не выходит? Тут такая же ситуация. Я не зря выбрал такой промежуток времени. Есть несколько вариантов реализации. Представьте время, как числовую прямую от 0 до 24. Нам нужны промежутки от 0 до 5.72 и от 23 до 24. Так и запишем:

If (GetCurrentTime <= 5.7166667) || (GetCurrentTime >= 23)

Чувствуете разницу? Нам нужен любой из этих промежутков, а не оба сразу. Ну и на знаки обратите внимание. В данном случае несильно работу мода изменит, но всегда нужно чётко различать строгие и нестрогие условия. А вот ещё один неплохой вариант:

If (GetCurrentTime > 5.7166667) && (GetCurrentTime < 23)
; тут мы ещё кое-что добавим
Else

Мы выбираем неверный промежуток, а код пишем в отрицании, т.е. после else.

Дальше всё верно, кроме строки

If Player.GetItemCount TheTopsChip == 0 ; условие, при котором у игрока нет фишек казино "Топс".

Читаем условие внимательнее "если у игрока нет ни одной фишки казино "Гоморра". Поверьте, внимательность нужна всегда. Ну и 0 всё-таки показывает сообщение, а не убирает его. Но почему же код не закончен? Вновь читаем условие: "Делать это нужно только 1 раз за каждую ночь". Т.е. все эти условия должны проверяться каждую ночь. Отсюда и неверное расположение условия с iDoOnce. Кстати, поменять её с 0 автор тоже забыл. Однако если бы не проблема с промежутком времени, то он бы сразу догадался. Итого, что мы имеем:

  • Правильность работы: 4/10. Основные аспекты, к сожалению, отсутствуют или сделаны неверно.
  • Читаемость текста: 10/10. Соблюдена табуляция, даже комментарии есть!
  • Скорость работы плагина: 0/10. До плагина дело так и не дошло  :(

Итого: 14/30. Не густо, на самом деле, т.к. задание было несложное. Но тут всё объясняется отсутствием времени для работы.

 

Ну а теперь мой вариант скрипта. Я его не тестировал, если честно, ибо особого смысла в этом не вижу.

 

 

 

scn SolutionExerciseOneSchoolOfScripts

Int iDoOnce

Begin GameMode

	If (GetCurrentTime <= 5.7166667) || (GetCurrentTime >= 23) ; условие времени
		If iDoOnce == 0 ; условие выполнения единожды.
			If (Player.GetInCell GSDocMitchellHouse) || (Player.GetInCell TOPSCasino) ; условие местонахождения игрока
				If Player.GetItemCount GomorrahChip == 0 ; условие на отсутствие у игрока нет фишек казино "Гоморра"
					Player.AddItem TheTopsChip 500 1 ; добавить игроку 500 фишек казино "Топс", без сообщения в углу экрана
					Let iDoOnce := 1 ; этой ночью крышки добавлены, меняем переменную
				EndIf
			EndIf
		EndIf
	Else
		Let iDoOnce := 0 ; наступило утро, возвращаем переменную
	EndIf

End

 

 

 

Вот, собственно, и всё, что требовалось. Не так уж и много, да?

 

На этом, пожалуй, я закрываю свою школу Скриптинга. Очень жаль, что поучаствовал лишь один человек, но я ему очень благодарен за это! Жаль, что пока он не может продолжать развиваться, а делать задание для 0 людей как-то глупо. Обидно, конечно, но тут ничего не поделаешь. Всем удачи в любых начинаниях! С вами был Вис961, директор школы Скриптинга...

  • Нравится 1

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


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

Есть такой замечательный мод Pickpocket Overhaul. Вся его суть в том, что за карманные кражи игроку начисляется опыт, по 1XP за каждый украденный предмет (например за 5 украденных крышек начислят 5 опыта, за 6 - 6 и т.д.). Идея очень хорошая и я подумал, что неплохо бы было реанимировать таким же способом крафт в SFW. Сейчас за крафт опыт не начисляется, только ачивку можно получить за 200 изготовленных предметов, а было бы здорово получать по 1XP, как в F4. Это неплохо отразилось бы на навыке ремонта, который сейчас полезен канешн, но не в такой степени, как ежели бы с помощью него можно было опыт зарабатывать. Интересно можно ли это реализовать и найдутся ли специалисты?

 

Приложу код на всякий случай. Может как базовая наработка пригодится. 

scn PickpocketChallengeSCRIPT

begin ScriptEffectStart
	player.RewardXP PickpocketRewardXP
end

scn PickPocketQuestScript

Begin GameMode

If GetGameRestarted

	SetOnMouseoverChangeEventHandler PickPocketUDF 1 1008

EndIf

END
scn PickPocketUDF

int	iMenuID

ref rItemRef
ref rOwnerRef

float fValue
float fPerception

float fHealth

begin Function {iMenuID}

set rOwnerRef to GetMenuTargetRef 1008

If player.IsSneaking == 0 || rOwnerRef.IsActor == 0 || rOwnerRef.GetDead == 1
	Return
Else
	set rItemRef to GetSelectedItemRef

	set fValue to -(rItemRef.GetWeight * 1)
	set fPerception to -(rOwnerRef.GetAV Perception * 8)

	setnumericgamesetting fPickPocketAmountBase fvalue
	setnumericgamesetting fPickPocketTargetSkillBase fPerception

	If rItemRef.GetType == 24 || rItemRef.GetType == 40
		set fHealth to (rItemRef.GetItemRefCurrentHealth / rItemRef.GetHealth)
		Let fHealth ^= 1.5
	Else
		set fHealth to 1
	EndIf

	set PickPocketRewardXP to ((rItemRef.Getweight) + (fHealth * rItemRef.GetValueAlt / 100) + (rOwnerRef.GetAV Perception))

EndIf

end
  • Нравится 1

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


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

Вообще эта тема немного не о том была, но т.к. она заброшена, то не особо важно.
 

по 1XP за каждый украденный предмет

Не, это совсем не так. В скрипте чётко выведена некая формула, которая и на странице мода есть:

 

Item Weight + (Current Item Value / 100) + Target Perception

 

Так что соотношение не 1 к 1. А теперь к теме.
По 1 единице опыта за 1 крафт, хм. Должно быть более чем реально. А если учесть, что в игре аж испытание есть, то шансы повышаются в разы, т.к. игра всё-таки считает количество скрафченных предметов. Вопрос лишь в том, как там всё устроено? Если какая-то переменная глобальная или ещё что-нибудь? В идеале, конечно, найти бы какую-нибудь функцию, верно? И, да, действительно, искать не пришлось совсем. Она попалась мне буквально за первые 15 секунд. Вот только не скажу я вам её  :D.
Предлагаю следующую схему, раз уж вы тут написали: тот, кто хочет этим заняться сейчас мне ответит, а хочет ли он попытаться сделать этот мод самостоятельно? Пока что в моей голове всё выглядит достаточно просто, поэтому это будет неплохая тренировка, которая позволит вам разобраться с основами скриптинга (и даже немного с продвинутым уровнем). Как я вижу, минимум 2 человека хотят увидеть такое нововведение в игре, поэтому я всё же надеюсь, что кто-то вызовется добровольцем (а ещё лучше, если сразу оба ;)). А т.к. это школа, то с моей стороны будет обеспечена любая помощь по любым вопросом, подсказки и проверка сделанного. Ну а если никто не хочет и пальцем о палец бить, или ни у кого катастрофически не хватает времени (как у меня например), то пишите в тему "Вопросы по моддингу", как найду время, так постараюсь что-то сделать.

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


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

Не, это совсем не так. В скрипте чётко выведена некая формула, которая и на странице мода есть.

Так что соотношение не 1 к 1.

 

Действительно, я не обратил внимания на формулу внимания, а в игре воровал только по мелочи: крышки и патроны. Отсюда и по одному XP за каждый украденный предмет. Но нет худа без добра - благодаря этому пришла мысль про крафт. :)

 

 

По 1 единице опыта за 1 крафт, хм. Должно быть более чем реально. А если учесть, что в игре аж испытание есть, то шансы повышаются в разы, т.к. игра всё-таки считает количество скрафченных предметов. Вопрос лишь в том, как там всё устроено? Если какая-то переменная глобальная или ещё что-нибудь? В идеале, конечно, найти бы какую-нибудь функцию, верно? И, да, действительно, искать не пришлось совсем. Она попалась мне буквально за первые 15 секунд. Вот только не скажу я вам её  :D.

Предлагаю следующую схему, раз уж вы тут написали: тот, кто хочет этим заняться сейчас мне ответит, а хочет ли он попытаться сделать этот мод самостоятельно? Пока что в моей голове всё выглядит достаточно просто, поэтому это будет неплохая тренировка, которая позволит вам разобраться с основами скриптинга (и даже немного с продвинутым уровнем). Как я вижу, минимум 2 человека хотят увидеть такое нововведение в игре, поэтому я всё же надеюсь, что кто-то вызовется добровольцем (а ещё лучше, если сразу оба ;)). А т.к. это школа, то с моей стороны будет обеспечена любая помощь по любым вопросом, подсказки и проверка сделанного. Ну а если никто не хочет и пальцем о палец бить, или ни у кого катастрофически не хватает времени (как у меня например), то пишите в тему "Вопросы по моддингу", как найду время, так постараюсь что-то сделать.

 

Я готов попробовать разобраться и составить код самостоятельно, хотя уже показал свою полную бездарность в этом вопросе. Но за спрос ведь не бьют в нос, верно? Так что попробовать можно.  :)

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


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

Что ж, первым делом очень простое задание: найти ту самую функцию. Подсказка: она находится в базовых, т.е. без всяких НВСЕ. Ну и вторая подсказка: она отвечает за кучу параметров, не только за скрафченные предметы.

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


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

Не, совсем не то. Искомая функция - GetPCMiscStat, с нужным параметром, конечно. Что ж, теперь хотелось бы услышать идею в целом. Как вообще вам видится работа плагина? Что нужно учесть, когда нужно учесть? В общих чертах, без всяких скриптовых особенностей.

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


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

Думаю, что нужно будет использовать переменную Long, поскольку она позволяет использовать более широкий диапазон значений, так как есть моды расширяющие крафт и снимающие всякое ограничение на количество одновременно изготовляемых предметов (по умолчанию максимальное значение 100). Так же нужно разработать формулу, которая позволит преобразовывать числовое значение количества изготовленных предметов в опыт, начисляемый игроку. Иными словами, нужно получить число, которое будет отражать количество изготовленных предметов. А затем уже использовать это число для начисления опыта. Как-то так. :)

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


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

Окей, вот есть у нас количество скрафченных предметов за всё время. Как нам выудить число скрафченных в последний раз? И когда это стоит делать? Я в целом про начисление опыта. Придумать формулу нужно только, если соотношение не 1 exp за 1 предмет.

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


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

Как нам выудить число скрафченных в последний раз?

Смутно себе представляю механику подсчёта чисел игрой, а как из этого числа выудить число предметов, скрафченных в последний раз - вообще без понятия.

 

И когда это стоит делать?

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

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


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

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

Теперь по поводу чисел. У нас в любой момент всегда есть доступ к общему числу скрафченных предметов, верно? Ситуация получается следующая: до активации игроком верстака там хранится, допустим, 100. Наш ГГ крафтит 5 предметов, и после выхода мы уже имеем 105. И казалось бы, что сложного? Берем 105 - 100 = 5 и работаем с этим числом. Только вот 100 исчезнет сразу же после крафта. Что нужно сделать, чтобы исправить эту проблему?

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


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

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

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


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

Ну вот, а кто-то про бездарность говорил. Итого, что мы имеем:

2 переменные для хранения количества скрафченных предметов: текущее значение и предыдущее значение.

Скрипт должен запускать начисление опыта после выхода из меню крафта.

Собственно, не вижу проблем начинать, всё вроде обсудили. Разве что как нам отловить момент выхода из меню? Для этого советую взглянуть на MenuMode и предложить мне идею  :)

Ну и конечно, перед началом советую задать все возникшие вопросы.

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


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

Разве что как нам отловить момент выхода из меню? Для этого советую взглянуть на MenuMode и предложить мне идею  :)

Так и не разобрался, к сожалению.

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


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

Эх, мне кажется проблема в том, что ты думаешь немного не в том направлении. Мне почему-то кажется, что ты пытаешься представить ситуацию сразу в виде скрипта. Тут же всегда нужен другой подход, т.е. генерация самой идеи, а потом уже её перенос в код. Вот как бы я поступил, и как я пришёл к этому:

нам нужно ловить выход из меню, так? А что это за меню такое вообще, дайте-ка глянем. Ага, "1077 = Recipe (New Vegas)", значит вход в него мы сможем отследить конструкцией Begin MenuMode 1077 ... End. Так, стоп, нам же выход нужен. Хм, что же происходит, когда мы выходим из меню крафта? Ой, точно, режим же меняется на GameMode, ибо больше никуда не выйти для продолжения игры! И что же нам делать? Заведём переменную-флаг. При входе в меню крафта будем менять её значение на 1. А в том же скрипте, но уже в блоке Begin GameMode сделаем проверку на [Наша переменная] == 1. Так мы точно можем сказать, что игрок был в меню и уже вышел из него. Можно работать с опытом и прочим.

Достаточно понятно то, что я рассказал? Или ещё какие-то вопросы?

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


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

Опа. А я и не знал, что так можно переключаться между MenuMode и GameMode. Теперь ситуация прояснилась. В блоке MenuMode скрипт будет заниматься подсчётом числа изготовленных предметов, а в блоке GameMode преобразованием числа в опыт. Если я всё правильно понимаю.

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


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

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

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

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

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

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

Войти

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

Войти


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