Abyssrium cheats and tricks

I stumble upon a nice game called Abyssrium yesterday. It allows you to raise all kinds of beautiful fishes and create your own aquarium in a deep ocean. The basic play style is repetitively tapping around and collecting the so called "vitality" to buy everything you need.

Well, if you occasionally program a little, then I guess you can understand the irritation I feel when there's something needs manually "repeating".

So I dug a little and implemented two ways of avoiding such repeating work. A kind notice though, these are cheats and I don't suggest you take it if you are really enjoying the game. Also I'm only working with the android version.

Spam tapping

You asked for tapping, so tapping I give you, a lot. There are two ways of doing it.

1. sendevent and getevent

These two babies catch and replay the low-level input on your device, and here by low-level input we mean taps. Open the terminal on your computer and connect your phone in debug mode. Then use the following command in the terminal.

$ adb shell geteventcode
And you will get something like below,
add device 1: /dev/input/event5
  name:     "msm8974-taiko-mtp-snd-card Headset Jack"
add device 2: /dev/input/event4
  name:     "msm8974-taiko-mtp-snd-card Button Jack"
add device 3: /dev/input/event3
  name:     "hs_detect"
add device 4: /dev/input/event1
  name:     "touch_dev"
add device 5: /dev/input/event0
  name:     "qpnp_pon"
add device 6: /dev/input/event2
  name:     "gpio-keys"
These lines tell you the possible input devices on your phone, and here we see touch_dev which corresponds to your touch screen is registered in /dev/input/event1. So we will always keep an eye on event1. And then you tap on your phone, now you'll probably get something like below
/dev/input/event1: 0003 0039 00000109
/dev/input/event1: 0003 0035 000002e7
/dev/input/event1: 0003 0036 00000530
/dev/input/event1: 0003 003a 0000003a
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0003 0039 ffffffff
/dev/input/event1: 0000 0000 00000000
These are the tap coordinates in hex, and some other special code, like finger down(tap start), finger up (tap stop) etc. However we don't care what the exact meaning is, just keep in mind it is a tap, and that's enough. Now transfer all the numbers from hex to decimal, you'll have
/dev/input/event1: 3 57 265
/dev/input/event1: 3 53 743
/dev/input/event1: 3 54 1328
/dev/input/event1: 3 58 58
/dev/input/event1: 0 0 0
/dev/input/event1: 3 57 4294967295
/dev/input/event1: 0 0 00000000
Now we just send them back using sendevent and you will have the tap replayed. Input the following commands in your terminal and you are done.
$ adb shell sendevent /dev/input/event1 3 57 265
$ adb shell sendevent /dev/input/event1 3 53 743
$ adb shell sendevent /dev/input/event1 3 54 1328
$ adb shell sendevent /dev/input/event1 3 58 58
$ adb shell sendevent /dev/input/event1 0 0 0
$ adb shell sendevent /dev/input/event1 3 57 4294967295
$ adb shell sendevent /dev/input/event1 0 0 00000000

And that's just one tap, write a simple loop script and you get as many as you want. Here we do tap 100 times as an example.

let i=0;
while [ $i -le 100 ]; do
    adb shell sendevent /dev/input/event1 3 57 265
    adb shell sendevent /dev/input/event1 3 53 743
    adb shell sendevent /dev/input/event1 3 54 1328
    adb shell sendevent /dev/input/event1 3 58 58
    adb shell sendevent /dev/input/event1 0 0 0
    adb shell sendevent /dev/input/event1 3 57 4294967295
    adb shell sendevent /dev/input/event1 0 0 00000000
    let i=$i+1;

This method is slow because for each sendevent, it needs to initialize the communication and open/write/close the file. The next method will be way faster.

2. dd

We can use the dd command to store a bunch of taps and replay them at once. To record, type in your terminal

$ adb shell dd if=/dev/input/event1 of=/sdcard/taps
Then tap on your phone for a bunch of times. These taps will be stored in a file named "taps" on your sdcard. Then we can replay all these taps instantaneously by
$ adb shell dd if=/dev/input/event1 of=/sdcard/taps
And of course we will repeat for many times,
let i=0;
while [ $i -le 100 ]; do
    adb shell dd if=/sdcard/taps of=/dev/input/event1
    let i=$i+1;

This method is much faster compared to the sendevent/getevent one. However the following date exploit will be even more efficient.

The date exploit

After you stop playing the game, it still counts the time and generate vitality for you, and when you come back, the generated vitality at your absence is rewarded to you. However, the game has a bug that it only checks local date and time. So if you change your date/time to a point in the future, the game will directly give you the reward of the corresponding period. The longest period the game will rewards you seems to be only one day though, but it is still much more vitality than you can get by tapping.

The following script will do this job. First you need to disable the "Automatic date & time" option in your system settings. After you start the script, it will switch to the clock app to simulate the user's absence, change the time, switch back and claim the reward, change the time back, then repeat. This script needs your phone to be rooted.

adb root
while :; do
    adb shell am start com.google.android.deskclock/com.android.deskclock.DeskClock
    adb shell date 102910002016.00
    sleep 1
    adb shell am start com.idleif.abyssrium/com.unity3d.player.UnityPlayerNativeActivity
    sleep 1
    adb shell dd if=/sdcard/Download/record1 of=/dev/input/event1
    adb shell date 092810002016.00