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

Лидеры


Популярный контент

Показан контент с высокой репутацией за 29.03.2023 в Записи блога

  1. 2 балла
    ВСЕХ ЗАДОЛБАВШАЯ ПРОДАЖА КНИГ!!! ЭТА ЗАПИСЬ БЛОГА ДОБАВЛЕНА ДЛЯ САМОЛЮБОВАНИЯ. Функция продажи, из диалога Йерлинг scn aaaSFWbtcBooksToCaps int HowMuchToSale ref rBook int Count int BookPrice int iRewardXP Begin Function { HowMuchToSale } If (GetINIFloat "BooksToCapsOptions:iFixedPrice" "BooksToCaps.ini") > 0 BookPrice = GetINIFloat "BooksToCapsOptions:iFixedPrice" "BooksToCaps.ini" Else BookPrice = Ceil ((Player.GetAV Science)/5 + (Player.GetAV Repair)/5 + (Player.GetAV Medicine)/5 + (Player.GetAV Barter)/5 + (Player.GetAV Survival)/5) EndIf If (GetINIFloat "BooksToCapsOptions:iRewardXP" "BooksToCaps.ini") > 0 iRewardXP = GetINIFloat "BooksToCapsOptions:iRewardXP" "BooksToCaps.ini" Else iRewardXP = 10 EndIf If aaaSFWbtcBookPerkQuest.BookPerk > 99 foreach rBook <- aaaSFWbtcBooksFormList Count = (Player.GetItemCount rBook) If Count > 0 If Count > HowMuchToSale Count = HowMuchToSale EndIf Player.RemoveItem rBook Count Player.AddItem f (Count * BookPrice) RewardXP (Count * iRewardXP) ; aaaSFWbtcBookPerkQuest.BookPerk += Count HowMuchToSale -= Count If HowMuchToSale == 0 Break EndIf EndIf loop Else foreach rBook <- aaaSFWBooksFormList Count = (Player.GetItemCount rBook) If Count > 0 If Count > HowMuchToSale Count = HowMuchToSale EndIf Player.RemoveItem rBook Count Player.AddItem f (Count * BookPrice) RewardXP (Count * iRewardXP) aaaSFWbtcBookPerkQuest.BookPerk += Count HowMuchToSale -= Count If HowMuchToSale == 0 Break EndIf EndIf loop EndIf If aaaSFWbtcBookPerkQuest.DoOnceBookPerk == 0 && aaaSFWbtcBookPerkQuest.BookPerk > 19 aaaSFWbtcBookPerkQuest.DoOnceBookPerk = 1 ShowMessage aaaSFWBookPerkSpoiler EndIf If aaaSFWbtcBookPerkQuest.DoOnceBookPerk == 1 && aaaSFWbtcBookPerkQuest.BookPerk > 99 aaaSFWbtcBookPerkQuest.DoOnceBookPerk = 2 Player.AddPerk aaaSFWBookPerk StartQuest aaaSFWbtcBookPerkQuest ShowMessage aaaSFWBookPerkMsg EndIf End Как видим, это скрипт-функция, вместе с циклом, но настроенная на то, что если перка продажи книг нет -- продавать обычные книги. В противном случае, при наличии перка, продаются книги из отбраковки перка. Логика крайне проста: Мы получаем переменную "сколько продать" и идём по всем ячейкам форм-листа, и обрабатываем только те ячейки, внутри которых лежат книги. Пустые, с нулём книг пропускаем. Дальше интересней -- в том случае, если количество книг в ячейке меньше-равно количества для продажи, то для текущей итерации цикла мы используем количество книг в ячейке, и за эту итерацию мы их продаём. Иначе, если количество больше, чем нужно продать, мы присваиваем переменной Количество Число для Продажи. После успешной продажи мы отнимаем от числа Продажи значение Количество, и таким образом ничего не забываем. Когда количество для продажи равно нулю -- мы прерываем цикл, чтобы не гонять его впустую и не вызывать ошибки. Так-же, при продаже обычных книг (Не отбраковки!) мы прибавляем значение переменной перка. Стоит упомянуть и то, что мы читаем 3 переменные из конфига BooksToCaps.ini . В конкретно данном скрипте у нас есть цена каждой книги, и получаемый опыт за книгу. В самом конце скрипта -- рутина, связанная с показом сообщений о перке, и запуском квеста перка. Я специально не делал запуск квеста перка вместе с игрой, со скриптом проверки наличия перка, чтобы сэкономить процессорное время на операциях скрипта, так-что добавляемый перк носит чисто косметический характер. scn aaaSFWbtcBookPerkScript int BookPerk ;Used in Function int DoOnceBookPerk ;Used in Function int i float BookRandom int LuckAffects int SFWBookGeneric1000Count int SFWBookGeneric725Count int SFWBookGeneric450Count Begin GameMode If GetGameLoaded || GetGameRestarted LuckAffects = GetINIFloat "BooksToCapsOptions:bLuckAffects" "BooksToCaps.ini" EndIf while (Player.GetItemCount aaaSFWBooksFormList) If (Player.GetItemCount (ListGetNthForm aaaSFWBooksFormList i)) Player.RemoveItem (ListGetNthForm aaaSFWBooksFormList i) 1 1 If LuckAffects == 1 BookRandom = GetRandomPercent + ((Player.GetAV Luck) / 2) Else BookRandom = GetRandomPercent + 2.5 EndIf If BookRandom > 101 SFWBookGeneric1000Count += 1 ElseIf BookRandom > 99 SFWBookGeneric725Count += 1 ElseIf BookRandom > 96 SFWBookGeneric450Count += 1 Else Player.AddItem aaaSFWBooksAll 1 1 EndIf Else i += 1 If eval i >= (ListGetCount aaaSFWBooksFormList) i = 0 EndIf EndIf loop If SFWBookGeneric1000Count || SFWBookGeneric725Count || SFWBookGeneric450Count ShowMessage aaaSFWbtcBooksVALUABLEmsg EndIf If SFWBookGeneric1000Count Player.AddItem SFWBookGeneric1000 SFWBookGeneric1000Count 1 SFWBookGeneric1000Count = 0 EndIf If SFWBookGeneric725Count Player.AddItem SFWBookGeneric725 SFWBookGeneric725Count 1 SFWBookGeneric725Count = 0 EndIf If SFWBookGeneric450Count Player.AddItem SFWBookGeneric450 SFWBookGeneric450Count 1 SFWBookGeneric450Count = 0 EndIf End Begin MenuMode 1009 If GetGameLoaded || GetGameRestarted LuckAffects = GetINIFloat "BooksToCapsOptions:bLuckAffects" "BooksToCaps.ini" EndIf while (Player.GetItemCount aaaSFWBooksFormList) If (Player.GetItemCount (ListGetNthForm aaaSFWBooksFormList i)) Player.RemoveItem (ListGetNthForm aaaSFWBooksFormList i) 1 1 If LuckAffects == 1 BookRandom = GetRandomPercent + ((Player.GetAV Luck) / 2) Else BookRandom = GetRandomPercent + 2.5 EndIf If BookRandom > 101 SFWBookGeneric1000Count += 1 ElseIf BookRandom > 99 SFWBookGeneric725Count += 1 ElseIf BookRandom > 96 SFWBookGeneric450Count += 1 Else Player.AddItem aaaSFWBooksAll 1 1 EndIf Else i += 1 If eval i >= (ListGetCount aaaSFWBooksFormList) i = 0 EndIf EndIf loop If SFWBookGeneric1000Count || SFWBookGeneric725Count || SFWBookGeneric450Count ShowMessage aaaSFWbtcBooksVALUABLEmsg EndIf If SFWBookGeneric1000Count Player.AddItem SFWBookGeneric1000 SFWBookGeneric1000Count 1 SFWBookGeneric1000Count = 0 EndIf If SFWBookGeneric725Count Player.AddItem SFWBookGeneric725 SFWBookGeneric725Count 1 SFWBookGeneric725Count = 0 EndIf If SFWBookGeneric450Count Player.AddItem SFWBookGeneric450 SFWBookGeneric450Count 1 SFWBookGeneric450Count = 0 EndIf End Это скрипт перка. Здесь можно заметить, что цикл выполняется по принципу IF -- если в форм-листе есть книги, то цикл работает, а если нет -- то пропускает выполнение, тоесть, цикл для экономии процессорного времени не гоняет строки массива впустую. Далее происходит вот что: Цикл обрабатывает одну ячейку форм-листа до те пор, пока она не исчерпается. Этим занят индекс i ... Когда ячейка исчерпывается на предмет наличия книг -- счётчик i прибавляется, и выполнение переходит на следующую ячейку. Конечно, когда счётчик выходит за предел форм-листа, то он сбрасывается на 0. Принцип работы таков, что за итерацию цикла отнимается одна обычная книга (Не отбраковка!), далее, либо прибавляется книга отбраковки, пригодная для продажи, либо прибавляется счётчик одной из Ценных Книг, от Очень ценной, до "Довольно" ценной. В конце скрипта проверяются счётчики Ценных Книг -- если хотя-бы одна больше нуля, то выводится сообщение о находке. Далее идёт секция добавления ценных книг согласно счётчику, с последующим обнулением счётчика. Конечно-же ценные книги / отбраковка добавляются случайно. Здесь есть переменная BookRandom, с типом плавающая запятая. Функция GetRandomPercent даёт число от 0 до 99. И если указано влияние удачи в конфиге, то Удача делённая на 2 прибавляется к случайному числу. Если же влияние удачи отключено, то к рандомному числу прибавляется 2,5 -- эквивалент Удачи 5 Коэффициенты поиска книг указаны как 1%, 2% и 3% -- от самой ценной до менее ценной. Число не попавшее в диапазон нахождения ценной книги преобразовывается в книгу-отработку [BooksToCapsOptions] ; Влияет ли удача на нахождение ценных книг ; Если 0 - то нет, если 1 - то да bLuckAffects=1 ; Фиксированная цена в крышках (целое число) ; Если 0 - то цена будет рассчитываться согласно навыкам iFixedPrice=0 ; Количество Очков Опыта за каждую проданную книгу iRewardXP = 10 Как видим в скрипте предусмотрено всё для того, чтобы не потерять ценные книги. В том-числе были поправлены условия диалогов Йерлинг, чтобы потеря ценных книг при первой продаже была минимальной, а затем их и вовсе потерять было нельзя.
  2. 2 балла
    -IKnowWhatImDoing -AllowMasterFilesEdit -IKnowIllBreakMyGameWithThis -cp-general:1251 -cp-trans:1251 Конец записи
  3. 1 балл
    Всем привет. На дворе 31-е декабря, а значит время нового поста из нашей регулярной рубрики. Ну как регулярной, иногда я немного задерживаюсь, но не сегодня! В прошлый раз я поднимал тему бекапирования своих наработок. Тогда я не знал, как поступить и какой путь выбрать. Сейчас же, мне кажется, я нашёл ответ. Подойдёт он скриптерам, т.е. в моём случае попадание прямо в яблочко. Позвольте мне познакомить вас с модификацией Hot Reload. Первой и очень удобной функцией является то, что скрипты можно изменять и сохранять, не закрывая игру. Это намного ускоряет процесс разработки, т.к. ранее на каждое изменение нужно было запустить игру, проверить, закрыть игру и только потом продолжить разработку. А если в код закралась ошибка, и ты не понимаешь, где она, и перебираешь все возможные варианты... В общем, было очень неудобно. Но мы не жаловались, а принимали это как должное. С Hot Reload, конечно, куда приятнее. Скажу вам так: дороги назад я не вижу. Но и это ещё не всё! Каждый скрипт, который вы создали в вашем плагине, сохраняется в виде текстового файла в специальную директорию. Это позволяет открыть его в любом удобном вам редакторе. Я лично пользуюсь Notepad++, для которого ещё и плагин с подсветкой синтаксиса есть. Вроде бы и для VSCode тоже существует. Вот вам небольшой фрагмент того, как это выглядит: Другим преимуществом текстовых файлов является то, что их-то вполне можно и под git положить. Я лично создал репозиторий в Gitlab и пушу туда изменения по мере их готовности. Это и хранение актуальных версий где-то вне, и история изменений с возможностью возврата к прошлым версиям, если что-то пошло не так. Естественно, все изменения, сделанные в этих файлах, автоматически попадают в плагин. Не нужно ничего никуда копировать. Если говорить о Каньоне, то я большую часть времени занимался переписыванием старых скриптов. Началось всё с того, что я нашёл логическую ошибку в работе своей мини-игры. Для её исправления требовалось влезть в основной скрипт, написанный ещё в далёком 2016 году. Честно говоря, смотреть на него было больно, а пытаться что-то поменять просто нереально, т.к. любое изменение привело бы к новым проблемам. А искать их в 1000+ строках кода, почему-то разбросанных по разным квестам, очень не хотелось. Поэтому я и переписал его. Стало намного лучше, во всех аспектах. Смотреть на скрипт теперь не так больно, я исправил ту самую логическую ошибку, сам размер скрипта заметно сократился, и теперь всё лежит в одном месте. Я также улучшил саму работу игры. Вот небольшой список было/стало: - Было: оба кубика бросались, через 5 секунд считывались значение с верхней грани, если хоть одно получить не удавалось, то оба кубика перебрасывались. Это часто приводило к ситуациям, когда один кубик перебрасывался просто так или значение по счастливой случайности считывалось с ещё катящегося кубика. Чаще всего кубикам просто не хватало времени остановиться, и происходили постоянные перебросы. - Стало: каждый кубик теперь обрабатывается отдельно. Значения считываются только после того, как кубик остановится. Если кубик упал на ребро, то перебрасывается только он. Количество успешных бросков выросло в разы. - Было: меню отображения ставок имело фиксированный размер, который не зависел от разрешения экрана. Позиции всех элементов были захардкожены. Размер текста был един везде. - Стало: размер меню теперь определяется динамически. Расположение элементов так же рассчитывается динамически. Размеры текста теперь подогнаны под размеры свободной области вокруг. Процесс переписывания всё ещё идёт, сейчас я занимаюсь блокнотом. Помимо этого было множество мелких правок и добавлений. Даже пришлось попробовать 3D-моделирование. Не могу сказать, что получилось отлично, но я остался доволен. Члены команды вроде тоже Ну вот, пожалуй, и всё на сегодня. Хочу пожелать всем мира и добра. Надеюсь, у вас и ваших близких всё будет хорошо.
  4. 1 балл
    Всем привет! Прошёл очередной год, а, значит, пришло время очередного отчёта. Сегодня хотел бы поднять две темы, лишь косвенно связанные с Каньоном. Кстати, забавно вышло. В прошлый раз писал, что защитился и вновь поступил. А сейчас выходит так, что скоро вновь защищаться буду. Ну да ладно, сейчас не об этом. Начнём, пожалуй, с темы поста. Ребята, делайте бекапы. Терять прогресс, и делать что-то заново - невероятно больно. Первый раз у меня случился, когда я решил закинуть обновление от товарищей по команде. А так как у нас всё идёт архивом, я благополучно перезаписал свои наработки старой версией файла. И это было очень неприятно, т.к. это был файл интерфейса. А править эти .xml файлы - то ещё удовольствие. Пришлось вспоминать, что я там наваял, и делать заново. Я даже не уверен, что ничего не забыл. Состояние такое, будто я разобрал что-то, затем собрал заново, а у меня остались лишние детали. Но вроде работает, так что не всё так печально. Второй раз случился, когда я переставлял винду. Старая была явно чем-то заражена, поэтому я, не раздумывая, снёс абсолютно всё, что было на дисках. Естественно, перед этим я сохранил самую ценную инфу. Стоит ли говорить, что про моды на Fallout я забыл? Благо в этот раз потери были не такие большие - только плагин. Да и в том лишь диалоги, которые имеются в виде Word-овского документа. Так что это восстановить было несложно. Но муторно, не люблю монотонную работу . И собственно встаёт вопрос - а как бекапить? Очевидно, надо на какой-то внешний ресурс. Создавать git-репозиторий не хочется, звучит как оверкилл. С другой стороны, всякие .xml файлы там бы хорошо зашли, ибо можно будет отследить все изменения и историю. Может какой-нибудь onedrive? Но тут всю директорию с модами пихать не вариант, слишком тяжёлая. Значит, нужен механизм синхронизации... Не знаю, в общем! Если есть какие-то практики - пишите, очень интересно! Не хочу наступать на грабли в третий раз. Переходим ко второй теме. Ребята, идите в ногу со временем. NVSE до сих пор развивается, не стесняйтесь переходить на новые фичи, ибо они зачастую сделаны лучше, чем оригинал. Я сейчас даже не говорю про лямбда-выражения и прочие продвинутые штуки. Возьму самый банальный пример. Стандартный set .. to и let из NVSE. Мало того, что возможностей у последней функции куда больше, так ещё и читаемость повышается в разы. Вот вам пример: set MyVeryLongNamedQuest.SomeVariable to MyVeryLongNamedQuest.SomeVariable + 1 let MyVeryLongNamedQuest.SomeVariable += 1 Строка получилась в 2 раза короче! А с выходом xNVSE 6.1.0 можно даже так: MyVeryLongNamedQuest.SomeVariable += 1 Если вам в скрипте потребуются строки или массивы, от let никуда не уйти. Так используйте эту функцию везде. Более того, ещё один огромный плюс, указанный в вики: Если возникает ошибка (во время игры), то в консоль будет выведено сообщение, содержащее мод и скрипт, в котором возникла ошибка! Это очень круто, ибо помогает ловить ошибки, которые set просто молча игнорирует. В общем, не стесняйтесь развиваться вместе с NVSE. Может, однажды найдёте что-то, что давно искали. Однако я ни в коем случае не призываю бежать и переписывать старый, уже проверенный код. В этом может быть резон только, если удастся его оптимизировать и снизить нагрузку с игры. В остальных случаях - двигайтесь дальше. Всем спасибо за внимание и с Наступающим!
  5. 1 балл
    Думаю, ни для кого не секрет, что мир фоллаута богат на интересные детали. В каждой игре серии при желании можно найти много интересных фишек, отсылок и способов прохождения квестов. В этом блоге я расскажу о десяти интересных деталях касательно Fallout 3. 1. С Днем рождения! Первую интересную отсылку можно найти еще в начале игры. Она связана с датой рождения главного героя. Если во время квеста "Быстрое взросление" открыть пип-бой, то можно увидеть, что он показывает дату 13 июля. Это отсылка на библейскую цитату из книги Михея, глава 7, стих 13. Он гласит: А земля та будет пустынею за вину жителей ее, за плоды деяний их. Однако данный перевод является не совсем дословным. Слово "שְׂמָמָה" также можно перевести как "пустошь". Этот стих разработчики выбрали не случайно, ибо он в точности описывает главное место действия Fallout 3 - Столичную пустошь. 2. Вилки в Рейвен-Рок Следующая фишка нас ждет в столовой Рейвен-Рок, а точнее, под ней. Если главный герой с помощью лестницы на кухне спустится в подполье и пройдет под столовую, то обнаружит большое количество вилок и столовых ножей. Скорее всего, их туда пороняли неаккуратные солдаты Анклава. 3. Эдем следит за тобой! При посещении Рэйвен-Рок можно заметить, что по всему бункеру расставлены роботизированные камеры, с помощью которых президент Эдем следит за происходящим. Казалось бы, ничего необычного. Однако если подойти очень близко к одной из таких камер, то она будет поворачиваться в зависимости от местоположения игрока. Точно так же камеры реагируют и на обычных неписей. 4. Нестандартное напутствие На Столичной пустоши близ станции сети «СатКом» NN-03d находится дверь. Если ее открыть, то можно увидеть матерную надпись. С ней связана довольно интересная история: дело в том, что на финальных этапах разработки игры дизайнеры обнаружили, что забыли создать интерьер для одной из башен. Времени у них было мало, поэтому они решили импровизировать. Помимо матерной надписи возле двери можно найти три гранатометных выстрела. 5. Тайник Тридогнайта Во время прохождения квеста "Новости галактики" протагонисту предстоит раздобыть тарелку спутниковой связи в обмен на информацию о папе. Но знали ли вы о том, что за прохождение этого квеста можно получить дополнительную награду. Для этого нужно узнать местонахождение своего отца от доктора Ли или пройти проверку речи у Тридогнайта. В таком случае после выполнения квеста игрок получит в награду ключ и координаты тайника с оружием, в котором можно найти довольно-таки полезные предметы, в том числе ядерный выстрел, стелс-бой и штурмовую винтовку. 6. Ни! В клинике Мегатонны можно найти неработающий терминал, который содержит в себе сообщение об ошибке. Перевод кода F141A013 из шестнадцатеричной системы в текст даёт ñ¡ или Ni, что является отсылкой к персонажам комедии "Монти Пайтон и Священный Грааль" — рыцарям, говорящим слово "Ни". 7. Фрампертон В районе Дюпон-сёркл есть магазин одежды, который называется "Салон леди Фрампертон". Его название довольно ироничное, поскольку слово frumpy в английском языке используется для обозначения непривлекательной и старомодной одежды, или человека, который носит её. 8. По ту сторону текстур Одним из самых необычных мест в Fallout 3 является Ланфан-плаза. Что же в нем такого необычного? Дело в том, что в этом районе некоторые объекты расположены под текстурами и добраться до них можно только с помощью консольных команд. Например, под укрытием супермутантов можно найти труп гуля. Но сейчас не о нем. За парикмахерской рядом со входом в подпольный магазин лежит бутылка виски. Также под текстурами можно найти еще три пустые бутылки, которые, скорее всего, должны были располагаться рядом со входом в магазин. Эти бутылки были добавлены сюда не случайно, ибо магазин мадам Джелли до войны являлся местом отдыха для джентльменов. 9. Харкнесс При первом посещении Ривет-Сити протагониста встречает шериф Харкнесс. Его имя является отсылкой к капитану Джеку Харкнессу, агента института Торчвуд-3 из сериалов Торчвуд и Доктор Кто. Помимо имени, этих двух людей объединяет много общего: они оба работали на передовые научные организации, оба обладают бессмертием и оба не разглашают свои настоящие имена. 10. Я хочу, чтоб к штыку приравняли перо Ну и напоследок расскажу кое-что про пупсов. Все мы знаем, что при взятии пупса выводится сообщение с напутственной фразой, которая зависит от навыка или параметра, на который влияет конкретный пупс. Но с пупсом "Красноречие" все немного иначе: при его взятии выводится фраза "Я хочу, чтоб к штыку приравняли перо". Эта фраза из стихотворения Маяковского "Домой".

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