Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @Echo Off
- SetLocal EnableDelayedExpansion
- rem Скрипт для поиска и переноса изменений recipelist из сборки Interlude rt-based в сборку lucera 2.x ветки
- rem Отслеживается количество MP, ингредиентов и результирующих вещей
- rem Anonymous, 2016
- Title Recipelist CSV ^>^> XML changes
- Set XMLFile=recipes.xml
- Set CSVFile=recipes.csv
- Set i=0
- Set c=0
- Set "isBlock="
- For %%A In (error,warning) Do If Exist %%A.log Del %%A.log
- rem Узнаём точное количество рецептов в файле, подсчитывая количество закрывающих тэгов
- rem Это позволяет починить сломанную нумерацию, в случае если один из рецептов пропущен
- For /F %%? In ('Find "/item" "%XMLFile%"') Do Set /A c+=1
- rem Пишем заголовок файла
- Call :WriteXMLHeader
- rem Построчно читаем файл, разбирая его структуру
- For /F "usebackq delims= " %%? In ("%XMLFile%") Do (
- Set "Line=%%?"
- If "!Line:~1,4!"=="item" (
- rem Парсим данные из заголовка блока
- For /F delims^=^"^ tokens^=2^,4^,6^,8^,10^,12 %%A In ('Set Line') Do (
- Set RecipeNumber=%%A
- Set RecipeID=%%B
- Set RecipeName=%%C
- Set RecipeLevel=%%D
- Set RecipeType=%%E
- Set RecipeChance=%%F
- )
- rem Устанавливаем флаг начала блока
- Set isBlock=true
- Set n=0
- Set MPconsumed=0
- Set /A i+=1
- )
- If "!Line:~1,4!"=="/ite" (
- rem Сбрасываем флаг начала блока
- Set "isBlock="
- rem Вызываем функцию для выборки из старого recipe.csv и корректируем данные
- Call :GetCSVData
- rem Записываем рецепт
- Call :WriteXMLRecipe
- rem Очищаем временные переменные
- For %%V In (Recipe,Production,Ingredient) Do (
- For /F "delims== tokens=1" %%? In ('Set %%V') Do Set "%%?="
- )
- )
- If Defined isBlock (
- rem Ищем затрачиваемое на крафт количество МП
- If "!Line:~1,4!"=="stat" (
- For /F delims^=^"^ tokens^=4 %%A In ('Set Line') Do Set MPconsumed=%%A
- )
- rem Получаем создаваемый итем
- If "!Line:~1,4!"=="prod" (
- For /F delims^=^"^ tokens^=2^,4 %%A In ('Set Line') Do (
- Set ProductionID=%%A
- Set ProductionQuantity=%%B
- )
- )
- rem Получаем айдишник и количество ингредиентов
- If "!Line:~1,4!"=="ingr" (
- Set /A n+=1
- For /F delims^=^"^ tokens^=2^,4 %%A In ('Set Line') Do (
- Set IngredientID!n!=%%A
- Set IngredientQuantity!n!=%%B
- )
- )
- )
- )
- :: Записываем конец файла и выходим
- Call :WriteXMLEnd
- Exit
- :WriteXMLRecipe
- Echo. !i! of !c! [%RecipeName%]
- (
- Echo. ^<item id="!i!" recipeId="%RecipeID%" name="%RecipeName%" craftLevel="%RecipeLevel%" type="%RecipeType%" successRate="%RecipeChance%"^>
- Echo. ^<statUse name="MP" value="%MPconsumed%"/^>
- Echo. ^<production id="%ProductionID%" count="%ProductionQuantity%"/^>
- For /L %%A In (1,1,%n%) Do (
- Echo. ^<ingredient id="!IngredientID%%A!" count="!IngredientQuantity%%A!"/^>
- )
- Echo. ^</item^>
- )>>"edited_recipes.xml"
- Exit /B
- :WriteXMLHeader
- (
- Echo.^<?xml version="1.0" encoding="UTF-8"?^>
- Echo.^<^^!--
- Echo.Information:
- Echo.- statUse can have HP/MP, but you can use both
- Echo.- altStatChange and productionRare is optional
- Echo.- in altStatChange you can use XP/SP/GIM ^(this works only if AltGameCreation = True^):
- Echo.XP: base XP value
- Echo.SP: base SP value
- Echo.GIM: the old function used only the skilllevel to determine how many item is grabbed in each step
- Echo. with this stat changer you can multiple this
- Echo.--^>
- Echo.^<list^>
- )>"edited_recipes.xml"
- Exit /B
- :WriteXMLEnd
- Echo.^</list^>>>"edited_recipes.xml"
- Exit /B
- :GetCSVData
- rem dwarven;mk_wooden_arrow;1;1666;1;[1864(4)],[1869(2)];17;500;[1666(1)],[57(5400000)];30;100;
- rem структура: 1 - RecipeType, 2 - RecipeName, 3 - RecipeNumber, 4 - RecipeID, 5 - RecipeLevel
- rem 6 - ingridients array [ID(quantity)], 7 - ProductionID, 8 - ProductionQuantity, 9 - [RecipeID(???)] [???(???)]
- rem 10 - MPconsumed, 11 - RecipeChance
- rem Разбираем строку из csv файла
- For /F "delims=; tokens=2,6-8,10" %%A In ('FindStr ";%RecipeName%;" "%CSVFile%"') Do (
- Set List="%%B"
- Set List=!List:,=","!
- For %%L In (!List!) Do (
- For /F "delims=[()] tokens=1,2" %%S In ("%%~L") Do (
- Set CSV_Ingredient%%S=%%T
- )
- )
- Set CSV_ProductionID=%%C
- Set CSV_ProductionQuantity=%%D
- Set CSV_MPconsumed=%%E
- )
- rem Находим различия, заменяем данные в рецепте из xml
- rem Если айди результирующей вещи не совпадает - отмечаем соответствующий флаг
- rem То же самое, если в данных нашлись различия, но в таком случае, данные из xml
- rem затираются данными из csv
- Set "isIncompatible="
- Set "isModified="
- If Not "%ProductionID%"=="%CSV_ProductionID%" Set isIncompatible=true&&GoTo :jmp
- If Not "%ProductionQuantity%"=="%CSV_ProductionQuantity%" (
- Set isModified=true
- Set OLD_ProductionQuantity=%ProductionQuantity%
- Set ProductionQuantity=%CSV_ProductionQuantity%
- )
- If Not "%MPconsumed%"=="%CSV_MPconsumed%" (
- Set isModified=true
- Set OLD_MPconsumed=%MPconsumed%
- Set MPconsumed=%CSV_MPconsumed%
- )
- For /L %%A In (1,1,%n%) Do (
- If Not Defined CSV_Ingredient!IngredientID%%A! (Set isIncompatible=true && Exit /B)
- Call Set CSV_QTY=%%CSV_Ingredient!IngredientID%%A!%%
- If Not "!IngredientQuantity%%A!"=="!CSV_QTY!" (
- Set isModified=true
- Set OLD_IngredientQuantity%%A=!IngredientQuantity%%A!
- Set IngredientQuantity%%A=!CSV_QTY!
- )
- )
- :jmp
- rem Запись в лог о несовпадении данных
- If Defined isIncompatible Call :WriteLog error
- If Defined isModified Call :WriteLog warning
- rem Очищаем временные переменные
- For /F "delims== tokens=1" %%? In ('Set CSV_') Do Set "%%?="
- Exit /B
- :WriteLog (outfile)
- :: Скидываем в лог дамп переменных, если в рецепте найдено различие или ошибка
- (
- Echo.-------=New XML
- Set -------=Old XML
- Set "CSV_QTY="
- For %%V In (Recipe,Production,Ingredient,MPconsumed,-------,OLD_) Do (
- For /F "delims== tokens=1,*" %%A In ('Set %%V') Do Echo %%A=%%B
- )
- Echo.
- Echo.
- )>>"%~1.log"
- Exit /B
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement