#!/bin/bash

# MOV X0, #60   \x80\x07\x80\xD2
# MOV X0, #120  \x00\x0F\x80\xD2

BUNDLE_ID=jp.pokemon.pokemonchampions
EXECUTABLE=~/Library/Containers/io.playcover.PlayCover/Applications/$BUNDLE_ID.app/Frameworks/UnityFramework.framework/UnityFramework

perl -e '
open F, "+<:raw", $ARGV[0] or die $!;
local $/;
my $d = <F>;
my $pattern = "\x81\x00\x00\xB4\xFD\x7B\x41\xA9\xF4\x4F\xC2\xA8\x20\x00\x1F\xD6";
my $offset = 0;
while (1) {
    my $pos = index($d, $pattern, $offset);
    last if $pos == -1;

    my $a = unpack("V", substr($d, $pos + 16, 4));
    my $b = unpack("V", substr($d, $pos + 20, 4));
    if ( ($a & 0x9F00001F) == 0x90000008 &&
         ($b & 0xFFC003FF) == 0x91000108 ) {
        my $addr =
            (($pos+16) & ~0xFFF)
            + (((($a >> 5 & 0x7FFFF) << 2) + ($a >> 29 & 0x3)) << 12)
            + ($b >> 10 & 0xFFF);

        my $str = substr($d, $addr, 58);
        if ($str eq "UnityEngine.Application::set_targetFrameRate(System.Int32)") {
            printf "Found UnityEngine.Application.set_targetFrameRate at 0x%08X\n", $pos - 20;
            seek F, $pos, 0;
            print F "\x80\x07\x80\xD2\x41\x01\x00\xB5\x1F\x20\x03\xD5\x1F\x20\x03\xD5";
            last;
        }
    }

    $offset = $pos + 1;
}
close F;
' $EXECUTABLE

perl -e '
open F, "+<:raw", $ARGV[0] or die $!;
local $/;
my $d = <F>;
my $pattern = "\xE0\x03\x13\xAA\xFD\x7B\x41\xA9\xF4\x4F\xC2\xA8\x20\x00\x1F\xD6";
my $offset = 0;
while (1) {
    my $pos = index($d, $pattern, $offset);
    last if $pos == -1;

    my $a = unpack("V", substr($d, $pos + 36, 4));
    my $b = unpack("V", substr($d, $pos + 40, 4));
    if ( ($a & 0x9F00001F) == 0x90000000 &&
         ($b & 0xFFC003FF) == 0x91000000 ) {
        my $addr =
            (($pos+36) & ~0xFFF)
            + (((($a >> 5 & 0x7FFFF) << 2) + ($a >> 29 & 0x3)) << 12)
            + ($b >> 10 & 0xFFF);

        my $str = substr($d, $addr, 64);
        if ($str eq "UnityEngine.AnimationClip::get_frameRate_Injected(System.IntPtr)") {
            printf "Found UnityEngine.AnimationClip.get_frameRate at 0x%08X\n", $pos - 80;
            seek F, $pos - 80, 0;
            print F "\x80\x07\x80\xD2\x00\x00\x22\x1E\xC0\x03\x5F\xD6";
            last;
        }
    }

    $offset = $pos + 1;
}
close F;
' $EXECUTABLE

codesign -fs- $EXECUTABLE
