-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdamage.js
152 lines (133 loc) · 5.83 KB
/
damage.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
function get_weakness(attack_poke_move, defence_poke) {
var def_poke_types = defence_poke[0].split(" ");
const att_poke_type = attack_poke_move.type.toUpperCase();
var multiplier = 1;
for (let index = 0; index < def_poke_types.length; index++) {
const def_poke_type = def_poke_types[index].toUpperCase();
if (def_poke_type.length > 0) {
multiplier = multiplier * weakness_matrix[att_poke_type][def_poke_type];
}
}
return multiplier;
}
function item_mods(attack_poke_item) {
if (attack_poke_item.indexOf("Elemental Stone") >= 0) {
return 1.5;
}
if (attack_poke_item.indexOf("Life Orb") >= 0) {
return 1.3;
}
return 1;
}
function modifiers(attack_poke_move, attack_poke_type, attack_poke_item, defence_poke, extra_mod) {
var mods = {};
console.log("-------", attack_poke_type, attack_poke_move.type)
mods.STAB = attack_poke_type.split(" ").indexOf(attack_poke_move.type) >= 0 ? 1.5 : 1;
mods.weakness = get_weakness(attack_poke_move, defence_poke); // 4,2,1,0.5,0.25
mods.item = item_mods(attack_poke_item); // 1.5 Elemental Stone, 1.3 Life Orb, 0 No Attack Boosting Items.
mods.extra = extra_mod // In case of crit or other special conditions
return mods;
}
function attack_poke_setup(attack_poke, attack_poke_move, attack_poke_item, attack_poke_type) {
var att = {};
att.type = attack_poke_type;
att.attack = (attack_poke_move.movetype == "special") ? attack_poke[4] : attack_poke[2];
att.speed = attack_poke[6];
att.movePower = attack_poke_move.power;
if (attack_poke_item.indexOf("Power Boost") >= 0) {
att.attack = att.attack + 5;
att.speed = att.speed + 5;
}
return att;
}
function def_poke_setup(defence_poke, defence_poke_type, defence_poke_level, defence_poke_item, attack_poke_move) {
var def = {};
def.type = defence_poke_type; // Golden/Dark/Shiny/Normal.
def.HP = defence_poke[1]; // HP stat without bonuses.
def.defence = (attack_poke_move.movetype == "special") ? defence_poke[5] : defence_poke[3]; // Defence stat without bonuses.
def.speed = defence_poke[6];
def.level = defence_poke_level; // Defending pokémon's level.
if (defence_poke_item.indexOf("Power Boost") >= 0) {
def.HP = def.HP + 5;
def.defence = def.defence + 5;
def.speed = def.speed + 5;
}
return def;
}
function calculate(night, attack_poke, defence_poke, attack_poke_item, defence_poke_item,
attack_poke_type, defence_poke_type, defence_poke_level, attack_poke_move, extra_mod=1) {
console.log("--------", attack_poke)
var output = {};
if (attack_poke_move.power == 0) {
output.error = "Please select a damaging move";
return output;
}
// attacking pokémon
const att = attack_poke_setup(attack_poke, attack_poke_move,
attack_poke_item, attack_poke_type);
// defending pokemon
const def = def_poke_setup(defence_poke, defence_poke_type,
defence_poke_level, defence_poke_item,
attack_poke_move);
// multipliers
const mods_list = modifiers(attack_poke_move, attack_poke[0],
attack_poke_item, defence_poke, extra_mod);
console.log(def);
console.log(att);
console.log(mods_list)
// ####################### //
var types = {};
types.normal = 0;
types.shiny = 5;
types.dark = (night) ? 15 : -4;
types.golden = 15;
var item_text = {};
item_text["None"] = "";
item_text["Life Orb"] = "with Life Orb";
item_text["Elemental Stone"] = "with Elemental Stone";
item_text["Power Boost"] = "with Power Boost";
var sum = 1;
for (mod in mods_list) {
if (mods_list[mod] > 0) {
sum = sum * mods_list[mod];
}
}
const mods = sum;
var HP = Math.floor(((def.HP + types[def.type]) + 65) * def.level / 50 + 10);
var defence = ((def.defence + types[def.type]) + 46.875) * def.level / 50 + 5;
// var reqLevel = Math.ceil((-(250+5*(myPokemon.attack+46.875))+Math.sqrt((250+5*(myPokemon.attack+4 6.875))*(250+5*(myPokemon.attack+46 .875))-(4*(myPokemon.attack+46.875)*-((((((((opPokemon.hp/mods)-2)*100/85*50)*opPokemon.defense)/movePower)*250)/2)-1250))))/(2*(myPokemon.attack+46.875)))
for (var i = 0; true; i++) {
att.level = i;
var attack = ((att.attack + types[att.type]) + 46.875) * att.level / 50 + 5;
var damageMin = (((2 * att.level / 5 + 2) * attack * att.movePower / defence) / 50 * 85 / 100 + 2) * mods;
// damage has reached 100% of def pokémon's HP
if (Math.floor(damageMin) >= HP) {
var defSpeed = ((def.speed + types[def.type]) + 46.875) * def.level / 50 + 5;
var attSpeed = ((att.speed + types[att.type]) + 46.875) * att.level / 50 + 5;
var damageMax = (((2 * att.level / 5 + 2) * attack * att.movePower / defence) / 50 * 100 / 100 + 2) * mods;
output.def_hp = HP;
output.def_def = defence;
output.def_speed = defSpeed;
// att pokémon is slower, check lowest level it will be faster
output.min_level = i;
output.min_damage = Math.floor(damageMin) + " (" + (((100 / HP) * damageMin)).toFixed(1) + "%)";
output.max_damage = Math.floor(damageMax) + " (" + (((100 / HP) * damageMax)).toFixed(1) + "%)";
output.speed = Math.floor(attSpeed);
if (attSpeed < defSpeed) {
for (i = i; true; i++) {
attLevel = i;
attSpeed = ((att.speed + types[att.type]) + 46.875) * attLevel / 50 + 5;
if (attSpeed > defSpeed) {
output.outspeed_level = attLevel;
break;
}
}
}
else{
output.outspeed_level = i;
}
break;
}
}
return output;
}