В общем, начал переводить плагин для Обливиона. Пользуюсь 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, всё как положено. Все библиотеки присутствуют.
Думаю здесь есть люди, которые много переводят и знают как себя вести в таком случае. Заранее благодарен.
Вот первый проблемный скрипт:
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