Advertisement
Inquisitor

[L2J] Transfer qty changes from recipes.csv to recipes.xml

Aug 5th, 2016
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Batch 6.58 KB | None | 0 0
  1. @Echo Off
  2. SetLocal EnableDelayedExpansion
  3. rem Скрипт для поиска и переноса изменений recipelist из сборки Interlude rt-based в сборку lucera 2.x ветки
  4. rem Отслеживается количество MP, ингредиентов и результирующих вещей
  5. rem Anonymous, 2016
  6. Title Recipelist CSV ^>^> XML changes
  7.  
  8. Set XMLFile=recipes.xml
  9. Set CSVFile=recipes.csv
  10.  
  11. Set i=0
  12. Set c=0
  13. Set "isBlock="
  14. For %%A In (error,warning) Do If Exist %%A.log Del %%A.log
  15. rem Узнаём точное количество рецептов в файле, подсчитывая количество закрывающих тэгов
  16. rem Это позволяет починить сломанную нумерацию, в случае если один из рецептов пропущен
  17. For /F %%? In ('Find "/item" "%XMLFile%"') Do Set /A c+=1
  18. rem Пишем заголовок файла
  19. Call :WriteXMLHeader
  20. rem Построчно читаем файл, разбирая его структуру
  21. For /F "usebackq delims=    " %%? In ("%XMLFile%") Do (
  22.     Set "Line=%%?"
  23.     If "!Line:~1,4!"=="item" (
  24.         rem Парсим данные из заголовка блока
  25.         For /F delims^=^"^ tokens^=2^,4^,6^,8^,10^,12 %%A In ('Set Line') Do (
  26.             Set RecipeNumber=%%A
  27.             Set RecipeID=%%B
  28.             Set RecipeName=%%C
  29.             Set RecipeLevel=%%D
  30.             Set RecipeType=%%E
  31.             Set RecipeChance=%%F
  32.         )
  33.         rem Устанавливаем флаг начала блока
  34.         Set isBlock=true
  35.         Set n=0
  36.         Set MPconsumed=0
  37.         Set /A i+=1
  38.     )
  39.     If "!Line:~1,4!"=="/ite" (
  40.         rem Сбрасываем флаг начала блока
  41.         Set "isBlock="
  42.         rem Вызываем функцию для выборки из старого recipe.csv и корректируем данные
  43.         Call :GetCSVData
  44.         rem Записываем рецепт
  45.         Call :WriteXMLRecipe
  46.         rem Очищаем  временные переменные
  47.         For %%V In (Recipe,Production,Ingredient) Do (
  48.             For /F "delims== tokens=1" %%? In ('Set %%V') Do Set "%%?="
  49.         )
  50.     )
  51.     If Defined isBlock (
  52.         rem Ищем затрачиваемое на крафт количество МП
  53.         If "!Line:~1,4!"=="stat" (
  54.             For /F delims^=^"^ tokens^=4 %%A In ('Set Line') Do Set MPconsumed=%%A
  55.         )
  56.         rem Получаем создаваемый итем
  57.         If "!Line:~1,4!"=="prod" (
  58.             For /F delims^=^"^ tokens^=2^,4 %%A In ('Set Line') Do (
  59.                 Set ProductionID=%%A
  60.                 Set ProductionQuantity=%%B
  61.             )
  62.         )
  63.         rem Получаем айдишник и количество ингредиентов
  64.         If "!Line:~1,4!"=="ingr" (
  65.             Set /A n+=1
  66.             For /F delims^=^"^ tokens^=2^,4 %%A In ('Set Line') Do (
  67.                 Set IngredientID!n!=%%A
  68.                 Set IngredientQuantity!n!=%%B
  69.             )
  70.         )
  71.     )
  72. )
  73. :: Записываем конец файла и выходим
  74. Call :WriteXMLEnd
  75. Exit
  76.  
  77. :WriteXMLRecipe
  78. Echo. !i! of !c!    [%RecipeName%]
  79. (
  80. Echo.   ^<item id="!i!" recipeId="%RecipeID%" name="%RecipeName%" craftLevel="%RecipeLevel%" type="%RecipeType%" successRate="%RecipeChance%"^>
  81. Echo.       ^<statUse name="MP" value="%MPconsumed%"/^>
  82. Echo.       ^<production id="%ProductionID%" count="%ProductionQuantity%"/^>
  83. For /L %%A In (1,1,%n%) Do (
  84.     Echo.       ^<ingredient id="!IngredientID%%A!" count="!IngredientQuantity%%A!"/^>
  85. )
  86. Echo.   ^</item^>
  87. )>>"edited_recipes.xml"
  88. Exit /B
  89.  
  90. :WriteXMLHeader
  91. (
  92. Echo.^<?xml version="1.0" encoding="UTF-8"?^>
  93. Echo.^<^^!--
  94. Echo.Information:
  95. Echo.- statUse can have HP/MP, but you can use both
  96. Echo.- altStatChange and productionRare is optional
  97. Echo.- in altStatChange you can use XP/SP/GIM ^(this works only if AltGameCreation = True^):
  98. Echo.XP: base XP value
  99. Echo.SP: base SP value
  100. Echo.GIM: the old function used only the skilllevel to determine how many item is grabbed in each step
  101. Echo.   with this stat changer you can multiple this
  102. Echo.--^>
  103. Echo.^<list^>
  104. )>"edited_recipes.xml"
  105. Exit /B
  106.  
  107. :WriteXMLEnd
  108. Echo.^</list^>>>"edited_recipes.xml"
  109. Exit /B
  110.  
  111. :GetCSVData
  112. rem dwarven;mk_wooden_arrow;1;1666;1;[1864(4)],[1869(2)];17;500;[1666(1)],[57(5400000)];30;100;
  113. rem структура: 1 - RecipeType, 2 - RecipeName, 3 - RecipeNumber, 4 - RecipeID, 5 - RecipeLevel
  114. rem 6 - ingridients array [ID(quantity)], 7 - ProductionID, 8 - ProductionQuantity, 9 - [RecipeID(???)] [???(???)]
  115. rem 10 - MPconsumed, 11 - RecipeChance
  116. rem Разбираем строку из csv файла
  117. For /F "delims=; tokens=2,6-8,10" %%A In ('FindStr ";%RecipeName%;" "%CSVFile%"') Do (
  118.     Set List="%%B"
  119.     Set List=!List:,=","!
  120.     For %%L In  (!List!) Do (
  121.         For /F "delims=[()] tokens=1,2" %%S In ("%%~L") Do (
  122.             Set CSV_Ingredient%%S=%%T
  123.         )
  124.     )
  125.     Set CSV_ProductionID=%%C
  126.     Set CSV_ProductionQuantity=%%D
  127.     Set CSV_MPconsumed=%%E
  128. )
  129. rem Находим различия, заменяем данные в рецепте из xml
  130. rem Если айди результирующей вещи не совпадает  - отмечаем соответствующий флаг
  131. rem То же самое, если в данных нашлись различия, но в таком случае, данные из xml
  132. rem затираются данными из csv
  133. Set "isIncompatible="
  134. Set "isModified="
  135. If Not "%ProductionID%"=="%CSV_ProductionID%" Set isIncompatible=true&&GoTo :jmp
  136. If Not "%ProductionQuantity%"=="%CSV_ProductionQuantity%" (
  137.     Set isModified=true
  138.     Set OLD_ProductionQuantity=%ProductionQuantity%
  139.     Set ProductionQuantity=%CSV_ProductionQuantity%
  140. )
  141. If Not "%MPconsumed%"=="%CSV_MPconsumed%" (
  142.     Set isModified=true
  143.     Set OLD_MPconsumed=%MPconsumed%
  144.     Set MPconsumed=%CSV_MPconsumed%
  145. )
  146. For /L %%A In (1,1,%n%) Do (
  147.     If Not Defined CSV_Ingredient!IngredientID%%A! (Set isIncompatible=true && Exit /B)
  148.     Call Set CSV_QTY=%%CSV_Ingredient!IngredientID%%A!%%
  149.     If Not "!IngredientQuantity%%A!"=="!CSV_QTY!" (
  150.         Set isModified=true
  151.         Set OLD_IngredientQuantity%%A=!IngredientQuantity%%A!
  152.         Set IngredientQuantity%%A=!CSV_QTY!
  153.     )
  154. )
  155. :jmp
  156. rem Запись в лог о несовпадении данных
  157. If Defined isIncompatible Call :WriteLog error
  158. If Defined isModified Call :WriteLog warning
  159. rem Очищаем временные переменные
  160. For /F "delims== tokens=1" %%? In ('Set CSV_') Do Set "%%?="
  161. Exit /B
  162.  
  163. :WriteLog (outfile)
  164. :: Скидываем в лог дамп переменных, если в рецепте найдено различие или ошибка
  165. (
  166.     Echo.-------=New XML
  167.     Set -------=Old XML
  168.     Set "CSV_QTY="
  169.     For %%V In (Recipe,Production,Ingredient,MPconsumed,-------,OLD_) Do (
  170.         For /F "delims== tokens=1,*" %%A In ('Set %%V') Do Echo %%A=%%B
  171.     )
  172.     Echo.
  173.     Echo.
  174. )>>"%~1.log"
  175. Exit /B
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement