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

模拟服务器

开发平台:

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. .const
  39. .data?
  40. .data
  41. .code
  42. V_MonsterItemMng_Init Proc
  43. local LoopCounter:Dword
  44. lea ecx, pObjMobItemMng.pItemsPerLevel
  45. xor edx, edx
  46. ;-------------------------------------
  47. ;Initialise the mob manager array
  48. ;------------------------------------
  49. .Repeat ;Infinit loop
  50.   mov eax, TotalItemsLoaded
  51.   imul eax, eax, SizeOf ItemStruct
  52.   push ecx
  53.   push edx
  54.   fastalloc eax, 2 ;Allocate Total items loaded (item.txt) * ItemStruct
  55.   pop edx
  56.   pop ecx
  57.   .if (eax == 0)
  58.     ;Put Error here
  59.   .Endif
  60.   mov [ecx + edx * 4], eax ;Save Pointer
  61.   push ecx
  62.   push edx
  63.   invoke V_VectorCreator, eax, Offset V_CItem_Clear, SizeOf ItemStruct, TotalItemsLoaded
  64.   pop edx
  65.   pop ecx ;Struct
  66.   add edx, 1
  67. .Until (edx == MAX_MONSTER_LEVEL)
  68. ;----------------------------
  69. ;Give items to monsters
  70. ;----------------------------
  71. xor edx, edx
  72. assume eax:ptr MONSTER_ATTRIBUTE
  73. .Repeat
  74.   push edx
  75.   invoke V_Monster_MatchIndex, edx
  76.   .If (eax != 0)
  77.     pObj edx, SizeOf MONSTER_ATTRIBUTE, pObjMonsterAttr
  78.     .If [eax].Level >= 0 && [eax].Level < MAX_MONSTER_LEVEL
  79.       invoke V_MonsterItemMng_GiveItem, [eax].Level, [eax].MinItemLevel, [eax].MaxItemLevel
  80.     .endif
  81.   .Endif
  82.   pop edx
  83.   add edx, 1
  84. .Until (edx == MonsterCounter)
  85. RGB 24, 116, 205 ;Light blue
  86. Mov Edx, Eax
  87. Invoke vprint, $CTA0("MobItemMng_Init:] Monster inventory initialised "), Edx, 0
  88. Ret
  89. V_MonsterItemMng_Init EndP
  90. V_MonsterItemMng_GiveItem Proc MobLevel:Dword, MinItemLevel:Dword, MaxLevelItem:Dword
  91. local ItemType:Dword
  92. local ItemIndex:Dword
  93. local Counter:Dword
  94. local ItemAdded:Dword
  95. local pItemCounter:Dword
  96. ;-------------------------------------
  97. ;Clean locals
  98. ;-------------------------------------
  99. And ItemType, 0
  100. And ItemIndex, 0
  101. And Counter, 0
  102. ;-------------------------------------
  103. ;Get pointer to counter for item lvl
  104. ;-------------------------------------
  105. lea eax, pObjMobItemMng.ItemsTotalPerLevl
  106. mov edx, MobLevel
  107. imul edx, edx, 2 ;MobLevel * Word
  108. add eax, edx
  109. mov pItemCounter, eax
  110. ;-------------------------------------
  111. ;Initialise random num generator
  112. ;------------------------------------
  113. rdtsc
  114. Invoke MRandomInit, Eax ;Initialize random number generator
  115. xor ecx, ecx
  116. ;-------------------------------------
  117. ;Get random item
  118. ;-------------------------------------
  119. .While (ecx != -1)
  120.   Invoke MIRandom, 0, MAX_ITEM_TYPES ;Generate a random item type
  121.   mov ItemType, eax
  122.   Invoke MIRandom, 0, MAX_ITEM_INDEX ;Generate a random item index
  123.   mov ItemIndex, eax
  124.   Invoke V_CItem_GetItemLevel, ItemIndex, ItemType  ;Take item level for that exclusive item
  125.   .If (eax == 0)
  126. ;    RGB 255, 64, 64 ;Red Collor
  127. ; Mov Edx, Eax
  128. ; Invoke vprint, $CTA0("MobItemMng_SetItem:] CANT FIND ITEM LEVEL FOR ITEM TYPE [%d] ITEM INDEX [%d] "), Edx, 2, ItemType, ItemIndex
  129.     .Continue
  130.   .Endif
  131.   .If (eax >= MinItemLevel) && (eax < MaxLevelItem)
  132.     invoke V_MonsterItemMng_IsBlockedItem, ItemType, ItemIndex ;Check if the item is blocked
  133.     .If (eax != 0) ;Item not blocked
  134.       invoke V_MonsterItemMng_AddItem, pItemCounter, MobLevel, ItemType, ItemIndex ;, ItemOp1, ItemOp2, ItemOp3 (unused)
  135.       mov eax, pItemCounter
  136.       add byte ptr [eax], 1 ;Add 1 to total items for this mob level
  137.       mov edx, TotalItemsLoaded
  138.       .If ([eax] >= edx)
  139.         .Break
  140.       .Endif
  141.     .Endif
  142.   .Endif
  143.   add Counter, 1
  144.   mov eax, Counter
  145.   .If (eax >= TotalItemsLoaded)
  146.    .Break
  147.   .Endif
  148. .Endw
  149. Ret
  150. V_MonsterItemMng_GiveItem EndP
  151. V_MonsterItemMng_AddItem Proc pItemPerLvlCounter:Dword, MonsterLevel:Dword, ItemType:Dword, ItemIndex:Dword
  152. mov eax, pItemPerLvlCounter
  153. mov edx, [eax]
  154. imul edx, edx, SizeOf ItemStruct
  155. mov ecx, MonsterLevel
  156. lea ebx, pObjMobItemMng.pItemsPerLevel
  157. mov eax, [ebx + ecx * 4] ;MonsterLevel*DWORD+pItemsPerLevel = Pointer to item space for this monster level
  158. lea eax, [eax]
  159. add edx, eax ;Pointer to item space + Item Counter (Array method)
  160. invoke V_CItem_FillStruct, ItemType, ItemIndex, 0, 0, 0, 0, 0, 0 ;Fill Item Space with the information from Item.txt
  161. Ret
  162. V_MonsterItemMng_AddItem EndP
  163. V_MonsterItemMng_IsBlockedItem Proc ItemType:Dword, ItemIndex:Dword
  164. local TotalItems:Dword
  165. local LoopCounter:Dword
  166. local ItemReaded:Dword
  167. assume eax:ptr MONSTER_ITEM_MANAGER_FILE
  168. And LoopCounter, 0
  169. And ItemReaded, 0
  170. And TotalItems, 0
  171. mov eax, pObjMobItemMngFile
  172. xor ecx, ecx
  173. .Repeat
  174.  .Repeat
  175.    mov edx, ItemType
  176.    .If (Dl == [eax].ItemType)
  177.      mov ebx, ItemIndex
  178.      .If (Bl == [eax].ItemIndex)
  179.        jmp @IsEvent
  180.      .Endif
  181.    .Endif
  182.    .If (ItemReaded == 0)
  183.      movsx edx, [eax].ItemCounter
  184.      mov TotalItems, edx
  185.    .Endif
  186.    add ItemReaded, 1
  187.    mov ecx, ItemReaded
  188.    add eax, 2 ;ItemType & ItemIndex
  189.  .Until (ecx == TotalItems)
  190.  mov edx, ItemReaded
  191.  mov ItemReaded, 0
  192.  add LoopCounter, edx
  193.  mov edx, LoopCounter
  194.  add eax, TOTAL_EVENTS_SUPPORTED + SizeOf MONSTER_ITEM_MANAGER_FILE.ItemCounter
  195. .Until (edx == TotalItemsMobMng)
  196. mov eax, 1 ;Item dont founded
  197. jmp @End
  198. @IsEvent:
  199. mov edx, ItemReaded
  200. shl edx, 1 ;*2 (ItemType & ItemIndex)
  201. .If ([eax].DevilSquare == 0) && ([eax].BloodCastle == 0) && ([eax].ChaosCastle == 0)
  202.   xor eax, eax
  203.   jmp @End
  204. .Endif
  205. mov eax, 2 ;Item blocked but only for events
  206. @End:
  207. assume eax:NOTHING
  208. Ret
  209. V_MonsterItemMng_IsBlockedItem EndP