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

  • 0
Trust

Улучшение продажи Довоенных Книг

Вопрос

Здравствуйте! После публикации моего исправления у Магнума появилась мысль, что фикс можно пришить к новой версии, если он не будет конфликтовать, и его структуру подогнать к стандартам платформы SFW. У меня на этот счёт так-же появились дополнительные мысли.

 

Значит вот процитирую сообщение, о том, как работает мой скрипт:

 

QST/MISC: BooksToCapsITEM



scn BooksToCaps

array_var PrewarBookID
ref rBook
int BookTempCount

Begin OnAdd Player
    foreach PrewarBookID <- (GetListForms aaaSFWBooksFormList)
        let rBook := *PrewarBookID
        
        set BookTempCount to Player.GetItemCount rBook
        
        If BookTempCount > 0
            Player.RemoveItem rBook BookTempCount ;1
            Player.AddItem aaaSFW10XpRewardItem1 (BookTempCount * 10) ;1
        EndIf
    loop
    
    set BookTempCount to Player.GetItemCount SFWBookGeneric450
    If BookTempCount > 0
        Player.RemoveItem SFWBookGeneric450 BookTempCount ;1
        Player.AddItem f (BookTempCount * 450) ;1
    EndIf
    
    set BookTempCount to Player.GetItemCount SFWBookGeneric725
    If BookTempCount > 0
        Player.RemoveItem SFWBookGeneric725 BookTempCount ;1
        Player.AddItem f (BookTempCount * 725) ;1
    EndIf
    
    set BookTempCount to Player.GetItemCount SFWBookGeneric1000
    If BookTempCount > 0
        Player.RemoveItem SFWBookGeneric1000 BookTempCount ;1
        Player.AddItem f (BookTempCount * 1000) ;1
    EndIf

    Player.RemoveItem BooksToCapsITEM 1 1
End

Тоесть процедура замены запускается добавленным предметом, и она состоит из цикла на список из 17 книг и обычных Ифов для 3 особенных книг. Я не разобрался пока как вернуть 2 ответа, чтобы на них распределить всё логичнее. Но как видно, конфликтов быть не должно.

Я не пытался уничтожить существующую систему, а всего-лишь её обошёл немножко

 

Если подшивать, то наверное нужно переименовать все записи в стандарт SFW, и учесть, что сфв-шный список книг (который вообще не использовался) был расширен книгами-копиями и был задействован в цикле как массив

 

Ещё возможно стоит восстановить 2 ветки ответов в вид "Забирай все обычные книги" и "У меня для тебя есть особые книги" (тоесть текст ответов переименовать, а писец будет отвечать типа "молодец, вот твоя награда") - в случае такой структуры диалога скрипт можно разделить на два маленьких.

 

======

Можно циклом обрабатывать оригинальные числовые реплики продажи Fallout 3, Например "Я ПРОДАМ 5 КНИГ" (ПСЕВДОКОД)

foreach ...
    
    If PreviousCount == 0
        set PreviousCount to 5
    EndIf
    
    If GetItemCount BOOKID >= PreviousCount
        set Count to PreviousCount
    Else
        set Count to GetItemCount BOOKID
    EndIf
    

    <ПРОДАТЬ Count>
    PreviousCount = (PreviousCount - Count)
    If PreviousCount == 0
        Break
    EndIf

loop

Для каждой количественной реплики только цифру 5 нужно менять на необходимую.

 

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

 

======

КОРОЧЕ, вся эта химия со списками, массивами и счётчиками позволяет обрабатывать ворох книг Вегаса в "Ванилла-Стайл" Fallout 3... либо тупо моментально продавать все книги без разбора.

 

ЗАЧЕМ? ПРИЧИНЫ? - Система рецептов как-то странно взаимодействует с улучшенными скриптами повторяющегося книжного квеста, что когда вы на верстаке сделаете тысячу книг и соберёте столько-же автолутом, то продажи просто зависнут, как-будто у вас нету книг вообще.

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


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

9 ответов на этот вопрос

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

  • 1

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

Count = BookTempCount

не скомпилируется)

  • Спасибо! 1

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


Ссылка на сообщение
  • 0
scn BooksToCapsInCOUNT

array_var PrewarBookID
ref rBook
int BookTempCount
int PreviousCount
int Count
; HOWMUCHTOSALEVAR - глобальная переменная, в которую диалог запишет количество продаваемых книг

Begin OnAdd Player

    foreach PrewarBookID <- (GetListForms aaaSFWBooksFormList)
        let rBook := *PrewarBookID
        
        BookTempCount = Player.GetItemCount rBook
        
        If BookTempCount > 0
            
            If PreviousCount == 0
                PreviousCount = HOWMUCHTOSALEVAR
            EndIf
            
            If BookTempCount >= PreviousCount
                Count = PreviousCount
            Else
                Count = BookTempCount
            EndIf
            
            
            Player.RemoveItem rBook Count
            Player.AddItem aaaSFW10XpRewardItem1 (Count * 10)
            
            PreviousCount = (PreviousCount - Count)
            
            If PreviousCount == 0
                Break
            EndIf
            
        EndIf
    loop
.......

РЕАЛЬНЫЙ КОД

Изменено пользователем Trust
to / =

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


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

Я предлагаю эту-же реализацию использовать и для продажи всех книг - просто пишем в переменную количества 2000000000 (ДВА МИЛЛИАРДА)

 

    BookTempCount = Player.GetItemCount SFWBookGeneric450
    If BookTempCount > 0
        Player.RemoveItem SFWBookGeneric450 BookTempCount ;1
        Player.AddItem f (BookTempCount * 450) ;1
    EndIf
    
    BookTempCount = Player.GetItemCount SFWBookGeneric725
    If BookTempCount > 0
        Player.RemoveItem SFWBookGeneric725 BookTempCount ;1
        Player.AddItem f (BookTempCount * 725) ;1
    EndIf
    
    BookTempCount = Player.GetItemCount SFWBookGeneric1000
    If BookTempCount > 0
        Player.RemoveItem SFWBookGeneric1000 BookTempCount ;1
        Player.AddItem f (BookTempCount * 1000) ;1
    EndIf

Такой скрипт я предлагаю использовать для всех особенных книг

 

======

ДАЙТЕ МНЕ ПОЖАЛУЙСТА esp С ВОССТАНОВЛЕННЫМИ ДИАЛОГАМИ ПИСЦА ЙЕРЛИНГ

И объясните как делать глобальную переменную, а то я давно не спал, самому читать лень....

 

======

Я могу полную адаптацию сделать хоть за 2 дня, это не проблема.

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


Ссылка на сообщение
  • 0
38 минут назад, Вис691 сказал:

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


Count = BookTempCount

не скомпилируется)

обычный знак равно это алиас или макрос к let varName := Value - это из нвсе или даже джипа. Всё отлично компилится

Может некоторые переменные придётся переименовать, это да 

 

Я сначала пойду посплю, а то я уже двое суток скрипты свои дополняю и оптимизирую

 

======

Мне ваша система нравится очень. Но я как казуал хочу 3000 вегасовских книг продать по принципам трёшки. Я казуал до мозга костей, и ужасный человек...

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


Ссылка на сообщение
  • 0
2 часа назад, Trust сказал:

обычный знак равно это алиас или макрос к let varName := Value - это из нвсе или даже джипа

А, точно, они же в xNVSE понапридумывали кучу нового.

 

3 часа назад, Trust сказал:

И объясните как делать глобальную переменную, а то я давно не спал, самому читать лень....

Сверху в меню Gameplay -> Globals... ну и там ПКМ и как обычно.

3 часа назад, Trust сказал:

Но я как казуал хочу 3000 вегасовских книг продать по принципам трёшки

Что ж за верблюд у вас 3000 книг на себе таскает? :D

 

Мне-то всё равно, какую систему фиксить/оставлять - главное чтобы работала без проблем.

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


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

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

 

 

Но эту секцию надо выполнить однажды при определённых условиях. Я предлагаю сделать что-то типа

 

BEGIN MenuMode
    If BookCountTrigger != 1
        BookCountTrigger = 1
    EndIf
EndIf


BEGIN GameMode

    If ( Yerling.GetDistance2D Player < 500 ) != YearlingNear
        YearlingNear = ( Yerling.GetDistance Player < 500 )
        BookCountTrigger = 1
    EndIf
    
    
    If BookCountTrigger
        
        BookSaleCount = 0
        foreach PrewarBookID <- (GetListForms aaaSFWBooksFormList)
            let rBook := *PrewarBookID
    
            let BookSaleCount += Player.GetItemCount rBook
        loop
    
        ;BookSaleCountSpecial = Player.GetItemCount SFWBookGeneric450 ; Проверить особые книги можно в диалоге, без скрипта
        ;let BookSaleCountSpecial += Player.GetItemCount SFWBookGeneric725
        ;let BookSaleCountSpecial += Player.GetItemCount SFWBookGeneric1000
    
        BookCountTrigger = 0
    EndIf
End

 

И две переменные пишем в глобальные для проверок условий диалога

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


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

Ой, не, так плохо. Нам нет смысла гонять цикл "постоянно" (с поправкой на расстояние). Если возвращаться к диалогам типа "Я продам 5/10/15... книг", то проще всего весь скрипт (тот что отвечает за продажу) вынести в UDF и просто из Result Script диалога его вызывать. Количество книг передавать как переменную. Тогда и глобальные не нужны будут. Таким образом весь скрипт будет срабатывать единожды, только во время диалога и не будет грузить игру лишними проверками. Для диалогов в условия вполне достаточно GetItemCount - он и с форм-листами работает (считает суммарное количество предметов, что нам и нужно).

  • Спасибо! 1

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


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

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

 

И плюс, счётчик нужно вызывать в конце скрипта продажи

 

UPD: Вот я сапог, только сейчас прочитал до конца внимательно

 

scn aaaSFWBooksToCaps

array_var PrewarBookID
ref rBook
int BookTempCount
int NextCount
int Count

int HowMuchToSale

Begin Function { HowMuchToSale }

    NextCount = 0
    foreach PrewarBookID <- (GetListForms aaaSFWBooksFormList)
        let rBook := *PrewarBookID
        
        BookTempCount = (Player.GetItemCount rBook)
        
        If BookTempCount > 0
            
            If NextCount == 0
                NextCount = HowMuchToSale
            EndIf
            
            If BookTempCount >= NextCount
                Count = NextCount
            Else
                Count = BookTempCount
            EndIf
            
            
            Player.RemoveItem rBook Count
            Player.AddItem aaaSFW10XpRewardItem1 (Count * 10)
            
            NextCount -= Count
            
            If NextCount == 0
                Break
            EndIf
            
        EndIf
    loop

End

 

Call aaaSFWBooksToCaps 5

Call aaaSFWBooksToCaps 10

Call aaaSFWBooksToCaps 15

Call aaaSFWBooksToCaps 2000000000 ; СРАЗУ ВСЕ

 

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


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

Мод полностью сделан. Скрипт чистый и логичный, все диалоги работают, названия скриптов в формате СФВ, диалоги Йерлинг восстановлены.

 

Записал Виса в соавторы, теперь можно даже хоть пришить. :)

 

 

 

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


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

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

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

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

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

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

Войти

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

Войти


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