Под этим солнцем и небом мы тепло приветствуем Вас, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Бухта 2.0. Тёплая. Ламповая. Твоя.

Автор Тема: Нужен совет по скриптам  (Прочитано 6911 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Necromaxer

  • *
  • Сообщений: 3
  • Пол: Мужской
Нужен совет по скриптам
« : 30 Ноября 2013, 08:58 »
0
В общем, начал переводить плагин для Обливиона. Пользуюсь TES CS Extender'ом. Как полагается, извлёк имена, книги, сообщения и т.д. Но таким образом всё не извлекается. Если открыть редактор скриптов, то можно обнаружить кучу не переведённого текста - те же messageboxes, диалоги и т.д. Всё бы хорошо - переводим, компилим, переходим к следующему скрипту. Но в некоторых случаях скрипт не компилится, а редактор выдаёт ошибки. Например:
Спойлер - скрытое:
The identifier "rand" is reserved for a script command.
Variable "ri" unreferenced in local context.
Variable "qp" unreferenced in local context.
Variable "qpn" unreferenced in local context.
Compilation of script "...." halted - Couldn't recover from previous errors.
То есть, скрипт с переведённым текстом сохранить невозможно. Причём если открыть нетронутый оригинальный скрипт и попробовать его скомпилировать, будет то же самое. В одном случае получил ошибку
Спойлер - скрытое:
Redeclaration of variable "item_list"
Compilation of script "...." halted - Couldn't recover from previous errors.
В этом случае удалил строку, выделенную красным в редакторе "array_var item_list". После этого скрипт скомпилировался. Но не уверен можно ли так делать. Третий день гуглю по этому вопросу и ничего. Как-будто только я с таким сталкивался. А вопрос такой - эти ошибки можно\нужно как-то исправлять или лучше оставить как есть, вытащить все скрипты с помощью Wrye Bash, перевести и импортировать обратно? Ведь TES CS не зря паникует?
CS Extender запускаю через obse_loader с параметром -editor, всё как положено. Все библиотеки присутствуют.
Думаю здесь есть люди, которые много переводят и знают как себя вести в таком случае. Заранее благодарен.

Оффлайн AleksTirex

  • *
  • Сообщений: 424
Нужен совет по скриптам
« Ответ #1 : 30 Ноября 2013, 15:49 »
0
Скинь под спойлер полный текст этого скрипта (первый скрипт), посмотрим проблему.
Удалять что-либо из скрипта нельзя, если тот до этого работал.
Универсального решения на всё это нет, всё зависит от конкретного случая/проблемы.
Награды Орден "Ремесленник" - за уникальный плагин "Мелисса"  Орден "Ремесленник" - за мод "Сказка о потерянном счастье"

Оффлайн Necromaxer

  • *
  • Сообщений: 3
  • Пол: Мужской
Нужен совет по скриптам
« Ответ #2 : 30 Ноября 2013, 19:21 »
0
Вот первый проблемный скрипт:
Спойлер - скрытое:
ScriptName EElocalEconomyMenus

short menu
short button
short i
short eeTemp

ref eeMerchant

float eeTempF
array_var item_list
array_var item_relations
short menu_index
short menu_sub_index
short menu_index_top
short menu_mode
array_var a1
array_var a2
array_var menu_array
array_var menu_array_names
string_var menu_name
string_var sub_menu_name
string_var s1
string_var s2
short price_selector

array_var merchant_list
short priceDataIndex

array_var item_list
array_var repriced_refs
array_var repriced_vals
ref item
float price

float fQuestDelayTime



Begin MenuMode

   let fQuestDelayTime := 0.01


   if MenuMode 1002
      if IsConsoleOpen==0
         if OnKeyDown tnoEE.menuKey
            if tnoEE.resetKey || tnoEE.useLocationPrices > 0 || tnoEE.useMerchantPrices > 0 || tnoEEM.priceReadingEnabled
               let menu := -1
            endif
         endif
      endif
   endif
   
   
   if menu > 0
      let button := GetButtonPressed
   else
      let button := -1
   endif
   
   if menu == -1
   
      SetDebugMode tnoEE.debug
      
      let s1 := "Enhanced Economy options"
      if tnoEE.resetKey
         let s1 += "|Reset merchants"
         let i := 1
         let priceDataIndex := 1
      else
         let i := 0
         let priceDataIndex := 0
      endif
      if tnoEE.useLocationPrices > 0
         let s1 += "|Location prices"
         let priceDataIndex += 1
      endif
      if tnoEE.useMerchantPrices > 0
         let s1 += "|Merchant prices"
         let priceDataIndex += 1
      endif
      if tnoEEM.priceReadingEnabled
         let s1 += "|Read price data"
      else
         let priceDataIndex := -1
      endif
      let s1 += "|Cancel"
      MessageBoxEx $s1
      let menu := 1
   
   elseif menu == 1
      if button == -1
         return
      endif
      if button == 0 && tnoEE.resetKey
         let menu := -10
      else
         if tnoEE.useLocationPrices > 0
            if button == i
               let menu := -20
               let menu_mode := 0
               let menu_name := "Location"
               let menu_array := tnoEE.location_prices
               return
            endif
            let i += 1
         endif

         if tnoEE.useMerchantPrices > 0 && button == i
            let menu := -20
            let menu_mode := 1
            let menu_name := "Merchant"
            let menu_array := tnoEE.merchant_prices
            return
         endif

         if button == priceDataIndex
            let menu := -60
            return
         endif
         
         let menu := 0
      endif

   elseif menu == -10
      let s1 := "Enhanced Economy will now reset all merchants' barter gold"
      if tnoEE.autoHaggle == 0 && tnoEE.haggleLimit > 0
         let s1 += " and haggle count"
      endif
      let s1 += ".%rAre you sure?|OK|Cancel"
      MessageBoxEx $s1
      let menu := 10
   elseif menu == 10
      if button == 0
         let tnoEEM.merchant_list := ar_Construct Array
         DebugPrint "EE:Resetting merchant list"
         let menu := 0
      elseif button == 1
         let menu := 0
      endif

   elseif menu == -20
      MessageBoxEx "Enhanced Economy %z dependent prices:|Reset all|Edit|Close", menu_name
      let menu := 20
   elseif menu == 20
      if button == 0
         let menu := -21
      elseif button == 1
         let menu_index := 0
         let menu_index_top := 0
         let menu_array_names := ar_Construct Array
         ForEach a1 <- menu_array
            let menu_array_names[menu_index_top] := a1["Key"]
            let menu_index_top += 1
         Loop
         let item_list := ar_Construct Array
         let item_list[0] := "All"
           let item_list[1] := "Armor"
         let item_list[2] := "LiShield"
         let item_list[3] := "LiArmor"
         let item_list[4] := "HeShield"
         let item_list[5] := "HeArmor"
         let item_list[6] := "RprHammer"
         let item_list[7] := "Weapon"
         let item_list[8] := "Blade"
         let item_list[9] := "Blunt"
         let item_list[10] := "Bow"
         let item_list[11] := "Arrow"
         let item_list[12] := "Magic"
         let item_list[13] := "Staff"
         let item_list[14] := "Scroll"
         let item_list[15] := "SoulGem"
         let item_list[16] := "Ayleid"
         let item_list[17] := "Furniture"
         let item_list[18] := "Book"
         let item_list[19] := "Ingredient"
         let item_list[20] := "Food"
         let item_list[21] := "Drink"
         let item_list[22] := "Potion"
         let item_list[23] := "Apparatus"
         let item_list[24] := "Jewelry"
         let item_list[25] := "Clothes"
         let item_list[26] := "ClothesLo"
         let item_list[27] := "ClothesMi"
         let item_list[28] := "ClothesUp"
         let item_list[29] := "Misc"
         let item_list[30] := "LockPick"
         let item_list[31] := "Gems"
         let item_list[32] := "Cloth"
         let item_list[33] := "MiscLower"
         let item_list[34] := "MiscMiddle"
         let item_list[35] := "MiscUpper"
         let item_list[36] := "Pelt"
         let item_list[37] := "Enchanted"
         
         let menu := -30
       
      elseif button == 2
         let menu := 0
      endif

   elseif menu == -21
      MessageBoxEx "Enhanced Economy will now reset all %z dependent prices to default.%rAre you sure?|OK|Cancel", menu_name
      let menu := 21
   elseif menu == 21
      if button == 0
         let a1 := ar_Null
         ForEach a1 <- menu_array
            let a2 := a1["Value"]
            let eeTemp := ar_Size a2
            ar_Erase a2 "-":"aaa"
            let i := ar_Size a2
            if i != eeTemp
               let s1 := a1["Key"]
               DebugPrint "EE:%z reduced from %.0f to %.0f elements", s1, eeTemp, i
            endif
         Loop
         let a2 := ar_Null
         let menu := 0
      elseif button == 1
         let menu := 0
      endif

   elseif menu == -30
      let s1 := "Enhanced Economy " + menu_name + "s.%rClick to edit."
      let i := menu_index
      While i < menu_index + 7
         let s1 += "|" + menu_array_names
         let i += 1
      Loop
      if menu_index > 0
         let s1 += "|< Previous"
      endif
      if menu_index + 7 < menu_index_top
         let s1 += "|> Next"
      endif
      let s1 += "|Close"
      MessageBoxEx $s1
      let menu := 30

   elseif menu == 30
      if button >= 0 && button < 7
         let i := menu_index + button
         let sub_menu_name := menu_array_names
         let menu_sub_index := 0
         let menu_index_top := ar_Size item_list
         if menu_mode == 0
            let menu_index_top -= 1
         endif
         let menu_array := menu_array[$sub_menu_name]
         let menu := -40
      elseif button == 7 && menu_index > 0
         let menu_index -= 7
         if menu_index < 0
            let menu_index := 0
         endif
         let menu := -30
      elseif (button == 7 && menu_index == 0) || (button == 8 && menu_index > 0 && menu_index + 7 < menu_index_top)
         let menu_index += 7
         if menu_index + 7 > menu_index_top
            let menu_index := menu_index_top - 7
         endif
         let menu := -30
      elseif button > 0
         let menu := -100 ; cleanup
      endif

   elseif menu == -40
      let s1 := "Enhanced Economy " + menu_name + " settings: " + sub_menu_name + "%rClick to edit."

      let i := menu_sub_index
      While i < menu_sub_index + 7
         let s2 := item_list
         let eeTempF := Call EElocalEconomyFindPrice menu_array ar_Null s2 1
         if price_selector < 2
            let s1 += sv_Construct "|%z - %.2f", s2, eeTempF
            if price_selector == 0
               let s1 += "*"
            endif
         else
            let s1 += sv_Construct "|%z - (%.2f)", s2, eeTempF
         endif
         let i += 1
      Loop
      if menu_sub_index > 0
         let s1 += "|< Previous"
      endif
      if menu_sub_index + 7 < menu_index_top
         let s1 += "|> Next"
      endif
      let s1 += sv_Construct "|^Up to %zs", menu_name
      MessageBoxEx $s1
      let menu := 40
      
   elseif menu == 40
      if button >= 0 && button < 7
         let i := menu_sub_index + button
         let s2 := item_list
         let menu := -50
      elseif button == 7 && menu_sub_index > 0
         let menu_sub_index -= 7
         if menu_sub_index < 0
            let menu_sub_index := 0
         endif
         let menu := -40
      elseif (button == 7 && menu_sub_index == 0) || (button == 8 && menu_sub_index > 0 && menu_sub_index + 7 < menu_index_top)
         let menu_sub_index += 7
         if menu_sub_index + 7 > menu_index_top
            let menu_sub_index := menu_index_top - 7
         endif
         let menu := -40
      elseif button > 0
         let menu_index_top := ar_Size menu_array_names
         if menu_mode == 0
            let menu_array := tnoEE.location_prices
         else
            let menu_array := tnoEE.merchant_prices
         endif
         let menu := -30
      endif

   elseif menu == -50
      if IsTextInputInUse
         MessageBox "Text Input box is busy!"
         let menu := 0
         return
      endif

      let eeTempF := Call EElocalEconomyFindPrice menu_array ar_Null s2 1
      let s1 := sv_Construct "New value for %z %z, with current effective value %.2f%rEmpty means value is inherited by parent.%r", menu_name, sub_menu_name, eeTempF
      if price_selector == 0
         let s1 += "|Reset"
      endif
      let s1 += "|OK|Cancel"
      OpenTextInput $s1 0 6
      if price_selector < 2
         if (Floor eeTempF) == eeTempF
            InsertInInputText "%.0f" eeTempF
         else
            let eeTemp := eeTempF * 10
            if (Floor eeTemp) == eeTempF*10
               InsertInInputText "%.1f" eeTempF
            else
               InsertInInputText "%.2f" eeTempF
            endif
         endif
      endif
      let menu := 50
      
   elseif menu == 50
      if button == -1
         UpdateTextInput
      else
         if button == 0 && price_selector == 0
            let s1 := "-" + s2
            ar_Erase menu_array $s1
         elseif button == 0 || (button == 1 && price_selector == 0)
            set s1 to GetInputText
            if sv_Length s1 == 0
               let s1 := "-" + s2
               ar_Erase menu_array $s1
            else
               let eeTempF := sv_ToNumeric s1
               let s2 := "-" + s2
               let menu_array[$s2] := eeTempF
            endif
         endif   
         CloseTextInput
         let menu := -40
      endif

   elseif menu == -60
      let item_list := ar_Construct Array
      let i := 0
      SetString -2010 "Enhanced Economy\*.txt"
      FindFirstFile -2011 -2010 1
      While (StringLen -2011) > 0
         Set s1 to ToOBSE -2011
         let item_list := s1
         let i += 1
         FindNextFile -2011
      Loop

      if i == 0
         MessageBox "No price files are found in 'Data\Enhanced Economy\!"
         let menu := 0
         return
      endif

      Call EElocalEconomyResetPrices

      let menu_index := 0
      let menu_index_top := i
      let menu := -61
      
   elseif menu == -61
      let s1 := "Choose Price file"
      let i := menu_index
      While i < menu_index + 7 && i < menu_index_top
         let s2 := item_list
         let s2 := s2[0:-5]
         let s1 += "|" + s2
         let i += 1
      Loop
      let priceDataIndex := i - menu_index
      if menu_index > 0
         let s1 += "|< Previous"
      endif
      if menu_index + 7 < menu_index_top
         let s1 += "|> Next"
      endif
      let s1 += "|Close"
      MessageBoxEx $s1
      let menu := 61
      
   elseif menu == 61
      if button == -1
         return
         
      elseif button < priceDataIndex
         let i := menu_index + button
         let sub_menu_name := item_list
         let menu := -62
      elseif button == priceDataIndex && menu_index > 0
         let menu_index -= 7
         if menu_index < 0
            let menu_index := 0
         endif
         let menu := -61
      elseif (button == priceDataIndex || (button == 8 && menu_index > 0)) && menu_index + 7 < menu_index_top
         let menu_index += 7
         if menu_index + 7 > menu_index_top
            let menu_index := menu_index_top - 7
         endif
         let menu := -61
      else
         let menu := -100 ; cleanup
      endif

   elseif menu == -62
      let eeTemp := Call EEreadPrices sub_menu_name
      if eeTemp == -2
         MessageBox "Unable to read the file!"
         let menu := 63
      elseif eeTemp == -1
         MessageBox "Invalid price file!"
         let menu := 63
      else
         let s2 := sv_Construct "%0.f items will change prices. Continue?|OK|Cancel", eeTemp
         let s1 := s1 + "%r" + s2
         MessageBoxEx $s1
         let menu := 62
      endif
   elseif menu == 62
      if button == -1
         return
      elseif button == 0
         let i := 0
         While i < eeTemp
            let item := repriced_refs
            let price := repriced_vals
            let eeTempF := GetGoldValue item
            SetGoldValue price item
            DebugPrint "EE:Change val of %n (%i) from %.0f to %.0f", item, item, eeTempF, price
            let i += 1
         Loop
         MessageBox "Changed price of %.0f items!", eeTemp
         let button := -1
         let menu := 63
      else
         let menu := -61
      endif
   elseif menu == 63
      if button == 0
         let menu := -61
      endif


   elseif menu == -100
      sv_Destruct menu_name
      sv_Destruct sub_menu_name
      sv_Destruct s1
      sv_Destruct s2
      let menu_array := ar_Null
      let menu_array_names := ar_Null
      let item_list := ar_Null
      let menu := 0
      let repriced_refs := ar_Null
      let repriced_vals := ar_Null
   endif

End
Отсюда  удалял "array_var item_list" - повторяется дважды.
И второй, который ругается на "rand" и переменные "ri", "qp", "qpn":
Спойлер - скрытое:
ScriptName EEquestContainer

ref container
ref itemRef

short containers
short rand
short questVal
short ri

array_var qp
array_var qpn


Begin Function {container}

   if (container.GetItemCount eeQuestItemToken) > 0
      return
   endif
   if container.ModelPathIncludes "Sack"
      return
   endif
   if container.ModelPathIncludes "HangingCorpse"
      return
   endif
   if container.ModelPathIncludes "Rock"
      return
   endif
   if container.ModelPathIncludes "RoastRat"
      return
   endif
   if container.GetLockLevel == 100
      if container.GetLocked
         DebugPrint "EE:Don't place quest item in containers needing a key"
         return
      endif
   endif
   if container.GetSourceModIndex
      DebugPrint "EE:Don't place quest item in containers added by mods"
      return
   endif
   
   if eval (ar_Size tnoEEQ.active_quest_data) == 10
      let itemRef :=  tnoEEQ.active_quest_data[9]
      if itemRef == container
         ; Quest item must be here
         let itemRef := tnoEEQ.questItem
         if (container.GetItemCount itemRef) == 0
            DebugPrint "EE:Re-adding %n for quest %.0f", itemRef, tnoEEQ.active_questId
            container.AddItemNS itemRef 1
         endif
      endif
      let tnoEEq.quest_popup := 1
      return
   endif
   
   ; May find quest item here
   let containers := 0 - tnoEEQ.active_quest_data[2][tnoEEQ.active_quest_location]
   if containers > 0
      let rand := tnoEEQ.randvar
      if rand == 0
         let rand := GetRandomPercent
      else
         let tnoEEQ.randvar := 0
      endif
      let questVal := 100 / Pow containers tnoEE.questContainerChance
      DebugPrint "EE: %.0f containers to choose between, chance %.0f, seed %.0f", containers, questVal, rand
      let itemRef := tnoEEQ.questItem
      if containers == 1 || questVal > rand
         DebugPrint "EE: Found quest item %n", itemRef
;         let tnoEEQ.active_quest_data[2][tnoEEQ.active_quest_location] := -1
         let tnoEEQ.active_quest_data[9] := container
         if tnoEE.merchantQuests_questItems
            DebugPrint "EE: Make %n a quest item", itemRef
            SetQuestItem 1 itemRef
         endif
         container.AddItemNS itemRef 1
         let tnoEEq.quest_popup := 1
      else
         container.AddItemNS eeQuestItemToken 1
         let tnoEEQ.active_quest_data[2][tnoEEQ.active_quest_location] := 1 - containers
      endif
   endif
   
End

Оффлайн AleksTirex

  • *
  • Сообщений: 424
Нужен совет по скриптам
« Ответ #3 : 01 Декабря 2013, 03:19 »
0
Цитировать
Отсюда  удалял "array_var item_list" - повторяется дважды.
Совершенно верно, это надо удалять.

Цитировать
И второй, который ругается на "rand" и переменные "ri", "qp", "qpn":
rand - это функция OBSE, поэтому переменная не может быть с таким именем. Переименуй все rand в данном скрипте на... , например randz.

Переменные... вот фиг его знает, они в данном скрипте не используются. Скорее всего, этот скрипт для этих переменных выступает как хранилище, т.е. эти переменные где-то обрабатываются и здесь просто хранятся. Через "Поиск" попробуй найти тот скрипт(ы), где они упоминаются, возможно, проблема там (как пример - несоответствие типов переменных), скорее всего - это маг.эффекты.
Награды Орден "Ремесленник" - за уникальный плагин "Мелисса"  Орден "Ремесленник" - за мод "Сказка о потерянном счастье"

Оффлайн Necromaxer

  • *
  • Сообщений: 3
  • Пол: Мужской
Нужен совет по скриптам
« Ответ #4 : 01 Декабря 2013, 04:03 »
0
Спасибо, попробую.
Upd.: переименовал все "rand" и удалил строки с "ri", "qp", "qpn" - скрипт сразу скомпилировался без проблем. Попробую ещё поискать их в других скриптах.
« Последнее редактирование: 01 Декабря 2013, 11:25 от Necromaxer »