Mr.Mine Save Editing, Fixing Broken Achievements & More
06.10.2020 0 By Butcher79This guide is mainly about how to Edit Saves, Sell/Buy Prices, Fix Broken Achievements and Update UI Images, let’s check it out.

Disclaimer
I am not going to tell you how to play your game, if you want to play it the “right” way and grind through level-by-level then you do you
This guide is for those who want to fast-forward their game progress or simply explore what the game has to offer before committing countless hours to the grind
I personally would recommend avoiding the modifications in this guide if you wish to experience the gameplay as the developers intended.
⚠ Please ensure you back up your game save code before attempting anything in this guide, as some changes may have irreversible effects.
Save Editing
How are saves stored
Your saves are stored in a base64 format, a typical save code looks like the following:
Guide|TXpZek16TXhOekU0ZkRNd2ZEY3hOamMyZkRjMk5
UWXhNVGs0TVRZMU1qRXdOak01ZkRWOE1UUjhNVFY4T
VRKOE1UQjhNVEF4ZkRVMk56SjhORFEzTW53ME1UZ3hm
REV5TkRWOE1UY3dmREI4TUh3d2ZEQjhNSHd3ZkRCOE1
Id3dmREI4TUh3d2ZEQjhNSHd3ZkRRMk5Yd3hNSHd3Zk
RCOE1Id3dmREI4TUh3d2ZEQjhNSHd3ZkRFaE9TRXRNU
0V0TVNFdE1TRXRNU0V0TVNFdE1TRXRNWHd5SVRZaE1
UQWhMVEVoTFRFaExURWhMVEVoTFRFaExURjhNeUV4
TVNFM0lTMHhJUzB4SVMweElTMHhJUzB4SVMweGZEU
WhPQ0V0TVNFdE1TRXRNU0V0TVNFdE1TRXRNU0V0TV
h3dE1TRXRNU0V0TVNFdE1TRXRNU0V0TVNFdE1TRXR
NU0V0TVh3eGZERjhNWHd4ZkRGOE1Yd3hmREY4TVh3eG
ZERjhNWHd4ZkRGOE1Yd3hmREY4TUh3eGZERjhNWHd4
ZkRGOE1Id3hmREI4TVh3d2ZERjhNSHd4ZkRCOE1Id3dm
REV5TURNd2ZESWhNaUV5SVRJaE1DRXdJVEFoTUNFd0l
USWhNQ0V3SVRBaE1DRXdJVEFoTUNFd0lUQWhNQ0V3S
VRBaE1DRXdJVEFoTUNFd0lUQWhNQ0V3SVRBaE1DRXd
JVEFoTUNFd0lUQWhNQ0V3SVRBaE1DRXdJVEFoTUNFd2
ZEQjhNSHd3ZkRCOE1Id3dmREI4TUh3d2ZEQjhNSHd3Zk
RCOE1Id3dmREI4TUh3d2ZEQjhNSHd3ZkRCOE1Id3dmRE
I4TUh3d2ZEQjhNSHd3ZkRFd2ZEQWhNQ0V3SVRBaE1DRX
dJVEFoTUNFd0lUQjhNSHd3ZkRCOE1Id3dmREI4TUh3d2
ZEQjhNSHd3ZkRCOE1Id3dmREI4TUh3d2ZEQjhNVFl3TVR
nNU9EQTRNSHd3ZkRGOE1Id3dJVE1oTWpBd01DRXhJVE
FoTUNFd2ZIeDhmSHg4Zkh4OGZIeDhmSHg4TUh3d2ZEQj
hNVEI4TFRFaExURWhMVEVoTFRFaExURWhMVEVoTFRF
aExURWhMVEVoTFRFaExURWhMVEVoTFRFaExURWhMV
EVoTFRFaExURWhMVEVoTFRFaExURjhmSHg4Zkh4OGZI
eDhmSHc9
We can ignore the name part (Guide), as we only need the right section of the code for our purpose. This code obviously not legible, so for our sake we can decode it by using an online decoder[www.base64decode.org] or any method which can decode from base64 -> utf-8, I personally use Python’s base64 [docs.python.org]library.
After decoding the save code once we get the following result:
MzYzMzMxNzE4fDMwfDcxNjc2fDc2NTYxMTk4MTY1MjEw
NjM5fDV8MTR8MTV8MTJ8MTB8MTAxfDU2NzJ8NDQ3
Mnw0MTgxfDEyNDV8MTcwfDB8MHwwfDB8MHwwfDB8
MHwwfDB8MHwwfDB8MHwwfDQ2NXwxMHwwfDB8MH
wwfDB8MHwwfDB8MHwwfDEhOSEtMSEtMSEtMSEtMSEt
MSEtMSEtMXwyITYhMTAhLTEhLTEhLTEhLTEhLTEhLTF
8MyExMSE3IS0xIS0xIS0xIS0xIS0xIS0xfDQhOCEtMSEtMS
EtMSEtMSEtMSEtMSEtMXwtMSEtMSEtMSEtMSEtMSEtM
SEtMSEtMSEtMXwxfDF8MXwxfDF8MXwxfDF8MXwxfDF8
MXwxfDF8MXwxfDF8MHwxfDF8MXwxfDF8MHwxfDB8M
XwwfDF8MHwxfDB8MHwwfDEyMDMwfDIhMiEyITIhMC
EwITAhMCEwITIhMCEwITAhMCEwITAhMCEwITAhMCEwI
TAhMCEwITAhMCEwITAhMCEwITAhMCEwITAhMCEwIT
AhMCEwITAhMCEwITAhMCEwfDB8MHwwfDB8MHwwfD
B8MHwwfDB8MHwwfDB8MHwwfDB8MHwwfDB8MHwwf
DB8MHwwfDB8MHwwfDB8MHwwfDEwfDAhMCEwITAh
MCEwITAhMCEwITB8MHwwfDB8MHwwfDB8MHwwfDB8
MHwwfDB8MHwwfDB8MHwwfDB8MTYwMTg5ODA4MHw
wfDF8MHwwITMhMjAwMCExITAhMCEwfHx8fHx8fHx8fH
x8fHx8MHwwfDB8MTB8LTEhLTEhLTEhLTEhLTEhLTEhL
TEhLTEhLTEhLTEhLTEhLTEhLTEhLTEhLTEhLTEhLTEhL
TEhLTEhLTF8fHx8fHx8fHx8fHw
Okay, this is still illegible. If we look at the source code of the game we figure out why:
The save code is actually encoded twice, so in theory, if we run our previous result through the decoder again we should get our decoded save:
363331718|30|71676|76561198165210639|5|14|15|12|10|101|
5672|4472|4181|1245|170|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4
65|10|0|0|0|0|0|0|0|0|0|0|1!9!-1!-1!-1!-1!-1!-1!-1|2!6!10!-1!-
1!-1!-1!-1!-1|3!11!7!-1!-1!-1!-1!-1!-1|4!8!-1!-1!-1!-1!-1!-1!-1|-1!-1!
-1!-1!-1!-1!-1!-1!-1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|0|1|1|1|1|1|0
|1|0|1|0|1|0|1|0|0|0|12030|2!2!2!2!0!0!0!0!0!2!0!0!0!0!0!0
!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!
0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
0|0|0|0|10|0!0!0!0!0!0!0!0!0!0|0|0|0|0|0|0|0|0|0|0|0|0|0
|0|0|0|0|0|1601898080|0|1|0|0!3!2000!1!0!0!0||||||||||||||
|0|0|0|10|-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1
||||||||||||
Great, now we have numbers, but what do they mean Mason. If we look at the source code we get our answers:
money = Math.floor(saves[chosen][0]); depth = parseInt(saves[chosen][1]); dexp = parseInt(saves[chosen][2]); UID = saves[chosen][3]; drill[0] = parseInt(saves[chosen][4]); drill[1] = parseInt(saves[chosen][5]); drill[2] = parseInt(saves[chosen][6]); drill[3] = parseInt(saves[chosen][7]); hireamt = parseInt(saves[chosen][8]); if(hireamt > 10){hireamt = 10;} oldversion = saves[chosen][9]; …
Let’s break this down:
Money is the first element in our save code, if we refer to the code we can deduct that our money is at $363331718
Depth is the second element, and just like money, our depth can be seen as 30
dexp is our experience
UID is the steamID64 of the account which created the save, if you’re curious you can use SteamID I/O[steamid.io] to find out the steam account of the creator
If we look in game, we can confirm this at the title screen:
Mr.Mine Save Editing, Fixing Broken Achievements, More
Extra Information
The order of the materials in the save file is as follows:
Money
Depth
Exp
UID
Drill 1
Drill 2
Drill 3
Drill 4
Hireamt
Old Version
Coal
Copper
Silver
Gold
Platinum
Diamond
Coltan
Painite
Black Opal
Red Diamond
Blue Obsidian
Californium
The first material begins at separation ( | ) #10 (money starting at 0). If you’re interested in the full list of the save code here you go[pastebin.com]
How to edit saves
To edit the save, you can simply modify these values. Say for example we want our dollars to be at $700,000, we refer back to our save code and simply replace the first value with our desired one. Same applies for the depth, for our instance we’ll change it to 5
700000|5|71676|76561198165210639|5|14|15|12|10|101|567
2|4472|4181|1245|170|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|465
|10|0|0|0|0|0|0|0|0|0|0|1!9!-1!-1!-1!-1!-1!-1!-1|2!6!10!-1!-1!-
1!-1!-1!-1|3!11!7!-1!-1!-1!-1!-1!-1|4!8!-1!-1!-1!-1!-1!-1!-1|-1!-1!-1!
-1!-1!-1!-1!-1!-1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|0|1|1|1|1|1|0|1|
0|1|0|1|0|1|0|0|0|12030|2!2!2!2!0!0!0!0!0!2!0!0!0!0!0!0!0
!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0|
0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
0|0|0|10|0!0!0!0!0!0!0!0!0!0|0|0|0|0|0|0|0|0|0|0|0|0|0|
0|0|0|0|0|1601898080|0|1|0|0!3!2000!1!0!0!0|||||||||||||||
0|0|0|10|-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1!-1|
|||||||||||
Once we are done editing our file, we have to convert it back by encoding it twice using base64 encryption. We can use the same website we used to decode, to encode our new modified save.
The first pass gives us the first encoded result, we have to repeat the process to encode this result further:
NzAwMDAwfDV8NzE2NzZ8NzY1NjExOTgxNjUyMTA2Mzl8
NXwxNHwxNXwxMnwxMHwxMDF8NTY3Mnw0NDcyfDQx
ODF8MTI0NXwxNzB8MHwwfDB8MHwwfDB8MHwwfDB8
MHwwfDB8MHwwfDB8NDY1fDEwfDB8MHwwfDB8MHww
fDB8MHwwfDB8MSE5IS0xIS0xIS0xIS0xIS0xIS0xIS0xfDIh
NiExMCEtMSEtMSEtMSEtMSEtMSEtMXwzITExITchLTEhL
TEhLTEhLTEhLTEhLTF8NCE4IS0xIS0xIS0xIS0xIS0xIS0xI
S0xfC0xIS0xIS0xIS0xIS0xIS0xIS0xIS0xIS0xfDF8MXwxfDF
8MXwxfDF8MXwxfDF8MXwxfDF8MXwxfDF8MXwwfDF8M
XwxfDF8MXwwfDF8MHwxfDB8MXwwfDF8MHwwfDB8MT
IwMzB8MiEyITIhMiEwITAhMCEwITAhMiEwITAhMCEwI
TAhMCEwITAhMCEwITAhMCEwITAhMCEwITAhMCEwIT
AhMCEwITAhMCEwITAhMCEwITAhMCEwITAhMCEwITB
8MHwwfDB8MHwwfDB8MHwwfDB8MHwwfDB8MHwwfD
B8MHwwfDB8MHwwfDB8MHwwfDB8MHwwfDB8MHwwf
DB8MTB8MCEwITAhMCEwITAhMCEwITAhMHwwfDB8M
HwwfDB8MHwwfDB8MHwwfDB8MHwwfDB8MHwwfDB8
MHwxNjAxODk4MDgwfDB8MXwwfDAhMyEyMDAwITEh
MCEwITB8fHx8fHx8fHx8fHx8fHwwfDB8MHwxMHwtMSE
tMSEtMSEtMSEtMSEtMSEtMSEtMSEtMSEtMSEtMSEtMSE
tMSEtMSEtMSEtMSEtMSEtMSEtMSEtMXx8fHx8fHx8fHx8
fA
The second pass gives us our desired result:
TnpBd01EQXdmRFY4TnpFMk56WjhOelkxTmpFeE9UZ3hO
alV5TVRBMk16bDhOWHd4Tkh3eE5Yd3hNbnd4TUh3eE1ER
jhOVFkzTW53ME5EY3lmRFF4T0RGOE1USTBOWHd4TnpC
OE1Id3dmREI4TUh3d2ZEQjhNSHd3ZkRCOE1Id3dmREI4T
Uh3d2ZEQjhORFkxZkRFd2ZEQjhNSHd3ZkRCOE1Id3dmRE
I4TUh3d2ZEQjhNU0U1SVMweElTMHhJUzB4SVMweElTM
HhJUzB4SVMweGZESWhOaUV4TUNFdE1TRXRNU0V0TV
NFdE1TRXRNU0V0TVh3eklURXhJVGNoTFRFaExURWhM
VEVoTFRFaExURWhMVEY4TkNFNElTMHhJUzB4SVMweEl
TMHhJUzB4SVMweElTMHhmQzB4SVMweElTMHhJUzB4
SVMweElTMHhJUzB4SVMweElTMHhmREY4TVh3eGZERjh
NWHd4ZkRGOE1Yd3hmREY4TVh3eGZERjhNWHd4ZkRG
OE1Yd3dmREY4TVh3eGZERjhNWHd3ZkRGOE1Id3hmREI
4TVh3d2ZERjhNSHd3ZkRCOE1USXdNekI4TWlFeUlUSWh
NaUV3SVRBaE1DRXdJVEFoTWlFd0lUQWhNQ0V3SVRBaE
1DRXdJVEFoTUNFd0lUQWhNQ0V3SVRBaE1DRXdJVEFo
TUNFd0lUQWhNQ0V3SVRBaE1DRXdJVEFoTUNFd0lUQW
hNQ0V3SVRBaE1DRXdJVEI4TUh3d2ZEQjhNSHd3ZkRCOE
1Id3dmREI4TUh3d2ZEQjhNSHd3ZkRCOE1Id3dmREI4TUh
3d2ZEQjhNSHd3ZkRCOE1Id3dmREI4TUh3
Now all we have to do is add a name to the start of our code, and import it into the game. The final code would look like the following:
Guide|TnpBd01EQXdmRFY4TnpFMk56WjhOelkxTmpFeE9
UZ3hOalV5TVRBMk16bDhOWHd4Tkh3eE5Yd3hNbnd4TU
h3eE1ERjhOVFkzTW53ME5EY3lmRFF4T0RGOE1USTBOW
Hd4TnpCOE1Id3dmREI4TUh3d2ZEQjhNSHd3ZkRCOE1Id3
dmREI4TUh3d2ZEQjhORFkxZkRFd2ZEQjhNSHd3ZkRCOE
1Id3dmREI4TUh3d2ZEQjhNU0U1SVMweElTMHhJUzB4SV
MweElTMHhJUzB4SVMweGZESWhOaUV4TUNFdE1TRXR
NU0V0TVNFdE1TRXRNU0V0TVh3eklURXhJVGNoTFRFa
ExURWhMVEVoTFRFaExURWhMVEY4TkNFNElTMHhJU
zB4SVMweElTMHhJUzB4SVMweElTMHhmQzB4SVMweEl
TMHhJUzB4SVMweElTMHhJUzB4SVMweElTMHhmREY4T
Vh3eGZERjhNWHd4ZkRGOE1Yd3hmREY4TVh3eGZERjhN
WHd4ZkRGOE1Yd3dmREY4TVh3eGZERjhNWHd3ZkRGOE
1Id3hmREI4TVh3d2ZERjhNSHd3ZkRCOE1USXdNekI4TWl
FeUlUSWhNaUV3SVRBaE1DRXdJVEFoTWlFd0lUQWhNQ
0V3SVRBaE1DRXdJVEFoTUNFd0lUQWhNQ0V3SVRBaE1
DRXdJVEFoTUNFd0lUQWhNQ0V3SVRBaE1DRXdJVEFoT
UNFd0lUQWhNQ0V3SVRBaE1DRXdJVEI4TUh3d2ZEQjhNS
Hd3ZkRCOE1Id3dmREI4TUh3d2ZEQjhNSHd3ZkRCOE1Id3
dmREI4TUh3d2ZEQjhNSHd3ZkRCOE1Id3dmREI4TUh3
To load a save simply navigate to the load button in the main menu, and paste your new code into the field provided. Then press “Import Game And Close”
If everything worked successfully, we should see our desired result as save file with $700,000 and a depth of 5:
Sell/Buy Prices
If you’re looking to sell coal for $10,000 a piece then this is the place for you.
Start by navigating to the following file, which is located in the root directory of the game. This can be opened by: Right Clicking the game in your library Properties
Browse Local Files
win-unpacked
This is essentially the source code for the game, I recommend opening this with notepad++ or an equivalent application to easily navigate it.
Your sell prices are stored in an array called minerals[] which can be found on by searching var minerals =
In this area you can alter the sell price of any of the minerals, for our example we will modify the coal sell price to $10,000
Once you’ve modified the code, simply save and reload your game – your changes should be visible right away! Note, that you can always go back and reverse this change once you’re happy with your amount of dollars.
The array titled dlvlcost holds the costs of hire, simply by changing it to 0’s you obtain free hire costs.
If for some reason you don’t want to alter hire costs, you can change the function titled upgradehire(x) to the following:
The array titled upgradeEquipCosts holds the oil/money/time costs of upgrades and can be modified by simply changing the desired values and reloading the game.
The array titled oilRigUpgradeCosts holds, you guessed it, oil rig upgrade costs. Change this to 0’s if you wish to have free upgrade costs:
Image Editing
Why do achievements break?
Fixing Achievements
Timed AchievementsThis game has two two timed achievements
- Play for 2hrs
- Play for 24hrs
These achievements work by checking the playtime variable of the user’s save at two different times: 7200 and 86400 which is hours converted to minutes; 2hrs & 24hrs respectively.
This code works fine, however, the issue lies in how time is added to the playtime variable:
Every 30 seconds, the game checks if the user has completed any quests. The issue here is the following line of code: playtime+=30
Every 30 seconds, the game adds 30 minutes to the playtime, which as a result causes all players to earn the timed rewards far ahead of schedule.
A simple solution is to change the function to grand playtime += 0.3 which grants 30 seconds as opposed to 30 minutes – which I assume is the intended functionality