View Full Version : Data Collecting: Mob Damage/Defense Formula
Russt
2009-06-29, 09:53 PM
An attempt to find a concrete formula for the damage any monster can deal, given a character and its defense.
(Greyed fields are without screenshot or assumed values; if no attack is specified, touch damage assumed. Presented in no particular order)
Damage | Source | Character Level | Job Class | STR | DEF/MDEF | Contributor
6 | Blue Snail | 5 | Beginner | 22 | 0 | LightningZLazer
16 | Blue Snail | 144 | Bishop | 4 | 0 | LightningZLazer
12 | Blue Snail | 35 | Cleric | 4 | 0 | Russt
25 | Blue Snail | 118 | Hermit | 10 | 0 | Stereo
62 | Electrophant | 64 | I/L Wizard | 4 | 191 | Paracelsus
67 | Electrophant | 64 | I/L Wizard | 4 | 191 | Paracelsus
645 | Electrophant - attack1 | 64 | I/L Wizard | 4 | 191 | Paracelsus
681 | Electrophant - attack1 | 64 | I/L Wizard | 4 | 191 | Paracelsus
3 | Green Snail | 136 | Buccaneer | 670 | 30 | D3ath
6 | Blue Snail | 136 | Buccaneer | 670 | 30 | D3ath
8 | Red Snail | 136 | Buccaneer | 670 | 30 | D3ath
24 | Green Snail | 136 | Buccaneer | 670 | 0 | D3ath
26 | Blue Snail | 136 | Buccaneer | 670 | 0 | D3ath
30 | Red Snail | 136 | Buccaneer | 670 | 0 | D3ath
1485 | Bain | 200 | Warrior | 0 | 0 | Stereo
1566 | Bain | 200 | Warrior | 0 | 0 | Stereo
1519 | Bain | 200 | Warrior | 2000 | 0 | Stereo
1604 | Bain | 200 | Warrior | 2000 | 0 | Stereo
1569 | Bain | 200 | Warrior | 5000 | 0 | Stereo
1658 | Bain | 200 | Warrior | 5000 | 0 | Stereo
1453 | Bain | 200 | Beginner | 0 | 0 | Stereo
1535 | Bain | 200 | Beginner | 0 | 0 | Stereo
1454 | Bain | 200 | Beginner | 2000 | 0 | Stereo
1537 | Bain | 200 | Beginner | 2000 | 0 | Stereo
118 | Croco | 65 | Page | 257 | 299 | Loose
131 | Croco | 65 | Page | 257 | 299 | Loose
89 | Croco | 65 | Page | 257 | 339 | Loose
102 | Croco | 65 | Page | 257 | 339 | Loose
74 | Croco | 65 | Page | 258 | 363 | Loose
86 | Croco | 65 | Page | 258 | 363 | Loose
45 | Croco | 65 | Page | 258 | 403 | Loose
57 | Croco | 65 | Page | 258 | 403 | Loose
146 | Dyle (Attack Up) | 65 | Page | 258 | 363 | Loose
162 | Dyle (Attack Up) | 65 | Page | 258 | 363 | Loose
110 | Dyle (Attack Up) | 65 | Page | 258 | 403 | Loose
130 | Dyle (Attack Up) | 65 | Page | 258 | 403 | Loose
If you'd like to contribute, all you have to do is post a screenshot showing yourself taking damage from any monster, and your stat screen (required, or at the very least state your DEF; without it is worthless). They don't have to be in the same pic as long as they're the same stats.
If you really want to be useful, try and get a range. One pic each for the lowest and highest damages you see from the same thing. But it's not strictly required.
Also, if you've already collected some data (Fiel? :chin:), I'll take it. Accompanying screenshots would be nice but I won't require it, however if two data points appear to contradict each other and only one of them has a screenshot... you know which one I'll throw away.
--
I've already imported what's been posted in http://www.southperry.net/forums/showthread.php?t=11013 that thread, if no one objects (though I don't see why one would).
If there are other such threads, point me to them.
Stereo
2009-06-29, 10:53 PM
I did some tests that would be difficult to replicate in Global but add useful datapoints...
All with 0 w.def.
Bain vs. lv.200 Warrior (0 str) (White Knight iirc, I didn't write it down though)
1485-1566
Bain vs. lv.200 Warrior (2000 str)
1519-1604
Bain vs. lv.200 Warrior (5000 str)
1569-1658
Bain vs. lv.200 Beginner (0 str)
1453-1535
Bain vs. lv.200 Beginner (2000 str)
1454-1537
I'll get my Paladin to snails soon to take a SS there.
http://img5.imageshack.us/img5/1706/maple3559.jpg
Loose
2009-06-30, 12:01 AM
Damage | Source | Character Level | Job Class | STR | DEF/MDEF | Contributor
118 | Croco | 65 | Page | 257 | 299 | Loose
131 | Croco | 65 | Page | 257 | 299 | Loose
89 | Croco | 65 | Page | 257 | 339 | Loose
102 | Croco | 65 | Page | 257 | 339 | Loose
74 | Croco | 65 | Page | 258 | 363 | Loose
86 | Croco | 65 | Page | 258 | 363 | Loose
45 | Croco | 65 | Page | 258 | 403 | Loose
57 | Croco | 65 | Page | 258 | 403 | Loose
146 | Dyle (Attack Up) | 65 | Page | 258 | 363 | Loose
162 | Dyle (Attack Up) | 65 | Page | 258 | 363 | Loose
110 | Dyle (Attack Up) | 65 | Page | 258 | 403 | Loose
130 | Dyle (Attack Up) | 65 | Page | 258 | 403 | Loose
Didn't include Threaten in the table above.
http://i185.photobucket.com/albums/x190/loose24/pagedef.gif
I'll post my other characters with 0 Weapon Defense on Snails later.
A few things that might make this a lot easier:
- Edit Base.wz to set StandardPDD values to 0
- According to my research, all stats have some effect one way or another on damage received.
Apologize for the double post, but I've found these things to be true though some research I just did.
1. The player level has an impact on the amount of damage received.
2. The player level is involved in a multiplier of some sort, but is not a multiplier over the entire equation
Kortestanov
2009-07-08, 05:53 AM
Ive been doing some researches of my own, and i must say that im extremely close to it. From what I have now, i can see that its an extremely complicated forumula, and its something in the style of:
...many other calculations... (level*multiplier + str*multiplier + int*multiplier + dex*multiplier + luk*multiplier)... more calculations...
The only thing im missing is how are the multipliers generated. They are obviously not static because most of them are things like 2.123785135468.
I'm hoping to finish and have a formula by today's evening, but it will possibly take another day depending on how complicated generating the multipliers is.
On my level 1 equipless beginner with 429 str, 429 int, 50 dex, 50 luk, versus a green mushroom, it was something like (not exact, i have some things missing):
variable1 = dex * 0.25 + luk *0.2871941235 + str*0.4 + int * 0.111111111
if (some weird var i dont understand, possibly level < 15)
variable1 = variable1 * 0.00125
variable2 = level * 0.0018 + variable1 + 0.28
0-StandardPDD * 1.3 (i have no idea what to do with this line, i cant understand my own handwriting :ohno:)
damage = variable 2 - (some other variable (possibly def) * variable2 * 0.01)
however this always produced a static damage of about 61, not a min-max range. so i assume one of these "multipliers" was actually a randomized value.
aaannnndddd... im back to debugging.
AngelSL
2009-07-08, 07:38 AM
Note that the formula IS in the client.. if we had a very good debugger..
D3ath
2009-07-08, 07:53 AM
Some more info:
Damage Range|Source|Character Level|Job Class|Str|Dex|Int|Luk|DEF/MDEF|Contributor
167 ~ 175|Flyeye|144|Buccaneer|716|47|12|12|0|D3ath
159 ~ 167|Flyeye|144|Buccaneer|716|63|12|12|10|D3ath
9 ~ 17|Flyeye|144|Buccaneer|736|80|27|27|200|D3ath
A pattern I found is that the range for each one was 8, so maybe the weapon attack could affect the damage range.
http://img25.imageshack.us/img25/7744/167flyeye.png
http://img25.imageshack.us/img25/821/175flyeye.png
http://img33.imageshack.us/img33/1893/159flyeye.png
http://img25.imageshack.us/img25/5580/167flyeye2.png
http://img39.imageshack.us/img39/7159/9flyeye.png
http://img25.imageshack.us/img25/6155/17flyeye.png
MasPan
2009-07-08, 08:16 AM
Some more info:
Damage Range|Source|Character Level|Job Class|Str|Dex|Int|Luk|DEF/MDEF|Contributor
167 ~ 175|Flyeye|144|Buccaneer|716|47|12|12|0|D3ath
159 ~ 167|Flyeye|144|Buccaneer|716|63|12|12|0|D3ath
9 ~ 17|Flyeye|144|Buccaneer|736|80|27|27|0|D3ath
A pattern I found is that the range for each one was 8, so maybe the weapon attack could affect the damage range.
http://img25.imageshack.us/img25/7744/167flyeye.png
http://img25.imageshack.us/img25/821/175flyeye.png
http://img33.imageshack.us/img33/1893/159flyeye.png
http://img25.imageshack.us/img25/5580/167flyeye2.png
http://img39.imageshack.us/img39/7159/9flyeye.png
http://img25.imageshack.us/img25/6155/17flyeye.png
Forgot Zhelm and PAC def/mdef.
Kortestanov
2009-07-08, 08:39 AM
Note that the formula IS in the client.. if we had a very good debugger..of course the formula is in the client, and of course im using a debugger. how do you think i got all the data?
D3ath
2009-07-08, 09:35 AM
Forgot Zhelm and PAC def/mdef.
Oh right, forgot to change it. Don't have info on here (On PSP)
Kortestanov
2009-07-08, 10:14 AM
Okay guys, im almost finished! below is a beta algorithm I made in c# that calculated the damage recieved based on the character's level, standardPDD,def,str,int,luk,dex and a random value. note that the formula, as I said, is very complicated, and is being splitted into many paths. so for this to succeed, your character's def must be lower than the standardPDD for it.
I tested it on a level 10 beginner with 429 str 50 dex 400 int 57 luk and 7 def. It's recommended to do the same because as i said its still only a first version and there might be some bugs here and there. Ill post it in a new topic along with explanations and non-programmed formulas when im finished with it.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace defense
{
class Program
{
static int Main(string[] args)
{
int def = 7;
int level = 10;
int StandardPDD = 19; //can be found in Base.wz. it's 19 for a lvl 10 beginner
int str = 429;
int inte = 400; //lol i cant make a variable called "int" =\
int dex = 50;
int luk = 57;
int arg6 = 82; //monster's weapon att
uint arg3 = 0xBB6CABC0; //randomization value
int local3 = 0;
int local5 = 0;
int arg5 = 0;
float local6 = arg6;
float local4 = local6 * (float)0.85;
float local8 = local6 * (float)0.8;
//float temp2 = local8;
//float temp = local4 - local8;
//int eax = arg3 / 0x989680;
local8 = (((((local4 - local8) * (arg3 % 0x989680)) / 10000000) + local8) * local6) / 100; //or in other words, local8 = ((((((watt * 0.85) - (watt * 0.8)) * (random % 0x989680)) / 10000000) + (watt * 0.8)) * watt) / 100
arg6 = def;
if (arg6 > 0x7df)
arg6 = 0x7df; //apperantly max defense possible is 0x7df (2015)...
int value = 0; //one of these values i have no idea what they mean
int local1 = 0; //i have no idea what is that one too... seems like its always 0
if (local1 == 1)
{
//some different formula here, will extract it if i see a case when local1 != 0
}
else
{
local3 = str;
local5 = dex;
local1 = inte;
arg5 = luk;
arg5 = (int)((arg5 * 0.25) + (local5 * 0.2857142857142857) + (local3 * 0.4) + (local1 * 0.1111111111111111));
}
int arg1 = 15; //lolwut? i have no idea what is it again.
if (def >= StandardPDD)
{
//some different formula here, will extract it later
}
else
{
if (level < arg1)
{
local6 = (float)(arg5 * 0.00125);
int edi = def - StandardPDD;
float temp = (float)(((level * 0.001818181818181818 + local6 + 0.28) * edi * 1.3) + ((local6 + 0.28) * def));
float FinalDamage = local8 - temp;
return (int)FinalDamage;
}
else
{
//more annoying formulas...
}
}
return 0;
}
}
}
Nikkey
2009-07-08, 10:23 AM
Why in the world would the formula be like that? Are you serious that the formula works like that in-game? O.o
(Uh. How am I going to get a character with those stats without hacking or having a pserver?)
Kortestanov
2009-07-08, 10:32 AM
Why in the world would the formula be like that? Are you serious that the formula works like that in-game? O.o
(Uh. How am I going to get a character with those stats without hacking or having a pserver?)No, the formula is MUCH, MUCH more complicated (as i commented in the source, there are scenarios that have completely different formulas, for example if def > standardpdd). You want me to post the ripped assembler code here? I think it's beyond the max post size.
EDIT: lol, its 5 times bigger than the max post size.
You'd think with such a complicated formula they would have made defense more useful :f3:
"We've perfected the defense formula! It is balanced and will now react to even the most subtle change in stats!"
"Great. So how much damage should we make Pink Bean do?"
Kortestanov
2009-07-08, 11:04 AM
You'd think with such a complicated formula they would have made defense more useful :f3:
"We've perfected the defense formula! It is balanced and will now react to even the most subtle change in stats!"
"Great. So how much damage should we make Pink Bean do?"
Actually if you look at the formula, stats barely do anything at all. and as suspected, str is the most "critical" stat, followed by dex, then luk in an extremely small difference, and int. int is about 4 times less than str.
Stereo
2009-07-08, 01:51 PM
No, the formula is MUCH, MUCH more complicated (as i commented in the source, there are scenarios that have completely different formulas, for example if def > standardpdd). You want me to post the ripped assembler code here? I think it's beyond the max post size.
EDIT: lol, its 5 times bigger than the max post size.
Does it include the avoidability/miss formula in that? I think it would be useful to at least get a ballpark figure for that, right now the only thing people know is "more avoid = more misses".
Does it include the avoidability/miss formula in that? I think it would be useful to at least get a ballpark figure for that, right now the only thing people know is "more avoid = more misses".
There's another fact - No matter how much avoid you have, a 100% miss rate is not possible.
Kortestanov
2009-07-08, 02:01 PM
Does it include the avoidability/miss formula in that? I think it would be useful to at least get a ballpark figure for that, right now the only thing people know is "more avoid = more misses".
Yes, it does. I'm almost finished with creating a damage simulator (will probably finish in the next 10 mins and take an hour to test it) and then ill go for the miss formula.
Paracelsus
2009-07-08, 03:15 PM
couldn't you post all of the code by enveloping it in the 'code' code? or maybe set it up as a spoiler?
Kortestanov
2009-07-08, 03:44 PM
couldn't you post all of the code by enveloping it in the 'code' code? or maybe set it up as a spoiler?It's too long. And I can count the people here who are able read and understand 400 lines of assembler on one hand.
Paracelsus
2009-07-08, 04:27 PM
Well I hope I'm one of those fingers on that hand, lol.
Kortestanov
2009-07-08, 04:42 PM
Well I hope I'm one of those fingers on that hand, lol.I must say I never heard of you, but here you go :goggle:
CPU Disasm
Address Hex dump Command Comments
0066D7AA /$ 55 PUSH EBP ; MyStory.0066D7AA(guessed Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7)
0066D7AB |. 8BEC MOV EBP,ESP
0066D7AD |. 83EC 20 SUB ESP,20
0066D7B0 |. 53 PUSH EBX
0066D7B1 |. 8B5D 14 MOV EBX,DWORD PTR SS:[ARG.4]
0066D7B4 |. 56 PUSH ESI
0066D7B5 |. 8B75 10 MOV ESI,DWORD PTR SS:[ARG.3]
0066D7B8 |. 57 PUSH EDI
0066D7B9 |. FF75 1C PUSH DWORD PTR SS:[ARG.6] ; /Arg5 = -0C
0066D7BC |. 8B7D 08 MOV EDI,DWORD PTR SS:[ARG.1] ; |
0066D7BF |. 53 PUSH EBX ; |Arg4 = MyStory.977F28
0066D7C0 |. 56 PUSH ESI ; |Arg3 = MyStory.978408
0066D7C1 |. FF75 0C PUSH DWORD PTR SS:[ARG.2] ; |Arg2 = ASCII "9u"
0066D7C4 |. 894D F8 MOV DWORD PTR SS:[LOCAL.2],ECX ; |
0066D7C7 |. 57 PUSH EDI ; |Arg1 = -0C
0066D7C8 |. E8 B6F7FFFF CALL MyStory.0066CF83 ; \MyStory.0066CF83
0066D7CD |. 85C0 TEST EAX,EAX
0066D7CF |. 74 07 JE SHORT MyStory.0066D7D8
0066D7D1 |. 33C0 XOR EAX,EAX
0066D7D3 |. E9 A4030000 JMP MyStory.0066DB7C
0066D7D8 |> FF76 20 PUSH DWORD PTR DS:[ESI+20] ; /Arg2 = 8DD68FA0
0066D7DB |. 8D46 18 LEA EAX,[ESI+18] ; |
0066D7DE |. 50 PUSH EAX ; |Arg1 = 3920
0066D7DF |. E8 6E5BDAFF CALL MyStory.00413352 ; \MyStory.00413352
0066D7E4 |. 59 POP ECX ; ASCII "`?"
0066D7E5 |. 59 POP ECX ; ASCII "`?"
0066D7E6 |. 99 CDQ
0066D7E7 |. 6A 64 PUSH 64
0066D7E9 |. 59 POP ECX ; ASCII "`?"
0066D7EA |. F7F9 IDIV ECX
0066D7EC |. 8B4D 18 MOV ECX,DWORD PTR SS:[ARG.5]
0066D7EF |. 85C9 TEST ECX,ECX
0066D7F1 |. 8945 FC MOV DWORD PTR SS:[LOCAL.1],EAX
0066D7F4 |. 8B47 28 MOV EAX,DWORD PTR DS:[EDI+28]
0066D7F7 |. 74 05 JE SHORT MyStory.0066D7FE
0066D7F9 |. 0341 18 ADD EAX,DWORD PTR DS:[ECX+18]
0066D7FC |. EB 03 JMP SHORT MyStory.0066D801
0066D7FE |> 0347 24 ADD EAX,DWORD PTR DS:[EDI+24]
0066D801 |> 85C0 TEST EAX,EAX
0066D803 |. 7F 02 JG SHORT MyStory.0066D807
0066D805 |. 33C0 XOR EAX,EAX
0066D807 |> BF CF070000 MOV EDI,7CF
0066D80C |. 3BC7 CMP EAX,EDI
0066D80E |. 8945 1C MOV DWORD PTR SS:[ARG.6],EAX
0066D811 |. 7C 03 JL SHORT MyStory.0066D816
0066D813 |. 897D 1C MOV DWORD PTR SS:[ARG.6],EDI
0066D816 |> 8B45 F8 MOV EAX,DWORD PTR SS:[LOCAL.2]
0066D819 |. 8D88 A0000000 LEA ECX,[EAX+0A0]
0066D81F |. E8 B75BDAFF CALL MyStory.004133DB
0066D824 |. DB45 1C FILD DWORD PTR SS:[ARG.6]
0066D827 |. 8945 10 MOV DWORD PTR SS:[ARG.3],EAX
0066D82A |. DD55 E8 FST QWORD PTR SS:[LOCAL.6] ; FLOAT 60.606508091223552980
0066D82D |. DC0D 883A8E00 FMUL QWORD PTR DS:[MyStory.8E3A88] ; FLOAT 0.8500000000000000
0066D833 |. DD55 F0 FST QWORD PTR SS:[LOCAL.4] ; FLOAT 60.606508091223552980
0066D836 |. DD45 E8 FLD QWORD PTR SS:[LOCAL.6] ; FLOAT 0.3050000000000000
0066D839 |. DC0D A8398E00 FMUL QWORD PTR DS:[MyStory.8E39A8] ; FLOAT 0.8000000000000000
0066D83F |. DD5D E0 FSTP QWORD PTR SS:[LOCAL.8] ; FLOAT 60.606508091223552980
0066D842 |. DC55 E0 FCOM QWORD PTR SS:[LOCAL.8] ; FLOAT 60.60650809122355
0066D845 |. DFE0 FSTSW AX
0066D847 |. 9E SAHF
0066D848 |. 76 16 JBE SHORT MyStory.0066D860
0066D84A |. 8D45 E0 LEA EAX,[LOCAL.8]
0066D84D |. DDD8 FSTP ST ; FLOAT 60.606508091223552980
0066D84F |. 50 PUSH EAX ; /Arg2 = 3920
0066D850 |. 8D45 F0 LEA EAX,[LOCAL.4] ; |
0066D853 |. 50 PUSH EAX ; |Arg1 = 3920
0066D854 |. E8 E01B0000 CALL MyStory.0066F439 ; \MyStory.0066F439
0066D859 |. DD45 F0 FLD QWORD PTR SS:[LOCAL.4] ; FLOAT 9.111849926407844e-312
0066D85C |. 59 POP ECX ; ASCII "`?"
0066D85D |. 59 POP ECX ; ASCII "`?"
0066D85E |. EB 08 JMP SHORT MyStory.0066D868
0066D860 |> DC55 E0 FCOM QWORD PTR SS:[LOCAL.8] ; FLOAT 60.60650809122355
0066D863 |. DFE0 FSTSW AX
0066D865 |. 9E SAHF
0066D866 |. 74 25 JE SHORT MyStory.0066D88D
0066D868 |> 8B45 10 MOV EAX,DWORD PTR SS:[ARG.3]
0066D86B |. DD45 E0 FLD QWORD PTR SS:[LOCAL.8] ; FLOAT 60.60650809122355
0066D86E |. 33D2 XOR EDX,EDX
0066D870 |. D8E1 FSUB ST,ST(1) ; FLOAT -??? FFFF 0000000E 00000009
0066D872 |. B9 80969800 MOV ECX,OFFSET MyStory.00989680
0066D877 |. F7F1 DIV ECX
0066D879 |. 8365 E4 00 AND DWORD PTR SS:[LOCAL.7],00000000
0066D87D |. 8955 E0 MOV DWORD PTR SS:[LOCAL.8],EDX
0066D880 |. DF6D E0 FILD QWORD PTR SS:[LOCAL.8]
0066D883 |. DEC9 FMULP ST(1),ST ; FLOAT 60.606508091223552980
0066D885 |. DC0D 70878E00 FMUL QWORD PTR DS:[MyStory.8E8770] ; FLOAT 1.000000100000010e-07
0066D88B |. DEC1 FADDP ST(1),ST ; FLOAT 60.606508091223552980
0066D88D |> FF73 38 PUSH DWORD PTR DS:[EBX+38] ; /Arg2 = 0E1A900E
0066D890 |. DC4D E8 FMUL QWORD PTR SS:[LOCAL.6] ; |FLOAT 0.3050000000000000
0066D893 |. 8D43 30 LEA EAX,[EBX+30] ; |
0066D896 |. 50 PUSH EAX ; |Arg1 = 3920
0066D897 |. DC0D A03C8E00 FMUL QWORD PTR DS:[MyStory.8E3CA0] ; |FLOAT 0.01000000000000000
0066D89D |. DD5D E0 FSTP QWORD PTR SS:[LOCAL.8] ; |FLOAT 60.606508091223552980
0066D8A0 |. E8 AD5ADAFF CALL MyStory.00413352 ; \MyStory.00413352
0066D8A5 |. FF73 44 PUSH DWORD PTR DS:[EBX+44] ; /Arg2 = 461A706D
0066D8A8 |. 83C3 3C ADD EBX,3C ; |
0066D8AB |. 53 PUSH EBX ; |Arg1 = MyStory.977F28
0066D8AC |. 8945 1C MOV DWORD PTR SS:[ARG.6],EAX ; |
0066D8AF |. E8 9E5ADAFF CALL MyStory.00413352 ; \MyStory.00413352
0066D8B4 |. 0345 1C ADD EAX,DWORD PTR SS:[ARG.6]
0066D8B7 |. 83C4 10 ADD ESP,10
0066D8BA |. 85C0 TEST EAX,EAX
0066D8BC |. 7F 02 JG SHORT MyStory.0066D8C0
0066D8BE |. 33C0 XOR EAX,EAX
0066D8C0 |> 3BC7 CMP EAX,EDI
0066D8C2 |. 7D 02 JGE SHORT MyStory.0066D8C6
0066D8C4 |. 8BF8 MOV EDI,EAX
0066D8C6 |> FF76 14 PUSH DWORD PTR DS:[ESI+14] ; /Arg2 = 8E2A6FF4
0066D8C9 |. 8D5E 0C LEA EBX,[ESI+0C] ; |
0066D8CC |. 53 PUSH EBX ; |Arg1 = MyStory.977F28
0066D8CD |. 897D 10 MOV DWORD PTR SS:[ARG.3],EDI ; |
0066D8D0 |. E8 7D5ADAFF CALL MyStory.00413352 ; \MyStory.00413352
0066D8D5 |. 50 PUSH EAX ; /Arg2 = 3920
0066D8D6 |. FF75 FC PUSH DWORD PTR SS:[LOCAL.1] ; |Arg1 = 190
0066D8D9 |. E8 A2FDFFFF CALL MyStory.0066D680 ; \MyStory.0066D680
0066D8DE |. 83C4 10 ADD ESP,10
0066D8E1 |. 837D FC 01 CMP DWORD PTR SS:[LOCAL.1],1
0066D8E5 |. FF76 2C PUSH DWORD PTR DS:[ESI+2C] ; //Arg2 = 91E68FAC
0066D8E8 |. 8945 1C MOV DWORD PTR SS:[ARG.6],EAX ; ||
0066D8EB |. 8D46 24 LEA EAX,[ESI+24] ; ||
0066D8EE |. 50 PUSH EAX ; ||Arg1 = 3920
0066D8EF |. 75 5A JNE SHORT MyStory.0066D94B ; ||
0066D8F1 |. E8 5C5ADAFF CALL MyStory.00413352 ; |\MyStory.00413352
0066D8F6 |. FF76 38 PUSH DWORD PTR DS:[ESI+38] ; |/Arg2 = 71E58FC8
0066D8F9 |. 8945 EC MOV DWORD PTR SS:[LOCAL.5],EAX ; ||
0066D8FC |. 8D46 30 LEA EAX,[ESI+30] ; ||
0066D8FF |. 50 PUSH EAX ; ||Arg1 = 3920
0066D900 |. E8 4D5ADAFF CALL MyStory.00413352 ; |\MyStory.00413352
0066D905 |. FF76 44 PUSH DWORD PTR DS:[ESI+44] ; |/Arg2 = 8DE9705E
0066D908 |. 8945 FC MOV DWORD PTR SS:[LOCAL.1],EAX ; ||
0066D90B |. 8D46 3C LEA EAX,[ESI+3C] ; ||
0066D90E |. 50 PUSH EAX ; ||Arg1 = 3920
0066D90F |. E8 3E5ADAFF CALL MyStory.00413352 ; |\MyStory.00413352
0066D914 |. FF76 50 PUSH DWORD PTR DS:[ESI+50] ; |/Arg2 = 6E26702C
0066D917 |. 8945 F4 MOV DWORD PTR SS:[LOCAL.3],EAX ; ||
0066D91A |. 8D46 48 LEA EAX,[ESI+48] ; ||
0066D91D |. 50 PUSH EAX ; ||Arg1 = 3920
0066D91E |. E8 2F5ADAFF CALL MyStory.00413352 ; |\MyStory.00413352
0066D923 |. 8945 18 MOV DWORD PTR SS:[ARG.5],EAX ; |
0066D926 |. DB45 18 FILD DWORD PTR SS:[ARG.5] ; |
0066D929 |. 83C4 20 ADD ESP,20 ; |
0066D92C |. DA45 FC FIADD DWORD PTR SS:[LOCAL.1] ; |FLOAT 60.606508091223552980
0066D92F |. DC0D 38888E00 FMUL QWORD PTR DS:[MyStory.8E8838] ; |FLOAT 0.2500000000000000
0066D935 |. DB45 F4 FILD DWORD PTR SS:[LOCAL.3] ; |
0066D938 |. DC0D 30888E00 FMUL QWORD PTR DS:[MyStory.8E8830] ; |FLOAT 0.1111111111111111
0066D93E |. DEC1 FADDP ST(1),ST ; |FLOAT 60.606508091223552980
0066D940 |. DB45 EC FILD DWORD PTR SS:[LOCAL.5] ; |
0066D943 |. DC0D 28888E00 FMUL QWORD PTR DS:[MyStory.8E8828] ; |FLOAT 0.2857142857142857
0066D949 |. EB 60 JMP SHORT MyStory.0066D9AB ; |
0066D94B |> E8 025ADAFF CALL MyStory.00413352 ; \MyStory.00413352
0066D950 |. FF76 38 PUSH DWORD PTR DS:[ESI+38] ; /Arg2 = 71E58FC8
0066D953 |. 8945 F4 MOV DWORD PTR SS:[LOCAL.3],EAX ; |
0066D956 |. 8D46 30 LEA EAX,[ESI+30] ; |
0066D959 |. 50 PUSH EAX ; |Arg1 = 3920
0066D95A |. E8 F359DAFF CALL MyStory.00413352 ; \MyStory.00413352
0066D95F |. FF76 44 PUSH DWORD PTR DS:[ESI+44] ; /Arg2 = 8DE9705E
0066D962 |. 8945 EC MOV DWORD PTR SS:[LOCAL.5],EAX ; |
0066D965 |. 8D46 3C LEA EAX,[ESI+3C] ; |
0066D968 |. 50 PUSH EAX ; |Arg1 = 3920
0066D969 |. E8 E459DAFF CALL MyStory.00413352 ; \MyStory.00413352
0066D96E |. FF76 50 PUSH DWORD PTR DS:[ESI+50] ; /Arg2 = 6E26702C
0066D971 |. 8945 FC MOV DWORD PTR SS:[LOCAL.1],EAX ; |
0066D974 |. 8D46 48 LEA EAX,[ESI+48] ; |
0066D977 |. 50 PUSH EAX ; |Arg1 = 3920
0066D978 |. E8 D559DAFF CALL MyStory.00413352 ; \MyStory.00413352
0066D97D |. 8945 18 MOV DWORD PTR SS:[ARG.5],EAX
0066D980 |. DB45 18 FILD DWORD PTR SS:[ARG.5]
0066D983 |. 83C4 20 ADD ESP,20
0066D986 |. DC0D 38888E00 FMUL QWORD PTR DS:[MyStory.8E8838] ; FLOAT 0.2500000000000000
0066D98C |. DB45 EC FILD DWORD PTR SS:[LOCAL.5]
0066D98F |. DC0D 28888E00 FMUL QWORD PTR DS:[MyStory.8E8828] ; FLOAT 0.2857142857142857
0066D995 |. DEC1 FADDP ST(1),ST ; FLOAT 60.606508091223552980
0066D997 |. DB45 F4 FILD DWORD PTR SS:[LOCAL.3]
0066D99A |. DC0D 20888E00 FMUL QWORD PTR DS:[MyStory.8E8820] ; FLOAT 0.4000000000000000
0066D9A0 |. DEC1 FADDP ST(1),ST ; FLOAT 60.606508091223552980
0066D9A2 |. DB45 FC FILD DWORD PTR SS:[LOCAL.1]
0066D9A5 |. DC0D 30888E00 FMUL QWORD PTR DS:[MyStory.8E8830] ; FLOAT 0.1111111111111111
0066D9AB |> DEC1 FADDP ST(1),ST ; FLOAT 60.606508091223552980
0066D9AD |. E8 FA8B2000 CALL MyStory.008765AC
0066D9B2 |. 3B7D 1C CMP EDI,DWORD PTR SS:[ARG.6]
0066D9B5 |. 8945 18 MOV DWORD PTR SS:[ARG.5],EAX
0066D9B8 |. 7C 5E JL SHORT MyStory.0066DA18
0066D9BA |. FF76 14 PUSH DWORD PTR DS:[ESI+14] ; /Arg2 = 8E2A6FF4
0066D9BD |. DB45 18 FILD DWORD PTR SS:[ARG.5] ; |
0066D9C0 |. 53 PUSH EBX ; |Arg1 = MyStory.977F28
0066D9C1 |. DD5D E8 FSTP QWORD PTR SS:[LOCAL.6] ; |FLOAT 60.606508091223552980
0066D9C4 |. E8 8959DAFF CALL MyStory.00413352 ; \MyStory.00413352
0066D9C9 |. 2B7D 1C SUB EDI,DWORD PTR SS:[ARG.6]
0066D9CC |. 8945 18 MOV DWORD PTR SS:[ARG.5],EAX
0066D9CF |. DB45 18 FILD DWORD PTR SS:[ARG.5]
0066D9D2 |. 897D 1C MOV DWORD PTR SS:[ARG.6],EDI
0066D9D5 |. 59 POP ECX ; ASCII "`?"
0066D9D6 |. 59 POP ECX ; ASCII "`?"
0066D9D7 |. DC0D 18888E00 FMUL QWORD PTR DS:[MyStory.8E8818] ; FLOAT 0.0007692307692307692
0066D9DD |. DD45 E8 FLD QWORD PTR SS:[LOCAL.6] ; FLOAT 0.3050000000000000
0066D9E0 |. DC0D 10888E00 FMUL QWORD PTR DS:[MyStory.8E8810] ; FLOAT 0.001111111111111111
0066D9E6 |. DEC1 FADDP ST(1),ST ; FLOAT 60.606508091223552980
0066D9E8 |. DC05 08888E00 FADD QWORD PTR DS:[MyStory.8E8808] ; FLOAT 0.2800000000000000
0066D9EE |. DB45 1C FILD DWORD PTR SS:[ARG.6]
0066D9F1 |. DEC9 FMULP ST(1),ST ; FLOAT 60.606508091223552980
0066D9F3 |. DC0D C8868E00 FMUL QWORD PTR DS:[MyStory.8E86C8] ; FLOAT 0.7000000000000000
0066D9F9 |. DD45 E8 FLD QWORD PTR SS:[LOCAL.6] ; FLOAT 0.3050000000000000
0066D9FC |. DC0D 00888E00 FMUL QWORD PTR DS:[MyStory.8E8800] ; FLOAT 0.001250000000000000
0066DA02 |> DC05 08888E00 FADD QWORD PTR DS:[MyStory.8E8808] ; FLOAT 0.2800000000000000
0066DA08 |. DA4D 10 FIMUL DWORD PTR SS:[ARG.3] ; FLOAT 60.606508091223552980
0066DA0B |. DEC1 FADDP ST(1),ST ; FLOAT 60.606508091223552980
0066DA0D |. DC6D E0 FSUBR QWORD PTR SS:[LOCAL.8] ; FLOAT 60.60650809122355
0066DA10 |. DD5D E0 FSTP QWORD PTR SS:[LOCAL.8] ; FLOAT 60.606508091223552980
0066DA13 |. E9 BF000000 JMP MyStory.0066DAD7
0066DA18 |> FF76 14 PUSH DWORD PTR DS:[ESI+14] ; /Arg2 = 8E2A6FF4
0066DA1B |. 53 PUSH EBX ; |Arg1 = MyStory.977F28
0066DA1C |. E8 3159DAFF CALL MyStory.00413352 ; \MyStory.00413352
0066DA21 |. 59 POP ECX ; ASCII "`?"
0066DA22 |. 59 POP ECX ; ASCII "`?"
0066DA23 |. 8B4D 08 MOV ECX,DWORD PTR SS:[ARG.1]
0066DA26 |. 3B01 CMP EAX,DWORD PTR DS:[ECX]
0066DA28 |. 7D 42 JGE SHORT MyStory.0066DA6C
0066DA2A |. DB45 18 FILD DWORD PTR SS:[ARG.5]
0066DA2D |. FF76 14 PUSH DWORD PTR DS:[ESI+14] ; /Arg2 = 8E2A6FF4
0066DA30 |. 53 PUSH EBX ; |Arg1 = MyStory.977F28
0066DA31 |. DC0D 00888E00 FMUL QWORD PTR DS:[MyStory.8E8800] ; |FLOAT 0.001250000000000000
0066DA37 |. DD5D E8 FSTP QWORD PTR SS:[LOCAL.6] ; |FLOAT 60.606508091223552980
0066DA3A |. E8 1359DAFF CALL MyStory.00413352 ; \MyStory.00413352
0066DA3F |. 2B7D 1C SUB EDI,DWORD PTR SS:[ARG.6]
0066DA42 |. 8945 18 MOV DWORD PTR SS:[ARG.5],EAX ; //level?
0066DA45 |. DB45 18 FILD DWORD PTR SS:[ARG.5]
0066DA48 |. 897D 1C MOV DWORD PTR SS:[ARG.6],EDI
0066DA4B |. 59 POP ECX ; ASCII "`?"
0066DA4C |. 59 POP ECX ; ASCII "`?"
0066DA4D |. DC0D F8878E00 FMUL QWORD PTR DS:[MyStory.8E87F8] ; FLOAT 0.001818181818181818
0066DA53 |. DC45 E8 FADD QWORD PTR SS:[LOCAL.6] ; FLOAT 0.3050000000000000
0066DA56 |. DC05 08888E00 FADD QWORD PTR DS:[MyStory.8E8808] ; FLOAT 0.2800000000000000
0066DA5C |. DB45 1C FILD DWORD PTR SS:[ARG.6]
0066DA5F |. DEC9 FMULP ST(1),ST ; FLOAT 60.606508091223552980
0066DA61 |. DC0D 60878E00 FMUL QWORD PTR DS:[MyStory.8E8760] ; FLOAT 1.300000000000000
0066DA67 |. DD45 E8 FLD QWORD PTR SS:[LOCAL.6] ; FLOAT 0.3050000000000000
0066DA6A |.^ EB 96 JMP SHORT MyStory.0066DA02
0066DA6C |> FF76 14 PUSH DWORD PTR DS:[ESI+14] ; /Arg2 = 8E2A6FF4
0066DA6F |. 53 PUSH EBX ; |Arg1 = MyStory.977F28
0066DA70 |. E8 DD58DAFF CALL MyStory.00413352 ; \MyStory.00413352
0066DA75 |. FF76 14 PUSH DWORD PTR DS:[ESI+14] ; /Arg2 = 8E2A6FF4
0066DA78 |. 8945 EC MOV DWORD PTR SS:[LOCAL.5],EAX ; |
0066DA7B |. 53 PUSH EBX ; |Arg1 = MyStory.977F28
0066DA7C |. E8 D158DAFF CALL MyStory.00413352 ; \MyStory.00413352
0066DA81 |. DB45 18 FILD DWORD PTR SS:[ARG.5]
0066DA84 |. 2B7D 1C SUB EDI,DWORD PTR SS:[ARG.6]
0066DA87 |. 8B4D 08 MOV ECX,DWORD PTR SS:[ARG.1]
0066DA8A |. DC0D 00888E00 FMUL QWORD PTR DS:[MyStory.8E8800] ; FLOAT 0.001250000000000000
0066DA90 |. 897D 1C MOV DWORD PTR SS:[ARG.6],EDI
0066DA93 |. DB45 EC FILD DWORD PTR SS:[LOCAL.5]
0066DA96 |. 83C4 10 ADD ESP,10
0066DA99 |. 2B01 SUB EAX,DWORD PTR DS:[ECX]
0066DA9B |. DC0D F8878E00 FMUL QWORD PTR DS:[MyStory.8E87F8] ; FLOAT 0.001818181818181818
0066DAA1 |. D8C1 FADD ST,ST(1) ; FLOAT -??? FFFF 0000000E 00000009
0066DAA3 |. DC05 08888E00 FADD QWORD PTR DS:[MyStory.8E8808] ; FLOAT 0.2800000000000000
0066DAA9 |. DB45 1C FILD DWORD PTR SS:[ARG.6]
0066DAAC |. 8945 1C MOV DWORD PTR SS:[ARG.6],EAX
0066DAAF |. DEC9 FMULP ST(1),ST ; FLOAT 60.606508091223552980
0066DAB1 |. DC0D F0878E00 FMUL QWORD PTR DS:[MyStory.8E87F0] ; FLOAT 13.00000000000000
0066DAB7 |. DB45 1C FILD DWORD PTR SS:[ARG.6]
0066DABA |. DC05 F0878E00 FADD QWORD PTR DS:[MyStory.8E87F0] ; FLOAT 13.00000000000000
0066DAC0 |. DEF9 FDIVP ST(1),ST ; FLOAT 60.606508091223552980
0066DAC2 |. D9C1 FLD ST(1) ; FLOAT -??? FFFF 0000000E 00000009
0066DAC4 |. DC05 08888E00 FADD QWORD PTR DS:[MyStory.8E8808] ; FLOAT 0.2800000000000000
0066DACA |. DA4D 10 FIMUL DWORD PTR SS:[ARG.3] ; FLOAT 60.606508091223552980
0066DACD |. DEC1 FADDP ST(1),ST ; FLOAT 60.606508091223552980
0066DACF |. DC6D E0 FSUBR QWORD PTR SS:[LOCAL.8] ; FLOAT 60.60650809122355
0066DAD2 |. DD5D E0 FSTP QWORD PTR SS:[LOCAL.8] ; FLOAT 60.606508091223552980
0066DAD5 |. DDD8 FSTP ST ; FLOAT 60.606508091223552980
0066DAD7 |> 8B75 14 MOV ESI,DWORD PTR SS:[ARG.4]
0066DADA |. FFB6 9C020000 PUSH DWORD PTR DS:[ESI+29C] ; /Arg2 = 91D58FB6
0066DAE0 |. 8D86 94020000 LEA EAX,[ESI+294] ; |
0066DAE6 |. 50 PUSH EAX ; |Arg1 = 3920
0066DAE7 |. E8 6658DAFF CALL MyStory.00413352 ; \MyStory.00413352
0066DAEC |. FFB6 7C040000 PUSH DWORD PTR DS:[ESI+47C] ; /Arg2 = 19B6088F
0066DAF2 |. 8945 14 MOV DWORD PTR SS:[ARG.4],EAX ; |
0066DAF5 |. DB45 14 FILD DWORD PTR SS:[ARG.4] ; |
0066DAF8 |. 81C6 74040000 ADD ESI,474 ; |
0066DAFE |. 56 PUSH ESI ; |Arg1 = MyStory.978408
0066DAFF |. DC4D E0 FMUL QWORD PTR SS:[LOCAL.8] ; |FLOAT 60.60650809122355
0066DB02 |. DC0D A03C8E00 FMUL QWORD PTR DS:[MyStory.8E3CA0] ; |FLOAT 0.01000000000000000
0066DB08 |. DC6D E0 FSUBR QWORD PTR SS:[LOCAL.8] ; |FLOAT 60.60650809122355
0066DB0B |. DD5D E0 FSTP QWORD PTR SS:[LOCAL.8] ; |FLOAT 60.606508091223552980
0066DB0E |. E8 3F58DAFF CALL MyStory.00413352 ; \MyStory.00413352
0066DB13 |. 83C4 10 ADD ESP,10
0066DB16 |. 85C0 TEST EAX,EAX
0066DB18 |. 74 1C JE SHORT MyStory.0066DB36
0066DB1A |. 8B75 20 MOV ESI,DWORD PTR SS:[ARG.7]
0066DB1D |. 85F6 TEST ESI,ESI
0066DB1F |. 74 15 JE SHORT MyStory.0066DB36
0066DB21 |. DD45 E0 FLD QWORD PTR SS:[LOCAL.8] ; FLOAT 60.60650809122355
0066DB24 |. 51 PUSH ECX
0066DB25 |. 51 PUSH ECX
0066DB26 |. 8B4D F8 MOV ECX,DWORD PTR SS:[LOCAL.2]
0066DB29 |. DD1C24 FSTP QWORD PTR SS:[LOCAL.13] ; /Arg2_3
0066DB2C |. FF75 0C PUSH DWORD PTR SS:[ARG.2] ; |Arg1 = ASCII "9u"
0066DB2F |. E8 7FFBFFFF CALL MyStory.0066D6B3 ; \MyStory.0066D6B3
0066DB34 |. 8906 MOV DWORD PTR DS:[ESI],EAX
0066DB36 |> 8B45 08 MOV EAX,DWORD PTR SS:[ARG.1]
0066DB39 |. 8B80 D4000000 MOV EAX,DWORD PTR DS:[EAX+0D4]
0066DB3F |. 85C0 TEST EAX,EAX
0066DB41 |. 8945 08 MOV DWORD PTR SS:[ARG.1],EAX
0066DB44 |. 74 0E JE SHORT MyStory.0066DB54
0066DB46 |. DB45 08 FILD DWORD PTR SS:[ARG.1]
0066DB49 |. DC4D E0 FMUL QWORD PTR SS:[LOCAL.8] ; FLOAT 60.60650809122355
0066DB4C |. DC0D A03C8E00 FMUL QWORD PTR DS:[MyStory.8E3CA0] ; FLOAT 0.01000000000000000
0066DB52 |. EB 03 JMP SHORT MyStory.0066DB57
0066DB54 |> DD45 E0 FLD QWORD PTR SS:[LOCAL.8] ; FLOAT 60.60650809122355
0066DB57 |> D9E8 FLD1
0066DB59 |. D8D9 FCOMP ST(1) ; FLOAT -??? FFFF 0000000E 00000009
0066DB5B |. DFE0 FSTSW AX
0066DB5D |. 9E SAHF
0066DB5E |. 72 04 JB SHORT MyStory.0066DB64
0066DB60 |. DDD8 FSTP ST ; FLOAT 60.606508091223552980
0066DB62 |. D9E8 FLD1
0066DB64 |> DC15 68878E00 FCOM QWORD PTR DS:[MyStory.8E8768] ; FLOAT 99999.00000000000
0066DB6A |. DFE0 FSTSW AX
0066DB6C |. 9E SAHF
0066DB6D |. 72 08 JB SHORT MyStory.0066DB77
0066DB6F |. DDD8 FSTP ST ; FLOAT 60.606508091223552980
0066DB71 |. DD05 68878E00 FLD QWORD PTR DS:[MyStory.8E8768] ; FLOAT 99999.00000000000
0066DB77 |> E8 308A2000 CALL MyStory.008765AC
0066DB7C |> 5F POP EDI ; ASCII "`?"
0066DB7D |. 5E POP ESI ; ASCII "`?"
0066DB7E |. 5B POP EBX ; ASCII "`?"
0066DB7F |. C9 LEAVE
0066DB80 \. C2 1C00 RETN 1CVersion 62 maple client unpacked, address 0066D7AA. I found it by searching for the referenced string "StandardPDD.img" which lead me to an initialization function loading a huge hashtable containing every level and its respective StandardPDD. Then I set a hardware breakpoint on the level 10 beginner one, and surprisingly i landed straight into the function above when getting hitted.
The call to 0066CF83 at the beginning is the miss function, by the way.
Paracelsus
2009-07-08, 06:30 PM
Well, I'm not on that hand after all, but I really wish I was. *wants to get assembler code books* I guess I was a little over confident in myself, lol.
Kortestanov
2009-07-09, 02:15 AM
Well, I'm not on that hand after all, but I really wish I was. *wants to get assembler code books* I guess I was a little over confident in myself, lol.It's not really possible for the human eye to read uncolored assembler code anyway. I need to create a software that colors these things :f3:
Oh btw, I released the damage simulator I built, so you can look inside there for the damage formula.
Paracelsus
2009-07-09, 05:21 AM
I been inputing the info from pics iI've taken and it perfect when I compare it to real damage recieve as long as I have a W.Def, but it shows too low of values when you make your W.Def equal 0
Kortestanov
2009-07-09, 07:55 AM
I been inputing the info from pics iI've taken and it perfect when I compare it to real damage recieve as long as I have a W.Def, but it shows too low of values when you make your W.Def equal 0Ill check the issue once I finish with the miss formula (almost done), might be one of these values I didn't know what to do with.
Paracelsus
2009-07-09, 02:04 PM
Thanks Kortestanov, you've been a great help. Also does the formula work for a mob's magical attack too?
Kortestanov
2009-07-09, 02:54 PM
Thanks Kortestanov, you've been a great help. Also does the formula work for a mob's magical attack too?I'd say no. And even worse, StandardPDD is not applied to magic attacks, so im clueless as to how am i supposed to find that function.
Im thinking about using the CHARACTER structure i just discovered... if it works it shouldnt take me more than a few days.
Paracelsus
2009-07-09, 04:24 PM
Once again thanks for the help, also could you take the source code and copy it into notepad so I wouldn't have to download a program to look at the source?
Stereo
2009-07-09, 04:30 PM
Thanks Kortestanov, you've been a great help. Also does the formula work for a mob's magical attack too?
The basic function fits (0.8*atk^2*0.01) but magic defense is gonna have its own ridiculously complicated factors most likely.
Kortestanov
2009-07-09, 04:43 PM
Once again thanks for the help, also could you take the source code and copy it into notepad so I wouldn't have to download a program to look at the source?the source I uploaded is in text format, just open MainForm.cs in notepad.
The basic function fits (0.8*atk^2*0.01) but magic defense is gonna have its own ridiculously complicated factors most likely.Nothing will stand the power of olly2. Talkin' from experience :f3:
Paracelsus
2009-07-09, 07:49 PM
Thanks, its been a while since I looked at code, so I forgot, lol. Also as you figure out more about mob damage please make updates and add a lot more comments about it, pls.
Powered by vBulletin® Version 4.1.10 Copyright © 2013 vBulletin Solutions, Inc. All rights reserved.