I spend a lot of time playing Evony – The Kings Return on my iPad and recently, I’ve been most obsessed with constructing the best outfit that will allow for fast gathering. An example of what I am talking about can be found here.
As I sat down with a pen and paper, jotting down all the possibilities, I thought it would be fun to throw something into a Python notebook. With that, I took to Excel and wrote down all the specifications for those armors that offer gathering buffs. The spreadsheet can be found here.
I loaded all the data into a spreadsheet and uploaded it onto my Google drive. Then, I spun up a GoogleColab notebook and wrote the code below.
Google Colab Code
Armor – Fast Gathering¶
Trying to identify the best armory to use for fast gathering in Evony.
Header¶
Here is where all the headers be! Arr.
import pandas as pd
Place Holder (Not headers)¶
armor = pd.read_excel("/content/drive/MyDrive/Evony/data/Evony Fun with Armor.xlsx", "Armor Options Excel")
armor.describe()
Bonus | Extra Bonus (if > 0 assume two equipment required) | Total Bonus | |
---|---|---|---|
count | 36.000000 | 15.000000 | 44.000000 |
mean | 13.333333 | 11.866667 | 14.954545 |
std | 9.304377 | 3.795988 | 7.507994 |
min | 2.000000 | 5.000000 | 5.000000 |
25% | 6.500000 | 10.000000 | 10.000000 |
50% | 12.500000 | 15.000000 | 15.000000 |
75% | 15.000000 | 15.000000 | 15.000000 |
max | 40.000000 | 15.000000 | 40.000000 |
armor.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 44 entries, 0 to 43 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Armor 44 non-null object 1 Clothing 44 non-null object 2 Resource 44 non-null object 3 Bonus 36 non-null float64 4 Extra Bonus (if > 0 assume two equipment required) 15 non-null float64 5 Total Bonus 44 non-null int64 dtypes: float64(2), int64(1), object(3) memory usage: 2.2+ KB
armor.head()
Armor | Clothing | Resource | Bonus | Extra Bonus (if > 0 assume two equipment required) | Total Bonus | |
---|---|---|---|---|---|---|
0 | Champion | Helmet | Food | 5.0 | 10.0 | 15 |
1 | Kings Fearless | Helmet | Food | 15.0 | NaN | 15 |
2 | Kings Courageous | Clothes | Food | 15.0 | NaN | 15 |
3 | Kings | Spear | Food | 15.0 | NaN | 15 |
4 | General | Spear | Food | 10.0 | NaN | 10 |
armor.fillna(0)
Armor | Clothing | Resource | Bonus | Extra Bonus (if > 0 assume two equipment required) | Total Bonus | |
---|---|---|---|---|---|---|
0 | Champion | Helmet | Food | 5.0 | 10.0 | 15 |
1 | Kings Fearless | Helmet | Food | 15.0 | 0.0 | 15 |
2 | Kings Courageous | Clothes | Food | 15.0 | 0.0 | 15 |
3 | Kings | Spear | Food | 15.0 | 0.0 | 15 |
4 | General | Spear | Food | 10.0 | 0.0 | 10 |
5 | Agility | Helmet | Food | 2.0 | 5.0 | 7 |
6 | Elite | Helmet | Food | 7.0 | 0.0 | 7 |
7 | Cloth | Helmet | Food | 5.0 | 0.0 | 5 |
8 | Mithril | Helmet | Food | 10.0 | 0.0 | 10 |
9 | Kings | Axe | Lumber | 40.0 | 0.0 | 40 |
10 | General | Axe | Lumber | 30.0 | 0.0 | 30 |
11 | Fighters | Axe | Lumber | 20.0 | 0.0 | 20 |
12 | Elite | Axe | Lumber | 15.0 | 0.0 | 15 |
13 | Champion | Clothes | Lumber | 5.0 | 10.0 | 15 |
14 | Kings Fearless | Clothes | Lumber | 15.0 | 0.0 | 15 |
15 | Mithril | Clothes | Lumber | 10.0 | 0.0 | 10 |
16 | Agility | Clothes | Lumber | 2.0 | 5.0 | 7 |
17 | Elite | Clothes | Lumber | 7.0 | 0.0 | 7 |
18 | Cloth | Clothes | Lumber | 5.0 | 0.0 | 5 |
19 | Champion | Boots | Ore | 5.0 | 10.0 | 15 |
20 | Kings Fearless | Boots | Ore | 15.0 | 0.0 | 15 |
21 | Kings Courageous | Helmet | Ore | 15.0 | 0.0 | 15 |
22 | Kings Courageous | Pants | Lumber | 15.0 | 0.0 | 15 |
23 | Kings | Bow | Ore | 15.0 | 0.0 | 15 |
24 | General | Boots | Ore | 10.0 | 0.0 | 10 |
25 | General | Bow | Ore | 10.0 | 0.0 | 10 |
26 | Kings | Sword | Stone | 40.0 | 0.0 | 40 |
27 | General | Sword | Stone | 30.0 | 0.0 | 30 |
28 | Fighters | Sword | Stone | 20.0 | 0.0 | 20 |
29 | Elite | Sword | Stone | 15.0 | 0.0 | 15 |
30 | Champion | Pants | Stone | 5.0 | 10.0 | 15 |
31 | Kings Fearless | Pants | Stone | 15.0 | 0.0 | 15 |
32 | Kings Courageous | Boots | Stone | 15.0 | 0.0 | 15 |
33 | Transcendent | Pants | Stone | 5.0 | 8.0 | 13 |
34 | General | Pants | Stone | 10.0 | 0.0 | 10 |
35 | Standard | Pants | Stone | 7.0 | 0.0 | 7 |
36 | Dragon | Pick One | Stone | 0.0 | 15.0 | 15 |
37 | Dragon | Pick One | Stone | 0.0 | 15.0 | 15 |
38 | Dragon | Pick One | Ore | 0.0 | 15.0 | 15 |
39 | Dragon | Pick One | Ore | 0.0 | 15.0 | 15 |
40 | Dragon | Pick One | Food | 0.0 | 15.0 | 15 |
41 | Dragon | Pick One | Food | 0.0 | 15.0 | 15 |
42 | Dragon | Pick One | Lumber | 0.0 | 15.0 | 15 |
43 | Dragon | Pick One | Lumber | 0.0 | 15.0 | 15 |
armor['Resource'] = armor["Resource"].str.strip()
food = armor[armor['Resource'] == 'Food']
food[['Total Bonus', 'Clothing']].groupby(by="Clothing").max()
Total Bonus | |
---|---|
Clothing | |
Clothes | 15 |
Helmet | 15 |
Pick One | 15 |
Spear | 15 |
resources = armor["Resource"].unique()
armor[['Resource','Total Bonus']].groupby(by="Resource").describe()
Total Bonus | ||||||||
---|---|---|---|---|---|---|---|---|
count | mean | std | min | 25% | 50% | 75% | max | |
Resource | ||||||||
Food | 11.0 | 11.727273 | 4.002272 | 5.0 | 8.50 | 15.0 | 15.00 | 15.0 |
Lumber | 13.0 | 16.076923 | 9.630347 | 5.0 | 10.00 | 15.0 | 15.00 | 40.0 |
Ore | 8.0 | 13.750000 | 2.314550 | 10.0 | 13.75 | 15.0 | 15.00 | 15.0 |
Stone | 12.0 | 17.500000 | 9.010095 | 7.0 | 14.50 | 15.0 | 16.25 | 40.0 |
weapon_types = ['Spear', 'Axe', 'Bow', 'Sword']
armor_types = ['Helmet', 'Clothes', 'Boots', 'Pants', 'Ring']
Ore Armor¶
What is not mentioned in the data is that Evony armor can be refined and upon refinement the bonuses are extended, however the extra bonus (set bonuses) are not.
That is to say, that the bonus champion armor may be refined up to 17.5% for ore and the Kings armor may be refined up to 25%.
Here it makes more sense to use kings armor with a dragon selection. Drop the champion armor.
ore = armor[armor['Resource'] == 'Ore']
ore_selection = ore[(ore['Total Bonus'] >= 15) & (ore['Armor'] != 'Champion')]
ore_selection['Total Bonus'].sum()
75
We need to identify which type of dragon clothing we need. I know from the weapon_types and armor_types variables that the remaining pieces of clothing are clothes, pants, and ring; however I want to do this programatically, for some reason.
ore_clothing = ore_selection[ore_selection["Clothing"] != 'Pick One']
for armor in armor_types:
if armor not in set(ore_clothing['Clothing']):
print('Needed', armor)
if not any(weapon in weapon_types for weapon in ore_clothing['Clothing']):
print("Needed Weapon")
Needed Clothes Needed Pants Needed Ring
Dragon rings scrolls were more complicated/difficult to get a hold of, in which case, a kings ring or next up will do.
Recommend using Dragon Pants in order to have a pair that is resuable/movable for stone or lumber gathering. In order to get up to an 80% ore gathering bonus through expensive refining. (Pants can be refined for gathering speed, up to 20% per refining mechanism. As an aside – an expensive tactic; but doable).
Great Potential
I want to focus on ore gathering speed, where the notebook stopped. In the referenced wiki, there is a mention of the cost effectiveness of the type of armor. Reducing the focus to one gathering style, I can see potential in creating an application that could identify the best armor combination for a player.
I choose to stop here. There may be a situation where I return to the GoogleColab notebook to find out which set that I should spin up to get lumber or food the fastest way possible. It is unlikely that I’ll create the application that this project is tempting.
I am having too much fun building the gathering armor that I’m playing with in Evony – The Kings Return and there is already a wiki available to answer the question, mostly.
Leave a Reply