Mr.Mine Save Editing, Fixing Broken Achievements & More

GemesUtra

Video Games Guides, Reviews & News

Mr.Mine Save Editing, Fixing Broken Achievements & More

This guide is mainly about how to Edit Saves, Sell/Buy Prices, Fix Broken Achievements and Update UI Images, let’s check it out.

game

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
Mr.Mine Save Editing, Fixing Broken Achievements, More

If everything worked successfully, we should see our desired result as save file with $700,000 and a depth of 5:
Mr.Mine Save Editing, Fixing Broken Achievements, More

Sell/Buy Prices

How to modify sell prices of minerals


If you’re looking to sell coal for $10,000 a piece then this is the place for you.

Index.html

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

\MrMine\win-unpacked\resources\app\index.html

This is essentially the source code for the game, I recommend opening this with notepad++ or an equivalent application to easily navigate it.

minerals[]

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

var minerals = [ [], [_(“Coal”),10000,0], [_(“Copper”),2,0], [_(“Silver”),4,0], [_(“Gold”),16,0], [_(“Platinum”),32,0], [_(“Diamond”),64,0], [_(“Coltan”),500,0], [_(“Painite”),1000,0], [_(“Black Opal”),2000,0], [_(“Red Diamond”),10000,0], [_(“Blue Obsidian”),20000,0], [_(“Californium”),100000,0], [_(“Diamond8”),13,0], [_(“Diamond9”),14,0], [_(“Diamond10”),15,0], [_(“Diamond11”),16,0], [_(“Diamond12”),17,0], [_(“Diamond13”),18,0], [_(“Diamond14”),19,0], [_(“Diamond15”),20,0], [_(“Uranium”),[100,2000,50000],0,[0,0,0],[],36001] [_(“Plutonium”),[1000,20000,500000],0,[0,0,0],[],36001], [_(“Polonium”),[5000,250000,50000000],0,[0,0,0],[],36001] ];

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.

How to modify buy prices and resource costs
Worker Hire Costs
Base Costs

The array titled dlvlcost holds the costs of hire, simply by changing it to 0’s you obtain free hire costs.

var dlvlcost = [0,1,1,1,1,1,1,1,1,1,1];
Hire Function

If for some reason you don’t want to alter hire costs, you can change the function titled upgradehire(x) to the following:

function upgradehire(x){dlvl++;}
Equipment Upgrade Costs

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.

Oil Rig Upgrade Costs

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:

var oilRigUpgradeCosts = [0,0,0, 0, 0,0, 0,0,0];
 
 

Image Editing

How to change the UI Images
How to change UI extras (Fonts)
 
(WIP)

Why do achievements break?

 
(WIP)
 

Fixing Achievements

Why do achievements break?

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:

setInterval(function(){if(chosen > -1){playtime+=30;savegame();afk–;if(focus){checkQuests();}}},30000);

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 🙂

That’s all we are sharing today in Mr.Mine Save Editing, Fixing Broken Achievements, More , if there are anything you want to add please feel free to leave a comment below and we’ll see you soon.
 
Credit to Twi

Leave a Reply

Your email address will not be published. Required fields are marked *