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

  • 0
Trust

Продажа книг, уменьшение обращений к диску (ЗАДОЛБАЛ)

Вопрос

UPD: Самая последняя версия будет помечена зелёным, как ответ на вопрос

 

Теперь написано так, я теперь не проверяю конфиг в If и не использую блок Else

BookPrice = GetINIFloat "BooksToCapsOptions:iFixedPrice" "BooksToCaps.ini"
If BookPrice < 1
    BookPrice = Ceil ((Player.GetAV Science)/5 + (Player.GetAV Repair)/5 + (Player.GetAV Medicine)/5 + (Player.GetAV Barter)/5 + (Player.GetAV Survival)/5)
EndIf

iRewardXP = GetINIFloat "BooksToCapsOptions:iRewardXP" "BooksToCaps.ini"
If iRewardXP < 1
    iRewardXP = 10
EndIf

Уменьшение обращений к диску и упрощеие блока If

 

МИКРО-ОПТИМИЗАЦИЯ

 

Изменено пользователем Trust
upd
  • Нравится 1

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


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

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

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

  • 0

Теперь переработан цикл.

GetItemCount в главном цикле используется теперь всего 9 раз, вместо нескольких тысяч при большом количестве книг.

Удалён счётчик и размер массива книг на обмен.

 

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

С удачей 1 шанс найти книги есть, но гораздо меньший. От удачи 10 шанс не зашкаливает

 

 

BooksToCaps.7z

Изменено пользователем Trust
  • Спасибо! 1

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


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

В файле этого сообщения в Перке сделана система отложеннго обмена книг, а значит движок игры не насилуется операциями с предметами AddItem и RemoveItem, тоесть меньше тормозов и глюков инвентаря.

 

Плюс я сделал систему добавления отбраковки с хорошим рандомом

scn aaaSFWbtcBookPerkScrFunc

int i
float BookRandom
int LuckAffects

int CountForExchange

int SFWBookGeneric1000Count
int SFWBookGeneric725Count
int SFWBookGeneric450Count
int PreWarBookCount

int CountDivided
int DivOffset
int RandomBooksCount
int i2

Begin Function { LuckAffects }

    while (Player.GetItemCount aaaSFWBooksFormList)
    
        If (Player.GetItemCount (ListGetNthForm aaaSFWBooksFormList i)) > CountForExchange
            
            CountForExchange += 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
                PreWarBookCount += 1
            EndIf
        Else
        
            If CountForExchange
                Player.RemoveItem (ListGetNthForm aaaSFWBooksFormList i) CountForExchange 1
                CountForExchange = 0
            EndIf
        
            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
    
    

    If PreWarBookCount
    
        CountDivided = PreWarBookCount / (ListGetCount aaaSFWbtcBooksFormList)
        DivOffset = PreWarBookCount % (ListGetCount aaaSFWbtcBooksFormList)
        i2  = 0
        
        If CountDivided
        
            If (ListGetCount aaaSFWbtcBooksFormList) % 2
                i2 = 1
                Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList 0) (CountDivided + DivOffset) 1
                DivOffset = 0
            EndIf
        
            While i2 < (ListGetCount aaaSFWbtcBooksFormList)
            
                RandomBooksCount = (Rand 0.20, 0.33) * CountDivided
                Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList i2) (CountDivided - RandomBooksCount + DivOffset) 1
                DivOffset = 0
                
                Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList (i2 + 1)) (CountDivided + RandomBooksCount) 1
                
                i2 += 2
            Loop
        
        Else
        
            Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList (GetRandomInRange 0 (ListGetCount aaaSFWbtcBooksFormList + 1))) DivOffset 1
        
        EndIf
        
        PreWarBookCount = 0
    
    EndIf
    
End

 

BTC-ReducedScript.esp

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


Ссылка на сообщение
  • 0
                If CountDivided > 30
                    RandomBooksCount = (Rand 0.10, 0.20) * CountDivided
                ElseIf CountDivided > 15
                    RandomBooksCount = (Rand 0.20, 0.34) * CountDivided
                ElseIf CountDivided > 7
                    RandomBooksCount = (Rand 0.34, 0.50) * CountDivided
                Else
                    RandomBooksCount = (Rand 0.50, 0.75) * CountDivided
                EndIf

 

Процент меняется от количества книг в стопке, так-как 20%-33% для большого количества слишком большой, а для малого количества слишком незначительный

 

(УСИЛЕНИЕ ЭНТРОПИИ)

BTC-ReducedScript.esp

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


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

В этой версии отремонтировано влияние удачи на все виды ценных книг, применена нормальная формула расширяющая процентные соотношения.

 

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

 

scn aaaSFWbtcBookPerkScrFunc

int i
int LuckAffects

float BookRandom
float Treshold1000
float Treshold725
float Treshold450

int CountForExchange

int SFWBookGeneric1000Count
int SFWBookGeneric725Count
int SFWBookGeneric450Count
int PreWarBookCount

int CountDivided
int DivOffset
int RandomBooksCount
int i2



Begin Function { LuckAffects }

    while (Player.GetItemCount aaaSFWBooksFormList)
    
        If (Player.GetItemCount (ListGetNthForm aaaSFWBooksFormList i)) > CountForExchange
            
            CountForExchange += 1
            
            If LuckAffects
                Treshold1000 = 99 - (Player.GetAV Luck) / 10    ; Luck 10 = 98 (2%)
                Treshold725  = 97 - (Player.GetAV Luck) / 5     ;         = 95 (3%)
                Treshold450  = 94 - (Player.GetAV Luck) / 3.333 ;         = 91 (4%)
            Else
                Treshold1000 = 99
                Treshold725  = 97
                Treshold450  = 94
            EndIf
            
            BookRandom = Rand 0.00, 100.00  ; FLOAT
            
            If BookRandom > Treshold1000
                SFWBookGeneric1000Count += 1
                
            ElseIf BookRandom > Treshold725
                SFWBookGeneric725Count += 1
                
            ElseIf BookRandom > Treshold450
                SFWBookGeneric450Count += 1
                
            Else
                PreWarBookCount += 1
            EndIf
        Else
        
            If CountForExchange
                Player.RemoveItem (ListGetNthForm aaaSFWBooksFormList i) CountForExchange 1
                CountForExchange = 0
            EndIf
        
            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
    
    

    If PreWarBookCount
    
        CountDivided = PreWarBookCount / (ListGetCount aaaSFWbtcBooksFormList)
        DivOffset = PreWarBookCount % (ListGetCount aaaSFWbtcBooksFormList)
        i2  = 0
        
        If CountDivided
        
            If (ListGetCount aaaSFWbtcBooksFormList) % 2
                i2 = 1
                Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList 0) (CountDivided + DivOffset) 1
                DivOffset = 0
            EndIf
        
            While i2 < (ListGetCount aaaSFWbtcBooksFormList)
            
                If CountDivided > 30
                    RandomBooksCount = (Rand 0.10, 0.20) * CountDivided
                ElseIf CountDivided > 15
                    RandomBooksCount = (Rand 0.20, 0.34) * CountDivided
                ElseIf CountDivided > 7
                    RandomBooksCount = (Rand 0.34, 0.50) * CountDivided
                Else
                    RandomBooksCount = (Rand 0.50, 0.75) * CountDivided
                EndIf
                
                Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList i2) (CountDivided - RandomBooksCount + DivOffset) 1
                DivOffset = 0
                
                Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList (i2 + 1)) (CountDivided + RandomBooksCount) 1
                
                i2 += 2
            Loop
        
        Else
        
            Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList (GetRandomInRange 0 (ListGetCount aaaSFWbtcBooksFormList + 1))) DivOffset 1
        
        EndIf
        
        PreWarBookCount = 0
    
    EndIf
    
End

 

BTC-ReducedScript.esp

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


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

Микро-оптимизация. Теперь на холостом ходу обрабатываются 3 блока If вместо 6, тоесть, скрипт жрёт впустую в 2 раза меньше процессорного времени, когда книг нет

 

    If SFWBookGeneric1000Count || SFWBookGeneric725Count || SFWBookGeneric450Count
        ShowMessage aaaSFWbtcBooksVALUABLEmsg

        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
    
    EndIf

 

BTC-ReducedScript.esp

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


Ссылка на сообщение
  • 0
                RandomMin = 1 / (fsqrt CountDivided)
                RandomMax = 2 / (fsqrt CountDivided)
            
                If CountDivided > 1
                    RandomBooksCount = (Rand RandomMin, RandomMax) * CountDivided - 1
                Else
                    RandomBooksCount = 0
                EndIf

Теперь рандомное количество книг считается без хардкода, на нормальном алгоритме.

Суть заключается в том, что при делении 1 и 2 (мин-макс) на квадратный корень от стопки, получаются Float-множители, которые я вписываю в рандом, и умножаю на них стопку. Для совсем малых чисел я отнимаю еденицу, чтобы не возникала ситуация, когда добавляемое число становится равным нулю (это в операции Эдд Айтем вызывает ошибку)

 

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

BTC-ReducedScript.esp

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


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

int i
int LuckAffects
int LuckValue

float BookRandom
float Treshold1000
float Treshold725
float Treshold450

int CountForExchange

int SFWBookGeneric1000Count
int SFWBookGeneric725Count
int SFWBookGeneric450Count
int PreWarBookCount

int CountDivided
int DivOffset
int RandomBooksCount
int i2

float RandomMin
float RandomMax

int RecycleArrSize
int PreBookArrSize

Begin Function { LuckAffects }

    If Player.GetItemCount aaaSFWBooksFormList

        RecycleArrSize = ListGetCount aaaSFWbtcBooksFormList
        PreBookArrSize = ListGetCount aaaSFWBooksFormList

        LuckValue = Player.GetAV Luck

        If LuckAffects
            Treshold1000 = 99 - LuckValue / 10    ; Luck 10 = 98 (2%)
            Treshold725  = 97 - LuckValue / 5     ;         = 95 (3%)
            Treshold450  = 94 - LuckValue / 3.333 ;         = 91 (4%)
        Else
            Treshold1000 = 98.5                   ;    EQ 5 = 1.5%
            Treshold725  = 96.0                   ;         = 2.5%
            Treshold450  = 92.5                   ;         = 3.5%
        EndIf
        
    EndIf
    
    
    
            
    While (Player.GetItemCount aaaSFWBooksFormList)
    
        If (Player.GetItemCount (ListGetNthForm aaaSFWBooksFormList i)) > CountForExchange
            
            CountForExchange += 1
            
            BookRandom = Rand 0.00, 100.00  ; FLOAT
            
            If BookRandom > Treshold1000
                SFWBookGeneric1000Count += 1
                
            ElseIf BookRandom > Treshold725
                SFWBookGeneric725Count += 1
                
            ElseIf BookRandom > Treshold450
                SFWBookGeneric450Count += 1
                
            Else
                PreWarBookCount += 1
            EndIf
        Else
        
            If CountForExchange
                Player.RemoveItem (ListGetNthForm aaaSFWBooksFormList i) CountForExchange 1
                CountForExchange = 0
            EndIf
        
            i += 1
      
            If i >= PreBookArrSize
                i = 0
            EndIf
        EndIf
        
    Loop

    
    
    
    If SFWBookGeneric1000Count || SFWBookGeneric725Count || SFWBookGeneric450Count
        ShowMessage aaaSFWbtcBooksVALUABLEmsg

        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
    
    EndIf
    


    If PreWarBookCount
    
        CountDivided = PreWarBookCount / RecycleArrSize
        DivOffset = PreWarBookCount % RecycleArrSize
        ;i2  = 0 ; ТИП "ФУНКЦИЯ" НЕ СОХРАНЯЕТ ПЕРЕМЕННЫЕ
        
        
        If DivOffset
            Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList (GetRandomInRange 0 (RecycleArrSize + 1))) DivOffset 1
        EndIf
        
        
        If CountDivided
        
            RandomMin = 1 / (fsqrt CountDivided)
            RandomMax = 2 / (fsqrt CountDivided)
        
            If RecycleArrSize % 2
                i2 = 1
                Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList 0) CountDivided 1
            EndIf
        
            While i2 < RecycleArrSize
            
                If CountDivided > 1
                    RandomBooksCount = (Rand RandomMin, RandomMax) * CountDivided - 1
                Else
                    RandomBooksCount = 0
                EndIf
                
                Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList i2) (CountDivided - RandomBooksCount) 1
                
                Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList (i2 + 1)) (CountDivided + RandomBooksCount) 1
                
                i2 += 2
            Loop
        
        EndIf
        
        ;PreWarBookCount = 0 ; ТИП "ФУНКЦИЯ" НЕ СОХРАНЯЕТ ПЕРЕМЕННЫЕ
    
    EndIf
    
End

 

BTC-ReducedScript.esp

  • Нравится 1

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


Ссылка на сообщение
  • 0
        LuckValue = Player.GetAV Luck
        If LuckValue > 10
            LuckValue = 10
        EndIf

 

BTC-ReducedScript.esp

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


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


int HowMuchToSale
ref BookListSFWbtc
ref rBookSFWbtc
int Count
int BookPrice
int iRewardXP

Begin Function { HowMuchToSale }

    BookPrice = GetINIFloat "BooksToCapsOptions:iFixedPrice" "BooksToCaps.ini"
    If BookPrice < 1
        BookPrice = (Player.GetAV Science)/5 + (Player.GetAV Repair)/5 + (Player.GetAV Medicine)/5 + (Player.GetAV Barter)/5 + (Player.GetAV Survival)/5
    EndIf

    iRewardXP = GetINIFloat "BooksToCapsOptions:iRewardXP" "BooksToCaps.ini"
    If iRewardXP < 1
        iRewardXP = 10
    EndIf

    If aaaSFWbtcBookPerkQuest.BookPerk > 99
        BookListSFWbtc = aaaSFWbtcBooksFormList
    Else
        BookListSFWbtc = aaaSFWBooksFormList
    EndIf


    ForEach rBookSFWbtc <- BookListSFWbtc
    
        Count = Player.GetItemCount rBookSFWbtc
        
        If Count < 1
            Continue
        EndIf
        
        If Count > HowMuchToSale
            Count = HowMuchToSale
        EndIf
        
        Player.RemoveItem rBookSFWbtc Count
        Player.AddItem f (Count * BookPrice)
        RewardXP (Count * iRewardXP)
        
        aaaSFWbtcBookPerkQuest.BookPerk += Count
        
        HowMuchToSale -= Count
        
        If HowMuchToSale < 1
            Break
        EndIf
        
    Loop


    
    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

 

BTC-ReducedScript.esp

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


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

ИСПРАВЛЕНА КРИТИЧЕСКАЯ ОШИБКА

 

И... Множитель коэффициента вынесен из цикла (микро-оптимизация)

 

            RandomMin = 1 / (fsqrt CountDivided) * CountDivided
            RandomMax = 2 / (fsqrt CountDivided) * CountDivided
        
            While i2 < RecycleArrSize
            
                If CountDivided > 1
                    RandomBooksCount = (Rand RandomMin, RandomMax) - 1

 

BTC-ReducedScript.esp

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


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

int i
int LuckAffects
int LuckValue

float BookRandom
float Treshold1000
float Treshold725
float Treshold450

int CountForExchange

int SFWBookGeneric1000Count
int SFWBookGeneric725Count
int SFWBookGeneric450Count
int PreWarBookCount

int CountDivided
int DivOffset
int RandomBooksCount
int i2

float RandomMin
float RandomMax

int RecycleArrSize
int PreBookArrSize

Begin Function { LuckAffects }

    If Player.GetItemCount aaaSFWBooksFormList

        RecycleArrSize = ListGetCount aaaSFWbtcBooksFormList
        PreBookArrSize = ListGetCount aaaSFWBooksFormList

        LuckValue = Player.GetAV Luck
        If LuckValue > 10
            LuckValue = 10
        EndIf

        If LuckAffects
            Treshold1000 = 99 - LuckValue / 10    ; Luck 10 = 98 (2%)
            Treshold725  = 97 - LuckValue / 5     ;         = 95 (3%)
            Treshold450  = 94 - LuckValue / 3.333 ;         = 91 (4%)
        Else
            Treshold1000 = 98.5                   ;    EQ 5 = 1.5%
            Treshold725  = 96.0                   ;         = 2.5%
            Treshold450  = 92.5                   ;         = 3.5%
        EndIf
        
    EndIf
    
    
    
            
    While Player.GetItemCount aaaSFWBooksFormList
    
        If Player.GetItemCount (ListGetNthForm aaaSFWBooksFormList i) > CountForExchange
            
            CountForExchange += 1
            
            BookRandom = Rand 0.00, 100.00  ; FLOAT
            
            If BookRandom > Treshold1000
                SFWBookGeneric1000Count += 1
                
            ElseIf BookRandom > Treshold725
                SFWBookGeneric725Count += 1
                
            ElseIf BookRandom > Treshold450
                SFWBookGeneric450Count += 1
                
            Else
                PreWarBookCount += 1
            EndIf
        Else
        
            If CountForExchange
                Player.RemoveItem (ListGetNthForm aaaSFWBooksFormList i) CountForExchange 1
                CountForExchange = 0
            EndIf
        
            i += 1
      
            If i >= PreBookArrSize
                i = 0
            EndIf
        EndIf
        
    Loop

    
    
    
    If SFWBookGeneric1000Count || SFWBookGeneric725Count || SFWBookGeneric450Count
        ShowMessage aaaSFWbtcBooksVALUABLEmsg

        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
    
    EndIf
    


    If PreWarBookCount
    
        CountDivided = PreWarBookCount / RecycleArrSize
        DivOffset = PreWarBookCount % RecycleArrSize
        ;i2  = 0 ; ТИП "ФУНКЦИЯ" НЕ СОХРАНЯЕТ ПЕРЕМЕННЫЕ
        
        
        If DivOffset
            Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList (GetRandomInRange 0 RecycleArrSize)) DivOffset 1
        EndIf
        
        
        If CountDivided
        
            RandomMin = 1 / (fsqrt CountDivided) * CountDivided - 1
            RandomMax = 2 / (fsqrt CountDivided) * CountDivided - 1
        
            If RecycleArrSize % 2
                i2 = 1
                Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList 0) CountDivided 1
            EndIf
        
            While i2 < RecycleArrSize
            
                If CountDivided != 1
                    RandomBooksCount = Rand RandomMin, RandomMax
                ;Else
                ;    RandomBooksCount = 0 ; ТИП "ФУНКЦИЯ" НЕ СОХРАНЯЕТ ПЕРЕМЕННЫЕ,
                                          ; в данном случае CountDivided всегда одинаково на всех итерациях
                EndIf

                
                Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList i2) (CountDivided - RandomBooksCount) 1
                
                Player.AddItem (ListGetNthForm aaaSFWbtcBooksFormList (i2 + 1)) (CountDivided + RandomBooksCount) 1
                
                i2 += 2
            Loop
        
        EndIf
        
        ;PreWarBookCount = 0 ; ТИП "ФУНКЦИЯ" НЕ СОХРАНЯЕТ ПЕРЕМЕННЫЕ
    
    EndIf
    
End

 

 

BTC-ReducedScript.esp

scn aaaSFWbtcBookPerkScrFunc int iint LuckAffectsint LuckVal.pdf

 

 

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


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

Оказывается, некоторые переменные функция сохраняет, что приводит к ошибкам в текущем коде. ИСПРАВЛЕНО.

 

 

UPD: я просто окунь. Функция не сохраняет квестовые переменные. Я просто задержку квестового скрипта принял за ошибку, когда создал много книг, и сразу посмотрел в инвентарь

 

 

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


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

Теперь в конфиге есть множитель цены ценных книг

 

BooksToCaps.7z

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


Ссылка на сообщение
  • 0
В 24.10.2023 в 18:54, Trust сказал:

Теперь переработан цикл.

Спасибо! Подшил.)

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


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

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

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

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

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

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

Войти

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

Войти


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