V-ItemActions.asm
上传用户:santakups8
上传日期:2021-03-23
资源大小:544k
文件大小:18k
源码类别:

模拟服务器

开发平台:

Asm

  1. ;EasyCodeName=Module1,1
  2. ;-----------------------------------------------------------------------------------
  3. ;    VeMU
  4. ;    Its a package that allows the user to set his own server of the game
  5. ;    "MuOnline", this is not an emulator since i am not "emulating"
  6. ;    what the actual games does, i am "creating" a method for set a Server
  7. ;    of this Game.
  8. ;
  9. ;    Copyright (C) 2010  Felipe Ya馿z
  10. ;
  11. ;    This program is free software: you can redistribute it and/or modify
  12. ;    it under the terms of the GNU General Public License as published by
  13. ;    the Free Software Foundation, either version 3 of the License, or
  14. ;    (at your option) any later version.
  15. ;
  16. ;    This program is distributed in the hope that it will be useful,
  17. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19. ;    GNU General Public License for more details.
  20. ;
  21. ;    You should have received a copy of the GNU General Public License
  22. ;    along with this program.  If not, see http://www.gnu.org/licenses/.
  23. ;-----------------------------------------------------------------------------------
  24. ;-----------------------------------------------------------------------------------
  25. ;                        -----------------
  26. ;                             Coded     /
  27. ;                              By      /
  28. ;                           -={FeN$x)=-
  29. ;                         /  Felipe Y.  
  30. ;                        /               
  31. ;                        -----------------
  32. ; Programming Lang: ASM
  33. ; Country: Chile
  34. ;              My respect for all those who lost their lifes
  35. ;              In the earthquake of my country...
  36. ;              Let god take their spirits home...
  37. ;-----------------------------------------------------------------------------------
  38. ;////////////////////////////////////////////////////////////////////////////////////
  39. ;                       VeMU Project
  40. ;                       Item Actions !
  41. ;////////////////////////////////////////////////////////////////////////////////////
  42. V_CItem_Clear Proc Uses Ecx
  43.  Local MyStruct:DWord
  44.  Mov MyStruct, Ecx
  45.  Assume Ecx:Ptr ItemStruct
  46.  Mov [Ecx].Item_Number, 0
  47.  Mov [Ecx].Item_Type, 0FFH
  48.  mov [ecx].Item_Index, 0FFh
  49.  Mov [Ecx].Item_Level, 0
  50.  Mov [Ecx].Item_Slot, 0
  51.  Mov [Ecx].Item_Class, 0
  52.  Mov [Ecx].Item_TwoHand, 0
  53.  Mov [Ecx].Item_AttackSpeed, 0
  54.  Mov [Ecx].Item_DamageMin, 0
  55.  Mov [Ecx].Item_DamageMax, 0
  56.  Mov [Ecx].Item_SuccesfulBlocking, 0
  57.  Mov [Ecx].Item_Defense, 0
  58.  Mov [Ecx].Item_MagicDefense, 0
  59.  Mov [Ecx].Item_Durability, 0
  60.  Mov [Ecx].Item_DurabilitySmall, 0
  61.  Mov Dword ptr [Ecx].Item_SpecialNum, 0
  62.  mov byte  ptr [ecx].Item_SpecialNum + 5, 0
  63.  Mov [Ecx].Item_LeaderShip, 0
  64.  Mov [Ecx].Item_Value, 0
  65.  Mov [Ecx].Item_PShopValue, -1
  66.  Mov [Ecx].Item_Exist, 0
  67.  Mov [Ecx].Item_Option1, 0
  68.  Mov [Ecx].Item_Option2, 0
  69.  Mov [Ecx].Item_Option3, 0
  70.  Mov [Ecx].Item_NewOption, 0
  71.  Mov [Ecx].Item_CurrentDurabilityState, 1.0 ;FPU
  72.  Mov [Ecx].Item_QuestItem, 0
  73.  Mov [Ecx].Item_SetOption, 0
  74.  Mov [Ecx].Item_IsLoadPetItemInfo, 0
  75.  Mov [Ecx].Item_PetItemLevel, 0
  76.  Mov [Ecx].Item_PetItemExp, 0
  77.  Mov [Ecx].Item_JewelOfHarmonyOption, 0
  78.  Mov [Ecx].Item_Option380, 0
  79.  Invoke V_ZeroBuff, Addr [Ecx].Item_Special, SizeOf ItemStruct.Item_Special
  80.  Mov Ecx, MyStruct
  81.  Invoke V_ZeroBuff, Addr [Ecx].Item_SpecialValue, SizeOf ItemStruct.Item_SpecialValue
  82.  Mov Ecx, MyStruct
  83.  Invoke V_ZeroBuff, Addr [Ecx].Item_Resistance, SizeOf ItemStruct.Item_Resistance
  84.  Assume Ecx:Nothing
  85.  Ret
  86. V_CItem_Clear EndP
  87. V_CItem_FillStruct Proc uses edx ItemType:Dword, ItemIndex:Dword, Option1:Dword, Option2:Dword, Option3:Dword, NewOption:Dword, SetOption:Dword, Option380:Dword
  88. local SetOptionValue:Dword
  89. local BonusRequirementStats:Dword
  90. local BonusForDmgs:Dword
  91. local UniversalFPUUsage:Real4
  92. local LoopCounter:Dword
  93. local pThisItem:Dword
  94. local MyStruct:Dword
  95. .Data
  96. BaseDurability_0 Real4 0.5
  97. BaseDurability_4 Real4 0.3
  98. BaseDurability_8 Real4 0.2
  99. .Code
  100. assume edx: ptr ItemStruct
  101. assume ecx:ptr ITEM_ATTRIBUTE_STRUCT ;From Item.txt
  102. ;----------------------------------------------
  103. ;Clean locals
  104. ;----------------------------------------------
  105. And LoopCounter, 0
  106. mov MyStruct, edx
  107. ;--------------------------------------------------------------
  108. ;Return pointer from pObjItemAttributes for determinated item
  109. ;--------------------------------------------------------------
  110. invoke V_CItem_RetnpStruct, ItemType, ItemIndex
  111. .If (eax == 0)
  112.   xor eax, eax
  113.   jmp @End
  114. .Endif
  115. mov pThisItem, eax
  116. mov edx, MyStruct
  117. ;----------------------------------------------
  118. ;Set ItemType & ItemIndex
  119. ;----------------------------------------------
  120. mov eax, ItemType
  121. mov ebx, ItemIndex
  122. mov [edx].Item_Type, Al
  123. mov [edx].Item_Index, Bl
  124. ;----------------------------------------------
  125. ;Set Real ItemID
  126. ;----------------------------------------------
  127. invoke V_CItem_GetRealItemID, ItemType, ItemIndex
  128. mov edx, MyStruct
  129. mov [edx].Item_Number, Ax
  130. ;----------------------------------------------
  131. ;Set New Option
  132. ;----------------------------------------------
  133. mov ecx, pThisItem
  134. .If ([ecx].UniversalVars.OptionFlag != 0)
  135.    mov eax, NewOption
  136.    mov [edx].Item_NewOption, Al
  137. .Else
  138.   mov [edx].Item_NewOption, 0
  139. .Endif
  140. ;----------------------------------------------
  141. ;Set "SetOption"
  142. ;----------------------------------------------
  143. .If (SetOption == 1) || (SetOption == 2)
  144.   mov eax, SetOption
  145.   mov [edx].Item_SetOption, Al
  146. .Else
  147.   mov [edx].Item_SetOption, 0
  148. .Endif
  149. ;----------------------------------------------
  150. ;Set "SetOption"
  151. ;----------------------------------------------
  152. .If (Option380 != 0)
  153.   mov eax, Option380
  154.   mov [edx].Item_Option380, Al
  155. .Else
  156.   mov [edx].Item_Option380, 0
  157. .Endif
  158. ;----------------------------------------------
  159. ;Set Slot
  160. ;----------------------------------------------
  161. mov eax, [ecx].UniversalVars.ItemSlot
  162. mov [edx].Item_Slot, Al
  163. ;----------------------------------------------
  164. ;Set serial
  165. ;----------------------------------------------
  166. movsx eax, [ecx].UniversalVars.Serial
  167. mov [edx].Item_Serial, Al
  168. ;----------------------------------------------
  169. ;Set Item Size
  170. ;----------------------------------------------
  171. movsx eax, [ecx].UniversalVars.vWidth
  172. mov [edx].Item_Width, Al
  173. movsx eax, [ecx].UniversalVars.vHeight
  174. mov [edx].Item_Height, Al
  175. ;----------------------------------------------
  176. ;Set BuyMoney and SellMoney
  177. ;----------------------------------------------
  178. mov eax, [ecx].SpecialVars.BuyMoney
  179. mov [edx].Item_BuyMoney, eax
  180. mov eax, [ecx].SpecialVars.SellMoney
  181. mov [edx].Item_SellMoney, eax
  182. ;----------------------------------------------
  183. ;Set Item Level
  184. ;----------------------------------------------
  185. invoke V_CItem_GetItemLevel, ItemType, ItemIndex
  186. .If (eax == 0)
  187.   xor eax, eax
  188.   jmp @End
  189. .Endif
  190. mov edx, MyStruct
  191. mov [edx].Item_Level, Al
  192. ;----------------------------------------------
  193. ;Set Item BaseDurability
  194. ;----------------------------------------------
  195. invoke V_CItem_GetItemDurability, ItemType, ItemIndex
  196. .If (eax == 0)
  197.   xor eax, eax
  198.   jmp @End
  199. .Endif
  200. mov edx, MyStruct
  201. mov UniversalFPUUsage, eax
  202. fild UniversalFPUUsage
  203. fstp [edx].Item_BaseDurability
  204. ;----------------------------------------------
  205. ;Set Durability states
  206. ;----------------------------------------------
  207. fld [edx].Item_BaseDurability
  208. fmul BaseDurability_0
  209. fstp [edx].Item_DurabilityState
  210. fld [edx].Item_BaseDurability
  211. fmul BaseDurability_4
  212. fstp [edx].Item_DurabilityState + 4
  213. fld [edx].Item_BaseDurability
  214. fmul BaseDurability_8
  215. fstp [edx].Item_DurabilityState + 8
  216. ;----------------------------------------------
  217. ;Set Value
  218. ;----------------------------------------------
  219. mov ecx, pThisItem
  220. movsx eax, [ecx].SpecialVars.ItemValue
  221. mov [edx].Item_Value, eax
  222. ;----------------------------------------------
  223. ;Set Attack Speed
  224. ;----------------------------------------------
  225. movsx eax, [ecx].DamageVars.AttackSpeed
  226. mov [edx].Item_AttackSpeed, Al
  227. ;----------------------------------------------
  228. ;Set Two Hand
  229. ;----------------------------------------------
  230. movsx eax, [ecx].SpecialVars.TwoHand
  231. mov [edx].Item_TwoHand, Al
  232. ;----------------------------------------------
  233. ;Set SuccesFulBlocking & Defense
  234. ;----------------------------------------------
  235. movsx eax, [ecx].DefenseVars.SuccesfulBlocking
  236. movsx ebx, [ecx].DefenseVars.Defense
  237. mov [edx].Item_SuccesfulBlocking, Al
  238. mov [edx].Item_Defense, Bl
  239. ;-----------------------------------------------------------------------
  240. ;Set DamageMin, DamageMax & MagicPower.
  241. ;----------------------------------------------------------------------
  242. movsx eax, [ecx].DamageVars.DamageMin
  243. movsx ebx, [ecx].DamageVars.DamageMax
  244. mov [edx].Item_DamageMin, Ax
  245. mov [edx].Item_DamageMax, Bx
  246. mov eax, [ecx].DamageVars.MagicPower
  247. mov [edx].Item_MagicPower, Ax
  248. ;----------------------------------------------
  249. ;Set MagicDefense & WalkSpeed
  250. ;----------------------------------------------
  251. movsx eax, [ecx].DefenseVars.MagicDefense
  252. movsx ebx, [ecx].SpecialVars.WalkSpeed
  253. mov [edx].Item_MagicDefense, Al
  254. mov [edx].Item_WalkSpeed, Bl
  255. ;----------------------------------------------
  256. ;Set Additions in base of Options
  257. ;----------------------------------------------
  258. invoke V_CItem_SetBonusByOptions, ItemType, ItemIndex
  259. ;----------------------------------------------
  260. ;Set Class Requirement
  261. ;----------------------------------------------
  262. invoke MemCopy, Addr [ecx].ClassVars.ReqClass, Addr [edx].Item_ReqClass, SizeOf ItemStruct.Item_ReqClass
  263. ;----------------------------------------------
  264. ;Set Resistances calculation
  265. ;Calc: Resistance*Level
  266. ;----------------------------------------------
  267. mov ecx, pThisItem
  268. mov edx, MyStruct
  269. .Repeat
  270.  lea eax, [ecx].DefenseVars.Resistance
  271.  add eax, LoopCounter
  272.  mov eax, [eax]
  273.  and eax, 0FFh ;Avoid using byte mov (optimisation)
  274.  movsx ebx, [edx].Item_Level
  275.  imul eax, ebx
  276.  lea ebx, [edx].Item_Resistance
  277.  add ebx, LoopCounter
  278.  mov [ebx], Al
  279.  add LoopCounter, 1
  280. .Until (LoopCounter == SizeOf ItemStruct.Item_Resistance)
  281. ;----------------------------------------------
  282. ;Set Current durability states
  283. ;----------------------------------------------
  284. mov UniversalFPUUsage, 0
  285. fld [edx].Item_Durability
  286. fcomp UniversalFPUUsage
  287. fstsw Ax
  288. test ah, 40h
  289. je @NotZero
  290. mov [edx].Item_CurrentDurabilityState, 3F800000h ;1,0
  291. jmp @GoReqStats
  292. @NotZero:
  293. fld [edx].Item_Durability
  294. fcomp [edx].Item_DurabilityState
  295. fstsw Ax
  296. test ah, 1
  297. je @NextOne
  298. mov [edx].Item_CurrentDurabilityState, 3F000000h ;0,5
  299. jmp @GoReqStats
  300. @NextOne:
  301. fld [edx].Item_Durability
  302. fcomp [edx].Item_DurabilityState + 4
  303. fstsw Ax
  304. test ah, 1
  305. je @NextOne2
  306. mov [edx].Item_CurrentDurabilityState, 3E99999Ah ;0,3
  307. jmp @GoReqStats
  308. @NextOne2:
  309. fld [edx].Item_Durability
  310. fcomp [edx].Item_DurabilityState + 8
  311. fstsw Ax
  312. test ah, 1
  313. je @GoReqStats
  314. mov [edx].Item_CurrentDurabilityState, 3E4CCCCDh ;0,2
  315. @GoReqStats:
  316. ;-------------------------------------------------------
  317. ;Add requirements for stats like Strenght, Vit, etc
  318. ;Inside are some calculations in base of item options
  319. ;-------------------------------------------------------
  320. invoke V_CItem_SetRequiredStats, ItemType, ItemIndex
  321. ;------------------------------------------------------
  322. ;Set Required Level for some items
  323. ;------------------------------------------------------
  324. invoke V_CItem_SetReqLevel, ItemType, ItemIndex, NewOption
  325. ;------------------------------------------------------
  326. ;Set Skills if its the Option skill enabled
  327. ;------------------------------------------------------
  328. invoke V_CItem_SetSkillOpt, Option1
  329. add [edx].Item_SpecialNum, 1
  330. invoke V_CItem_SetOption2, ItemType, ItemIndex, Option2
  331. add [edx].Item_SpecialNum, 1
  332. invoke V_CItem_SetOption3, ItemType, ItemIndex, Option3
  333. add [edx].Item_SpecialNum, 1
  334. invoke V_CItem_SetBonusForRings, ItemType, ItemIndex
  335. invoke V_CItem_SetBonusForPendants, ItemType, ItemIndex
  336. mov edx, MyStruct
  337. mov ecx, pThisItem
  338. ;-------------------------------------------------------
  339. ;Set some options for wings !
  340. ;-------------------------------------------------------
  341. .If (ItemType == 12) && (ItemIndex >= 3) && (ItemIndex < 6) ; items Wings Spirit, Soul & Dragon
  342.   jmp @4
  343. .ElseIf (ItemType == 13) && (ItemIndex == 30) ;Cape of Lord
  344. @4:
  345.   movsx eax, [edx].Item_NewOption
  346.   and eax, 1
  347.   .If (eax != 0)
  348.     movsx eax, [edx].Item_SpecialNum
  349.     mov [[edx].Item_Special + eax], 100 ;Special[SpecialNum] (array)  (SKILL = Unknown)
  350.     add [edx].Item_SpecialNum, 1
  351.   .Endif
  352.   movsx eax, [edx].Item_NewOption
  353.   and eax, 2
  354.   .If (eax != 0)
  355.     movsx eax, [edx].Item_SpecialNum
  356.     mov [[edx].Item_Special + eax], 101 ;Special[SpecialNum] (array)  (SKILL = Unknown)
  357.     add [edx].Item_SpecialNum, 1
  358.   .Endif
  359.   movsx eax, [edx].Item_NewOption
  360.   and eax, 4
  361.   .If (eax != 0)
  362.     movsx eax, [edx].Item_SpecialNum
  363.     mov [[edx].Item_Special + eax], 102 ;Special[SpecialNum] (array)  (SKILL = Unknown)
  364.     add [edx].Item_SpecialNum, 1
  365.   .Endif
  366.   movsx eax, [edx].Item_NewOption
  367.   and eax, 8
  368.   .If (eax != 0)
  369.     movsx eax, [edx].Item_SpecialNum
  370.     mov [[edx].Item_Special + eax], 105 ;Special[SpecialNum] (array)  (SKILL = Unknown)
  371.     add [edx].Item_SpecialNum, 1
  372.   .Endif
  373. .Endif
  374. ;-------------------------------------------------------
  375. ;Set some options for Fenrir !
  376. ;-------------------------------------------------------
  377. .If (ItemType == 13) && (ItemIndex == 37) ;Horn of Fenrir
  378.   movsx eax, [edx].Item_NewOption
  379.   and eax, 1
  380.   .If (eax != 0)
  381.     movsx eax, [edx].Item_SpecialNum
  382.     mov [[edx].Item_Special + eax], 106 ;Special[SpecialNum] (array)  (SKILL = Unknown)
  383.     add [edx].Item_SpecialNum, 1
  384.   .Endif
  385.   movsx eax, [edx].Item_NewOption
  386.   and eax, 2
  387.   .If (eax != 0)
  388.     movsx eax, [edx].Item_SpecialNum
  389.     mov [[edx].Item_Special + eax], 107 ;Special[SpecialNum] (array)  (SKILL = Unknown)
  390.     add [edx].Item_SpecialNum, 1
  391.   .Endif
  392. .Endif
  393. ;-------------------------------------------------------
  394. ;Set special attribute !
  395. ;-------------------------------------------------------
  396. mov edx, MyStruct
  397. mov eax, SetOption
  398. and eax, 0FFh
  399. sar eax, 2
  400. and eax, 3
  401. .If (Eax != 0)
  402.   mov SetOptionValue, eax
  403.   mov ecx, pThisItem
  404.   movsx eax, [ecx].SpecialVars.SetAttribute
  405.   .If (eax != 0)
  406.     add eax, 195 ;0C3h
  407.     movsx ebx, [edx].Item_SpecialNum
  408.     mov [[edx].Item_Special + ebx], Al ;Special[SpecialNum] (array)  (SKILL = Unknown)
  409.     mov eax, SetOptionValue
  410.     imul eax, eax, 5
  411.     mov [edx].Item_SetAddStat, Al
  412.     add [edx].Item_SpecialNum, 1
  413.   .Endif
  414. .Endif
  415. ;-------------------------------------------------------
  416. ;Set Damage Min & Defense into their origins
  417. ;-------------------------------------------------------
  418. movsx eax, [edx].Item_DamageMin
  419. mov [edx].Item_DamageMinOrigin, Ax
  420. movsx eax, [edx].Item_Defense
  421. mov [edx].Item_DefenseOrigin, Ax
  422. ;-------------------------------------------------------
  423. ;Last calculation for DamageMin
  424. ;Calc: (CurrentDurabilityState * DamageMin) - DamageMin
  425. ;-------------------------------------------------------
  426. movsx eax, [edx].Item_DamageMin
  427. mov UniversalFPUUsage, eax
  428. fild UniversalFPUUsage
  429. fmul [edx].Item_CurrentDurabilityState
  430. fistp UniversalFPUUsage
  431. mov eax, UniversalFPUUsage
  432. sub [edx].Item_DamageMin, Ax
  433. ;-------------------------------------------------------
  434. ;Last calculation for DamageMax
  435. ;Calc: (CurrentDurabilityState * DamageMax) - DamageMax
  436. ;-------------------------------------------------------
  437. movsx eax, [edx].Item_DamageMax
  438. mov UniversalFPUUsage, eax
  439. fild UniversalFPUUsage
  440. fmul [edx].Item_CurrentDurabilityState
  441. fistp UniversalFPUUsage
  442. mov eax, UniversalFPUUsage
  443. sub [edx].Item_DamageMax, Ax
  444. ;-------------------------------------------------------
  445. ;Last calculation for Defense
  446. ;Calc: (CurrentDurabilityState * Defense) - Defense
  447. ;-------------------------------------------------------
  448. movsx eax, [edx].Item_Defense
  449. mov UniversalFPUUsage, eax
  450. fild UniversalFPUUsage
  451. fmul [edx].Item_CurrentDurabilityState
  452. fistp UniversalFPUUsage
  453. mov eax, UniversalFPUUsage
  454. sub [edx].Item_Defense, Al
  455. ;-------------------------------------------------------------
  456. ;Last calculation for SuccesfulBlocking
  457. ;Calc: (CurrentDurabilityState * SuccesBlock) - SuccesBlock
  458. ;-------------------------------------------------------------
  459. movsx eax, [edx].Item_SuccesfulBlocking
  460. mov UniversalFPUUsage, eax
  461. fild UniversalFPUUsage
  462. fmul [edx].Item_CurrentDurabilityState
  463. fistp UniversalFPUUsage
  464. mov eax, UniversalFPUUsage
  465. sub [edx].Item_SuccesfulBlocking, Al
  466. mov eax, 1
  467. @End:
  468. assume edx:NOTHING
  469. assume ecx:NOTHING
  470. Ret
  471. V_CItem_FillStruct Endp
  472. V_CItem_RetnpStruct Proc ItemType:Dword, ItemIndex:Dword
  473. assume ecx:ptr ITEM_ATTRIBUTE_STRUCT
  474. lea ecx, pObjItemAttributes
  475. xor ebx, ebx
  476. .Repeat
  477.  mov eax, ItemType
  478.  .If (Al == [ecx].ItemType)
  479.    mov edx, ItemIndex
  480.    .If (Dl == [ecx].ItemIndex)
  481.      lea eax, [ecx] ;Pointer to struct of the belong item
  482.      jmp @End
  483.    .Endif
  484.  .Endif
  485.  add ebx, 1
  486.  add ecx, SizeOf ITEM_ATTRIBUTE_STRUCT
  487. .Until (ebx == TotalItemsLoaded)
  488. xor eax, eax
  489. @End:
  490. assume ecx:nothing
  491. ret
  492. V_CItem_RetnpStruct Endp
  493. V_CItem_GetRealItemID Proc ItemType:Dword, ItemIndex:Dword
  494. mov eax, ItemType
  495. shl eax, 9 ;Do not change this calculation if not, Client wont detect your item ID
  496. add eax, ItemIndex
  497. ret
  498. V_CItem_GetRealItemID Endp
  499. V_CItem_GetSize Proc ItemType:Dword, ItemIndex:Dword
  500. assume ecx:ptr ITEM_ATTRIBUTE_STRUCT
  501. invoke V_CItem_RetnpStruct, ItemType, ItemIndex
  502. .If (eax == 0)
  503.  mov eax, -1
  504.  jmp @End
  505. .Endif
  506. movsx eax, [ecx].UniversalVars.vWidth
  507. movsx edx, [ecx].UniversalVars.vHeight
  508. @End:
  509. Ret
  510. V_CItem_GetSize EndP
  511. V_CItem_IsItemValid Proc ItemType:Dword, ItemIndex:Dword
  512. invoke V_CItem_RetnpStruct, ItemType, ItemIndex ;Just a wrapper
  513. Ret
  514. V_CItem_IsItemValid EndP
  515. V_CItem_GetItemLevel Proc ItemType:Dword, ItemIndex:Dword
  516. assume ecx:ptr ITEM_ATTRIBUTE_STRUCT
  517. invoke V_CItem_RetnpStruct, ItemType, ItemIndex
  518. .If (eax == 0)
  519.  xor eax, eax
  520.  jmp @End
  521. .Endif
  522. mov ecx, eax
  523. movsx eax, [ecx].SpecialVars.Level
  524. @End:
  525. assume ecx:nothing
  526. Ret
  527. V_CItem_GetItemLevel Endp
  528. V_CItem_GetItemDurability Proc ItemType:Dword, ItemIndex:Dword
  529. assume ecx:ptr ITEM_ATTRIBUTE_STRUCT
  530. invoke V_CItem_RetnpStruct, ItemType, ItemIndex
  531. .If (eax == 0)
  532.  xor eax, eax
  533.  jmp @End
  534. .Endif
  535. mov ecx, eax
  536. movsx eax, [ecx].DefenseVars.Durability
  537. @End:
  538. assume ecx:nothing
  539. Ret
  540. V_CItem_GetItemDurability Endp