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

Trust

Модмейкер
  • Публикаций

    437
  • Пожертвование

    2 098,51 ₽ 
  • Зарегистрирован

  • Посещение

  • Победитель дней

    21

Сообщения, опубликованные Trust


  1. 14 часов назад, ХАНТЕР73 сказал:

    Да старая же проблема с спешал, витоматиком и обнулением. @Trust твой способ может решить эту проблему? 

    Или старт с запиской не работает?

    Ну не знаю, я всего лишь предложил метод, а как там всё устроено -- я не знаю


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

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

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

     

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

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

     

     

    BooksToCaps.7z


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

     

     

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

     

     


  4. 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

     

     


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

     

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

     

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

     

    BTC-ReducedScript.esp


  6. 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


  7. 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

  8.                 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


  9. Микро-оптимизация. Теперь на холостом ходу обрабатываются 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


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

     

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

     

    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


  11.                 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


  12. В файле этого сообщения в Перке сделана система отложеннго обмена книг, а значит движок игры не насилуется операциями с предметами 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


  13. 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

     

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

     

    • Нравится 1

  14. Я уже говорил, но вы забыли. Ссылка "Посетить Falcon-Lair.com.url" в архивах инсталлера должна называться на английском "Visit Falcon-Lair.com.url"

     

    Иначе глобальный мод не ставится на системы с локалью Украинской, Беларуской, Казахской, Английской итд.

     

    Связано это с тем, что установщик Install Shield работает в кодировке Win-1251 и наглухо не поддерживает юникод!!!

     

    Все файлы внутри архива установщика должны именоваться на английском!!!

     

    Так-же это должно помочь не только пользователям Виндовс с локалями их стран, но и линуксоидам.

    • Нравится 1

  15. 2 часа назад, MagnuMspec сказал:

    @Trust как думаешь, почему книги могут автоматом после подбора подменяться? Лоток тут не при чем, по идее.

    Тогда, если вы будете выдавать чистую книгу вместо ПреВарБук, то отдельный форм-лист создавать не надо. Так и оставьте всё как в этом фиксе, кроме выдачи PreWarBook


  16. 3 часа назад, MagnuMspec сказал:

    @Trust как думаешь, почему книги могут автоматом после подбора подменяться? Лоток тут не при чем, по идее.

    Потому-что перк Книголюб перерабатывает обычные книги в ценные и отбраковку, а книга PreWarBook -- технически обычная, потому эта проблема вылазит.

     

    У @Bulbyan 'а есть этот перк


  17. Я когда пытался исправить продажу книг, я никогда в жизни не думал, что они все не довоенные, и с точки зрения лора их продавать в БС нельзя.

     

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

     

    Я ТОЧНО ЗНАЮ: ВЫ СОБРАЛИСЬ МЕНЯ УВОЛИТЬ!!111

    • Ха-ха 2

  18. Цитата

    Только есть нюанс -- в этих списках из продажи книг есть PreWarBook, и для того, чтобы ваш мод работал более-менее правильно -- эту книгу нужно сдвинуть вконец в списке
    [22:43]
    Тоесть, если перка Книголюб нет, но есть дофига книг превар-бук, то автомат будет всё-равно срабатывать
    [22:44]
    Это можно вылечить лишь создав для него отдельный список, без ПреВар-Бук
    [22:45]
    Даже наличие одной этой книги позволит автомату срабатывать бесконечно
    [22:46]
    .....
    РЕШЕНИЕ:
    Скрипт -- использовать мой вариант
    Список с Превар-Бук -- создать отдельный без

     


  19. edx | 0x36026F3C | RTTI: SandBoxActorPackageData: 41EE26A7 ()

     

    00143973 (v19PGCooke01REF)

    0013BC26 (Vault19a)

     

    Судя по всему, в этом пакете интеллекта очень длинная и тяжёлая анимация, которая не успевает завершиться.

    Либо что-то прямо связанное с анимацией из пакета интеллекта сандбоксинга.

     

    Поскольку рэгдолл-контроллер имеет коллизию, и контролируется файлами анимаций, и управляется всё это пакетом интеллекта... Я и решил: Проблема в анимации пакета интеллекта.

     

    Я сам ничего не тестил, но здесь вот всё, что я накопал из лога.


  20. Магнум, смотри. Чтобы реализовать сохранение навыков, способностей и перков -- надо в QASmoke (тестовую ячейку) заселить непися.

     

    Забить в конфиг джипа, что НПС могут иметь перки!!! Но добавить аннотацию в конфиг REQUIRED FOR NEW CALIFORNIA!!!

     

    Далее, добавить все перки в Форм-Лист, и размотать его циклом If Player.HasPerk rPerk -- RefNPC.AddPerk rPerk -- но здесь надо подумать, перки имеют ранги.

     

    Далее мы копируем статы на непися, и обнуляем игрока.

     

    После завершения мы делаем всё то-же самое, но копируем уже статы и перки с непися на игрока (тоже, разматывая форм-лист циклом)

     

    Причём, вместо Player и REFNPC можно указать в скрипте реф-переменные, чтобы не писать один и тот же код два раза, тоесть, можно сделать код двойного назначения.

     

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

    • Нравится 1

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