Silent Hill
Unlock All Inventory Slots
300BCADF 0028
Inventory Editor
80007800 E17C
80007802 8C62
80007806 8C06
80007808 0029
8000780A 04C1
8000780C FFFF
8000780E 24C6
80007810 C76C
80007812 9689
80007814 CA34
80007816 3671
80007818 1880
8000781A 0002
8000781C 8821
8000781E 0223
80007822 9223
80007824 0001
80007826 9230
80007828 3821
8000782A 0060
8000782C 0800
8000782E 3138
80007830 0002
80007832 1018
80007834 0400
80007836 3138
80007838 0001
8000783A 2467
8000783C 0002
8000783E 1018
80007840 0200
80007842 3138
80007844 FFFF
80007846 2467
80007848 0003
8000784A 1018
8000784C 0100
8000784E 3138
80007850 0001
80007852 2610
80007854 0009
80007856 3406
80007858 0003
8000785A 1018
80007860 FFFF
80007862 2610
80007864 0009
80007866 3406
80007868 0010
8000786A 1067
8000786C 182A
8000786E 0067
80007870 7040
80007872 0003
80007874 FFFF
80007876 25CE
80007878 0821
8000787A 01C3
8000787C 000A
8000787E 240F
80007880 7901
80007882 9078
80007884 C021
80007886 030E
80007888 0002
8000788A 14F8
8000788C FFFF
8000788E 25EF
80007890 7901
80007892 9027
80007894 0002
80007896 2463
80007898 FFF9
8000789A 1DE0
8000789C 0002
8000789E 2421
800078A0 5080
800078A2 0C01
800078A6 A227
800078A8 0009
800078AA 3406
800078AC 0001
800078AE A230
800078B0 330D
800078B2 0801
800078B6 AC06
80007900 20FF
80007902 4022
80007904 5755
80007906 6058
80007908 706E
8000790A 8482
8000790C A087
8000790E C0A3
80007910 E0C2
80007912 FFE2
80007914 20FF
8004CC2C 1E00
8004CC2E 0800
Code:
; Silent Hill "Inventory Editor"
; Copyright 2001-2007 Parasyte
;
; Project began 10-10-2001, completed 04-15-2007
;
; 800AE17C - Cursor position modifier
; 8004CC2C - Cursor position modifier read breakpoint (breakout location)
; 800BCA34 - Slot 1 modifier
; 800BC76C - Pad value
; 800BC774 - Down-state pad value (not used)
.org 0x80007800
lw $v0, 0xE17C($v1) ; Moved from break out location [read current cursor position]
lw $a2, 0x0000($zero) ; Counter = byte at (80000000)
bgez $a2, return ; If counter == 0, continue (and decrement counter)
addiu $a2, $a2, 0xFFFF ; Decrement counter
begin:
lhu $t1, 0xC76C($s4) ; load pad value into $t1
ori $s1, $s3, 0xCA34 ; $s1 = 800BCA34 (slot 1 mod)
sll $v1, $v0, 0x0002 ; $at = Current cursor position * 4
addu $s1, $s1, $v1 ; $s1 = Current slot selected
lbu $v1, 0x0000($s1) ; Load item number (from current slot) into $v1
lbu $s0, 0x0001($s1) ; Load quantity of current slot into $a0
addu $a3, $v1, $zero ; Copy item number to a backup register
andi $t8, $t1, 0x0800 ; Check for R1
beq $t8, $zero, notR1 ; If R1 is not pushed, branch (and check for L1)
andi $t8, $t1, 0x0400 ; Check for L1
addiu $a3, $v1, 0x0001 ; Increment item in current slot
notR1:
beq $t8, $zero, notL1 ; If L1 is not pushed, branch (and check for R2)
andi $t8, $t1, 0x0200 ; Check for R2
addiu $a3, $v1, 0xFFFF ; Decrement item in current slot
notL1:
beq $t8, $zero, notR2 ; If R2 is not pushed, branch (and check for L2)
andi $t8, $t1, 0x0100 ; Check for L2
addiu $s0, $s0, 0x0001 ; Increment item value in current slot
ori $a2, $zero, 0x0009 ; Counter = 9
notR2:
beq $t8, $zero, notL2 ; If L2 is not pushed, branch
nop
addiu $s0, $s0, 0xFFFF ; Decrement item value in current slot
ori $a2, $zero, 0x0009 ; Counter = 9
notL2:
beq $a3, $v1, no_new_item ; Update item only when changed
; Here is where some magic happens by clipping the item into the valid ranges
slt $v1, $v1, $a3 ; $v1 = 1 if we are increasing, or 0 if decreasing
sll $t6, $v1, 0x0001
addiu $t6, $t6, 0xFFFF ; $t6 = 1 if we are increasing, or -1 if decreasing
addu $at, $t6, $v1 ; $at = 2 if we are increasing, or -1 if decreasing
addiu $t7, $zero, 0x000A ; Number of lines in the lookup table
loop:
lbu $t8, 0x7901($v1) ; Check item against lookup table (this instruction is non-relocatable)
addu $t8, $t8, $t6
bne $t8, $a3, valid_item
addiu $t7, $t7, 0xFFFF
lbu $a3, 0x7901($at) ; Load proper item (this instruction is non-relocatable)
valid_item:
addiu $v1, $v1, 0x0002
bgtz $t7, loop
addiu $at, $at, 0x0002
jal 0x80054200 ; Update screen (redraw items)
sb $a3, 0x0000($s1) ; Update item in current slot
ori $a2, $zero, 0x0009 ; Counter = 9
no_new_item:
sb $s0, 0x0001($s1) ; Update item value in current slot
return:
j 0x0004CC34 ; Return to breakout location
sw $a2, 0x0000($zero) ; Store counter into 80000000
.org 0x80007900
.db 0xFF
.db 0x20, 0x22 ; Every two bytes defines a range of "valid" items
.db 0x40, 0x55
.db 0x57, 0x58
.db 0x60, 0x6E
.db 0x70, 0x82
.db 0x84, 0x87
.db 0xA0, 0xA3
.db 0xC0, 0xC2
.db 0xE0, 0xE2
.db 0xFF, 0xFF
.db 0x20
.org 0x8004CC2C
j 0x80007800