Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Can someone check this for me?
#1
I want to bring the enemy into a frame(#XXX) when his red hp is lower than #YYY %
(I had changed to code after Lord Silva gave me some suggestion)
This is my code
Code:
frame_event: sub eax,2000000 ; take off the '2' in front mov ebx,1000 mov edx,0 idiv ebx xor ebx,ebx mov ebx,eax xor eax,eax mov eax,edx xor edx,edx ; separate number #2XXXYYY into #XXX, #YYY. #XXX is stored in ebx, #YYY is stored in eax, EDX is cleared. mov ecx,dword ptr ds:[esi+edi*4+194h] mov edx,dword ptr ds:[ecx+368h] cmp dword ptr ds:[edx+6F8h],0 ; check the target is type 0 or not jnz r2 mov ecx,dword ptr ds:[esi+edi*4+194h] mov edx,dword ptr ds:[ecx+368h] push eax ; push the eax into temporary memory xor eax,eax mov eax,dword ptr ds:[edx+304h] ; MaxHP is stored in eax xor ecx,ecx xor edx,edx mov ecx,100 mov edx,0 idiv ecx ; Divied the MaxHP into 100(change into % state) xor edx,edx xor ecx,ecx mov eax,ecx ; Move MaxHP into ecx xor eax,eax mov eax,dword ptr ds:[edx+2fch] ; Get the red HP(eax) into eax mov edx,0 idiv ecx ; Divied the red HP by MaxHP(get the percentage) xor edx,edx xor ecx,ecx pop ecx ; Get the percentage into ecx cmp ecx,eax jl r2 ; check if red hp is lower than #YYYYY xor eax,eax mov eax,ebx mov ecx,dword ptr ds:[esi+edi*4+194h] mov dword ptr ds:[ecx+70h],eax ; if red hp is lower, move character to frame at indicated number #XXX. jmp r2
When I attack an enemy, the LF2 is close automatically and I don't know what wrong in this code.
Please help me :'(

(
Sorry for my poor english.
I will improve it.:D
Please try to understand my english and correct me if I use it wrong.
Thankyou
Reply
Thanks given by:
#2
Where did you stick that code? Doesn't really make much sense out of context.

The code seems fine, but you see to be doing a lot of pointless xor-ing.

xor ecx,ecx - ecx becomes 0
xor edx,edx - edx becomes 0
mov ecx,100 - ecx becomes a 100
mov edx,0 - edx becomes 0

I don't understand why you make them 0, and then mov values into them, especially when the value is 0.
[Image: doty7Xn.gif]

10 ʏᴇᴀʀs sɪɴᴄᴇ ɪʀᴄ ɢᴏᴏᴅ.ɪ ᴡᴀʟᴋ ᴛʜʀᴏᴜɢʜ ᴛʜᴇ ᴇᴍᴘᴛʏ sᴛʀᴇᴇᴛs ᴛʀʏɪɴɢ ᴛᴏ ᴛʜɪɴᴋ ᴏғ sᴏᴍᴇᴛʜɪɴɢ ᴇʟsᴇ ʙᴜᴛ ᴍʏ ᴘᴀᴛʜ ᴀʟᴡᴀʏs ʟᴇᴀᴅs ᴛᴏ ᴛʜᴇ ɪʀᴄ. ɪ sᴛᴀʀᴇ ᴀᴛ ᴛʜᴇ sᴄʀᴇᴇɴ ғᴏʀ ʜᴏᴜʀs ᴀɴᴅ ᴛʀʏ ᴛᴏ sᴜᴍᴍᴏɴ ᴛʜᴇ ɢᴏᴏᴅ ɪʀᴄ. ɪ ᴡᴀᴛᴄʜ ᴏᴛʜᴇʀ ɪʀᴄ ᴄʜᴀɴɴᴇʟs ʙᴜᴛ ɪᴛ ɪs ɴᴏ ɢᴏᴏᴅ. ɪ ᴘᴇsᴛᴇʀ ᴢᴏʀᴛ ᴀɴᴅ ᴛʀʏ ᴛᴏ ʀᴇsɪsᴛ ʜɪs sᴇxɪɴᴇss ʙᴜᴛ ɪᴛ ɪs ᴀʟʟ ᴍᴇᴀɴɪɴɢʟᴇss. ᴛʜᴇ ᴇɴᴅ ɪs ɴᴇᴀʀ.ɪ ᴛʜᴇɴ ᴜsᴜᴀʟʟʏ ʀᴇᴀᴅ sᴏᴍᴇ ᴏʟᴅ ɪʀᴄ ʟᴏɢs ᴀɴᴅ ᴄʀʏ ᴍʏsᴇʟғ ᴛᴏ sʟᴇᴇᴘ.


Reply
Thanks given by:
#3
This code is write by myself.Xd
I'm a beginner and I just refer to the code in the first part and write the other part.
First part:
Code:
sub eax,2000000 mov ebx,1000 mov edx,0 idiv ebx xor ebx,ebx mov ebx,eax xor eax,eax mov eax,edx xor edx,edx mov ecx,dword ptr ds:[esi+edi*4+194h] mov edx,dword ptr ds:[ecx+368h] cmp dword ptr ds:[edx+6F8h],0 jnz r2
While I was thinking, I think(Let eax be 2110025)
Code:
sub eax,2000000 eax=110025 mov ebx,1000 ebx=1000 mov edx,0 edx=0 idiv ebx eax/ebx --> integer part=eax decimal part=edx xor ebx,ebx ebx=0 mov ebx,eax eax=ebx=110 xor eax,eax eax=0 mov eax,edx edx=eax=25 xor edx,edx edx=0 .....
My conclusion in the first part is idiv (ebx or ecx or edx) = eax/(ebx or ecx or edx) .The integer part and the decimal part go to eax and the value which is 0 respectively.So I xor a lot.
But, Is just the 'xor' part make the LF2 close automatically?
And thank you for you reply.:)
Sorry for my poor english.
I will improve it.:D
Please try to understand my english and correct me if I use it wrong.
Thankyou
Reply
Thanks given by:
#4
I don't think it is the xor part that makes you lf2 crash, but getting rid of the xor's will make the code much more readable.

mov replaces the value, so there is no need to set it to 0.

lets say eax = 100

xor eax,eax ; eax is now 0
mov eax,5 ; eax is 5

if you only do:
mov eax,5

eax will also be 5. The xor's are not needed.

I think the problem is in these 2 lines:
mov ecx,dword ptr ds:[esi+edi*4+194h]
mov dword ptr ds:[ecx+70h],eax

I think that edi doesn't hold the enemy number, but some random value, probably something very high. Then when it tries to use it as a pointer it is pointing to memory which isn't in use and it crashes.

edit:
Actually, I think it is this part:
mov edx,0
idiv ecx ; Divied the MaxHP into 100(change into % state)
mov eax,ecx ; Move MaxHP into ecx
mov eax,dword ptr ds:[edx+2fch]

you set edx to 0, then you use it as part of your pointer, so you are pointing to an invalid memory address :D.


Edit 2:
I fixed it
Code:
frame_event: sub eax,2000000 ; take off the '2' in front mov ebx,1000 mov edx,0 idiv ebx mov ebx,eax mov eax,edx ; separate number #2XXXYYY into #XXX, #YYY. #XXX is stored in ebx, #YYY is stored in eax, EDX is cleared. mov ecx,dword ptr ds:[esi+edi*4+194h] mov edx,dword ptr ds:[ecx+368h] cmp dword ptr ds:[edx+6F8h],0 ; check the target is type 0 or not jnz r2 mov ecx,dword ptr ds:[esi+edi*4+194h] ;mov edx,dword ptr ds:[ecx+368h] Line isn't needed because maxhp is part of the primrary object atributes push eax ; push the eax into temporary memory push ecx mov eax,dword ptr ds:[ecx+304h] ; MaxHP is stored in eax mov ecx,100 xor edx,edx idiv ecx ; Divied the MaxHP into 100(change into % state) mov ecx,eax ; Move MaxHP into ecx pop edx mov eax,dword ptr ds:[edx+2fch] ; Get the red HP(eax) into eax xor edx,edx idiv ecx ; Divied the red HP by MaxHP(get the percentage) pop ecx ; Get the percentage into ecx cmp ecx,eax jl r2 ; check if red hp is lower than #YYYYY mov eax,ebx mov ecx,dword ptr ds:[esi+edi*4+194h] mov dword ptr ds:[ecx+70h],eax ; if red hp is lower, move character to frame at indicated number #XXX. jmp r2

There are no hit sparks for some reason :\ , don't ask me why. Maybe it is the way the effect detour is implemented(might be a feature).

I also see a potential bug in your code. If the max hp is lower than 100, the code won't work because you're dividing the maxhp by 100 ( 10/100 = 0, remainder 10), not a big deal really, as long as the attack does more than 100 dmg.
[Image: doty7Xn.gif]

10 ʏᴇᴀʀs sɪɴᴄᴇ ɪʀᴄ ɢᴏᴏᴅ.ɪ ᴡᴀʟᴋ ᴛʜʀᴏᴜɢʜ ᴛʜᴇ ᴇᴍᴘᴛʏ sᴛʀᴇᴇᴛs ᴛʀʏɪɴɢ ᴛᴏ ᴛʜɪɴᴋ ᴏғ sᴏᴍᴇᴛʜɪɴɢ ᴇʟsᴇ ʙᴜᴛ ᴍʏ ᴘᴀᴛʜ ᴀʟᴡᴀʏs ʟᴇᴀᴅs ᴛᴏ ᴛʜᴇ ɪʀᴄ. ɪ sᴛᴀʀᴇ ᴀᴛ ᴛʜᴇ sᴄʀᴇᴇɴ ғᴏʀ ʜᴏᴜʀs ᴀɴᴅ ᴛʀʏ ᴛᴏ sᴜᴍᴍᴏɴ ᴛʜᴇ ɢᴏᴏᴅ ɪʀᴄ. ɪ ᴡᴀᴛᴄʜ ᴏᴛʜᴇʀ ɪʀᴄ ᴄʜᴀɴɴᴇʟs ʙᴜᴛ ɪᴛ ɪs ɴᴏ ɢᴏᴏᴅ. ɪ ᴘᴇsᴛᴇʀ ᴢᴏʀᴛ ᴀɴᴅ ᴛʀʏ ᴛᴏ ʀᴇsɪsᴛ ʜɪs sᴇxɪɴᴇss ʙᴜᴛ ɪᴛ ɪs ᴀʟʟ ᴍᴇᴀɴɪɴɢʟᴇss. ᴛʜᴇ ᴇɴᴅ ɪs ɴᴇᴀʀ.ɪ ᴛʜᴇɴ ᴜsᴜᴀʟʟʏ ʀᴇᴀᴅ sᴏᴍᴇ ᴏʟᴅ ɪʀᴄ ʟᴏɢs ᴀɴᴅ ᴄʀʏ ᴍʏsᴇʟғ ᴛᴏ sʟᴇᴇᴘ.


Reply
Thanks given by: Thomas




Users browsing this thread: 1 Guest(s)