aaaaaa123456789 icon

Katamari Damacy timer and miscellaneous patches

aaaaaa123456789 | PRO | 12/07/18 06:33:12 PM UTC | 0 ⭐ | 582 👁️ | Never ⏰ | []
text |

9.48 KB

|

None

|

0 👍

/

0 👎

gametitle=Katamari Damacy (SLUS-21008)
// save as FA7E3081.pnach
 // ax6's New Adjustable Timer
patch=0,EE,001021F0,word,3C080055 //     lui $t0, 0x0055
patch=0,EE,001021F4,word,3C04001C //     lui $a0, 0x001c
patch=0,EE,001021F8,word,8503EA94 //     lh $v1, -0x156c($t0)
patch=0,EE,001021FC,word,2484EF80 //     addiu $a0, $a0, -0x1080
patch=0,EE,00102200,word,3C060056 //     lui $a2, 0x0056
patch=0,EE,00102204,word,00031880 //     sll $v1, $v1, 2
patch=0,EE,00102208,word,90C51192 //     lbu $a1, 0x1192($a2)
patch=0,EE,0010220C,word,00641821 //     addu $v1, $v1, $a0
patch=0,EE,00102210,word,10A00003 //     beqz $a1, .go
patch=0,EE,00102214,word,8C630000 //         lw $v1, ($v1)
                                  // .return_zero:
patch=0,EE,00102218,word,03E00008 //     jr $ra
patch=0,EE,0010221C,word,24020000 //         addiu $v0, $zero, 0
                                  // .go:
patch=0,EE,00102220,word,8D02EAB4 //     lw $v0, -0x154c($t0)
patch=0,EE,00102224,word,90630048 //     lbu $v1, 72($v1)
patch=0,EE,00102228,word,24420001 //     addiu $v0, $v0, 1
patch=0,EE,0010222C,word,AD02EAB4 //     sw $v0, -0x154c($t0)
patch=0,EE,00102230,word,2C620009 //     sltiu $v0, $v1, 9
patch=0,EE,00102234,word,10400012 //     beqz $v0, .decrement
patch=0,EE,00102238,word,00031880 //         sll $v1, $v1, 2
patch=0,EE,0010223C,word,3C02004A //     lui $v0, 0x004a
patch=0,EE,00102240,word,00621821 //     addu $v1, $v1, $v0
patch=0,EE,00102244,word,8C640640 //     lw $a0, 0x0640($v1)
patch=0,EE,00102248,word,3C030010 //     lui $v1, 0x0010
patch=0,EE,0010224C,word,24632288 //     addiu $v1, $v1, 0x2288
patch=0,EE,00102250,word,00831823 //     subu $v1, $a0, $v1
patch=0,EE,00102254,word,2402FFDC //     addiu $v0, $zero, -0x24
patch=0,EE,00102258,word,10620006 //     beq $v1, $v0, .perform_check
patch=0,EE,0010225C,word,2462FFFF //         addiu $v0, $v1, -1
patch=0,EE,00102260,word,2C42FFF7 //     sltiu $v0, $v0, -9
patch=0,EE,00102264,word,10400005 //     beqz $v0, .test
patch=0,EE,00102268,word,00000000 //         nop
patch=0,EE,0010226C,word,00800008 //     jr $a0
patch=0,EE,00102270,word,00000000 //         nop
                                  // .perform_check:
patch=0,EE,00102274,word,90C3119D //     lbu $v1, 0x119d($a2)
patch=0,EE,00102278,word,38630002 //     xori $v1, $v1, 2
                                  // .test:
patch=0,EE,0010227C,word,10600012 //     beqz $v1, .done
                                  // .decrement:
patch=0,EE,00102280,word,90C31188 //         lbu $v1, 0x1188($a2)
patch=0,EE,00102284,word,1460FFE4 //     bnez $v1, .return_zero
patch=0,EE,00102288,word,8D02EAA8 //         lw $v0, -0x1558($t0)
patch=0,EE,0010228C,word,3C060200 //     lui $a2, 0x0200
patch=0,EE,00102290,word,1040000D //     beqz $v0, .done
patch=0,EE,00102294,word,94C3FFF0 //         lhu $v1, -16($a2)
patch=0,EE,00102298,word,94C5FFF2 //     lhu $a1, -14($a2)
patch=0,EE,0010229C,word,24631000 //     addiu $v1, $v1, 0x1000
patch=0,EE,001022A0,word,3063FFFF //     andi $v1, $v1, 0xffff
patch=0,EE,001022A4,word,00A32821 //     addu $a1, $a1, $v1
patch=0,EE,001022A8,word,30A30FFF //     andi $v1, $a1, 0x0fff
patch=0,EE,001022AC,word,00052B02 //     srl $a1, $a1, 12
patch=0,EE,001022B0,word,A4C3FFF2 //     sh $v1, -14($a2)
patch=0,EE,001022B4,word,0045182B //     sltu $v1, $v0, $a1
patch=0,EE,001022B8,word,50600002 //     beqzl $v1, .set_timer
patch=0,EE,001022BC,word,00451023 //         subu $v0, $v0, $a1
patch=0,EE,001022C0,word,24020000 //     addiu $v0, $zero, 0
                                  // .set_timer:
patch=0,EE,001022C4,word,AD02EAA8 //     sw $v0, -0x1558($t0)
                                  // .done:
patch=0,EE,001022C8,word,03E00008 //     jr $ra
patch=0,EE,001022CC,word,0005102B //         sltu $v0, $zero, $a1
// last line returns 1 if the timer ticked, 0 if not (original: (24020001) addiu $v0, $zero, 1 - would return 1 unconditionally)
 // Timer Speed Hook - (0C3F8006) jal 0x00FE0018 - replaces (0C04087C) jal 0x001021F0 (original timer call)
patch=0,EE,00101938,word,0C3F8006
patch=0,EE,00101960,word,0C3F8006
 // ax6's Lookup-Based Timer Speed Control
patch=1,EE,00FE0018,word,3C080055 //     lui $t0, 0x0055
patch=1,EE,00FE001C,word,9504EA94 //     lhu $a0, -0x156c($t0)
patch=1,EE,00FE0020,word,10800014 //     beqz $a0, .set
patch=1,EE,00FE0024,word,00001021 //         addu $v0, $zero, $zero
patch=1,EE,00FE0028,word,2C810015 //     sltiu $at, $a0, 21
patch=1,EE,00FE002C,word,10200011 //     beqz $at, .set
patch=1,EE,00FE0030,word,3402F000 //         ori $v0, $zero, 0xf000
patch=1,EE,00FE0034,word,2C81000B //     sltiu $at, $a0, 11
patch=1,EE,00FE0038,word,54200011 //     bnezl $at, .not_constellation
patch=1,EE,00FE003C,word,001F1821 //         addu $v1, $zero, $ra
patch=1,EE,00FE0040,word,3C0900E7 //     lui $t1, 0x00e7
patch=1,EE,00FE0044,word,9526C7E0 //     lhu $a2, -0x3820($t1)
patch=1,EE,00FE0048,word,10C0000A //     beqz $a2, .set
patch=1,EE,00FE004C,word,00001021 //         addu $v0, $zero, $zero
patch=1,EE,00FE0050,word,3C09004D //     lui $t1, 0x004d
patch=1,EE,00FE0054,word,95256788 //     lhu $a1, 0x6788($t1)
patch=1,EE,00FE0058,word,00A6082B //     sltu $at, $a1, $a2
patch=1,EE,00FE005C,word,10200005 //     beqz $at, .set
patch=1,EE,00FE0060,word,00052B40 //         sll $a1, $a1, 13
patch=1,EE,00FE0064,word,00A6001B //     divu $a1, $a2
patch=1,EE,00FE0068,word,00002812 //     mflo $a1
patch=1,EE,00FE006C,word,24A2E001 //     addiu $v0, $a1, -0x1fff
patch=1,EE,00FE0070,word,00021042 //     srl $v0, $v0, 1
                                  // .set:
patch=1,EE,00FE0074,word,3C040200 //     lui $a0, 0x0200
patch=1,EE,00FE0078,word,0804087C //     j 0x001021F0
patch=1,EE,00FE007C,word,A482FFF0 //         sh $v0, -16($a0)
                                  // .not_constellation:
patch=1,EE,00FE0080,word,0C3F802C //     jal .continue
patch=1,EE,00FE0084,word,00042080 //         sll $a0, $a0, 2
                                  //     ; size targets per level
patch=1,EE,00FE0088,word,41200000 //     .float    10 ;  10 cm
patch=1,EE,00FE008C,word,41A00000 //     .float    20 ;  20 cm
patch=1,EE,00FE0090,word,42C80000 //     .float   100 ;   1 m
patch=1,EE,00FE0094,word,42480000 //     .float    50 ;  50 cm
patch=1,EE,00FE0098,word,43160000 //     .float   150 ;   1.5 m
patch=1,EE,00FE009C,word,43960000 //     .float   300 ;   3 m
patch=1,EE,00FE00A0,word,44160000 //     .float   600 ;   6 m
patch=1,EE,00FE00A4,word,44960000 //     .float  1200 ;  12 m
patch=1,EE,00FE00A8,word,453B8000 //     .float  3000 ;  30 m
patch=1,EE,00FE00AC,word,46EA6000 //     .float 30000 ; 300 m
                                  // .continue:
patch=1,EE,00FE00B0,word,009F2021 //     addu $a0, $a0, $ra
patch=1,EE,00FE00B4,word,0003F821 //     addu $ra, $zero, $v1
patch=1,EE,00FE00B8,word,8C86FFFC //     lw $a2, -4($a0)
patch=1,EE,00FE00BC,word,3C040099 //     lui $a0, 0x0099
patch=1,EE,00FE00C0,word,8C858D60 //     lw $a1, -0x72a0($a0)
patch=1,EE,00FE00C4,word,00A6082A //     slt $at, $a1, $a2
patch=1,EE,00FE00C8,word,3402F000 //     ori $v0, $zero, 0xf000
patch=1,EE,00FE00CC,word,083F801D //     j .set
patch=1,EE,00FE00D0,word,0001100A //         movz $v0, $zero, $at
 // ax6's Elastic Post-Goal Timer Speed Control - comment top 3 lines to disable
// begins right after slt $at, $a1, $a2 from the function above (overwriting the last three instructions)
patch=1,EE,00FE00C8,word,1420FFEA //     bnez $at, .set
patch=1,EE,00FE00CC,word,3402F000 //         ori $v0, $zero, 0xf000
patch=1,EE,00FE00D0,word,8D04EAA8 //     lw $a0, -0x1558($t0)
patch=1,EE,00FE00D4,word,2C810718 //     sltiu $at, $a0, 1816 ; 1 minute + 16 frames
patch=1,EE,00FE00D8,word,1420FFE6 //     bnez $at, .set
patch=1,EE,00FE00DC,word,00001021 //         addu $v0, $zero, $zero
patch=1,EE,00FE00E0,word,44850800 //     mtc1 $a1, $f1
patch=1,EE,00FE00E4,word,44861000 //     mtc1 $a2, $f2
patch=1,EE,00FE00E8,word,46020841 //     sub.s $f1, $f1, $f2
patch=1,EE,00FE00EC,word,46020843 //     div.s $f1, $f1, $f2
patch=1,EE,00FE00F0,word,3C064600 //     lui $a2, 0x4600 ; 0x46000000 = 8192.0
patch=1,EE,00FE00F4,word,44861000 //     mtc1 $a2, $f2
patch=1,EE,00FE00F8,word,46020842 //     mul.s $f1, $f1, $f2
patch=1,EE,00FE00FC,word,3C0447F0 //     lui $a0, 0x47f0 ; 0x47f00000 = 122880.0
patch=1,EE,00FE0100,word,44841800 //     mtc1 $a0, $f3
patch=1,EE,00FE0104,word,46030834 //     c.lt.s $f1, $f3
patch=1,EE,00FE0108,word,3402EFFF //     ori $v0, $zero, 0xefff
patch=1,EE,00FE010C,word,4500FFD9 //     bc1f .set
patch=1,EE,00FE0110,word,460008A4 //         cvt.w.s $f2, $f1
patch=1,EE,00FE0114,word,44041000 //     mfc1 $a0, $f2
patch=1,EE,00FE0118,word,24840001 //     addiu $a0, $a0, 1
patch=1,EE,00FE011C,word,00042042 //     srl $a0, $a0, 1
patch=1,EE,00FE0120,word,0044082B //     sltu $at, $v0, $a0
patch=1,EE,00FE0124,word,083F801D //     j .set
patch=1,EE,00FE0128,word,0081100A //         movz $v0, $a0, $at
 // Unskippable cutscenes
// Original function: if byte[20F8A368] != 0, word[20F8A348] >= 0, and word[20F8A350] = 2, set the last of these to 3.
// byte[20F8A368] is a boolean that indicates whether a cutscene is active at all
// word[20F8A350] is an enum: 0 = starting cutscene, 1 = loading video, 2 = playing cutscene, 3 = ending video, 4 = cleanup
// This line nops out the sw $v0, 8($a0) line that writes the 3.
patch=0,EE,00177530,word,00000000
 // L1+L2+R1+R2+Triangle+Circle+Square+Cross = Time's Up
patch=1,EE,D101BE82,extended,000000FF // Check that all buttons are pressed
patch=1,EE,2054EAA8,extended,00000000 // Set remaining time to 0

Comments