Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- This code hijacks regular spikes to function.
- x01/x02 = spikes
- x04/x08 = toxic spikes
- x10 = stealth rock
- x20 = sticky web
- Hazards are ordered: t-spikes -> spikes -> sr -> web.
- This is consistent with gen 4 but not gen 5-6.
- Later gens activate them in the order the player uses them.
- (web is placed last to avoid wasting time if things die to sr/spikes)
- First, to hijack regular spikes:
- x24EB8: 11 E0 (b 0x24ede)
- x24EF2: 1C E0 (b 0x24f2e)
- x24F36: 00 00 00 00
- x24F68: pointer to battle script
- It'd *probably* be best to make the methods in a way that they could branch to each other seamlessly.
- However, I instead handled the bulk of this with a large battle script that uses 4 callasm calls.
- Also, I have no luck with BSP, so you're just getting raw hex. Sorry.
- Also, this code assumes you aren't putting Immunity on a Poison-type.
- If you do, it won't be able to absorb Toxic Spikes. (also you're a jerk)
- Also also I took the very lazy road with Stealth Rock.
- It won't respect Inverse Battles or an edited type chart. Sorry.
- There should be four blocks that are simply callasm() on the Hurt functions for each hazard.
- (also i inserted all of these close to the main code in freed ROM space)
- (you'll need to either do the same or define functions to existing ones. sorry 'bout that)
- =============================================
- TSpikesHurt:
- =============================================
- .org 0x2514D0
- push {lr}
- mov r0, #0x0
- bl 0x16e24
- mov r4, r0
- bl 0x751c4
- ldr r1, .HalverStruct
- mov r2, #0xc
- mul r0, r2, r0
- add r0, r1, r0
- mov r5, r0
- ldrb r0, [r0, #0xa]
- mov r3, #0xc
- and r0, r3, r0
- lsr r0, #0x2
- ldr r1, .ActiveBSPointer
- cmp r0, #0x0
- beq SkipTSpikes
- mov r6, r0
- ldr r0, .BattleStruct
- mov r1, #0x58
- mul r1, r4, r1
- add r0, r1, r0
- add r0, r0, #0x20
- mov r7, r0
- Ability:
- ldrb r1, [r7, #0x0]
- cmp r1, #0x1a
- beq SkipTSpikes
- cmp r1, #0x11
- beq SkipTSpikes
- BirdCheck:
- ldrb r1, [r7, #0x1]
- ldrb r0, [r7, #0x2]
- cmp r0, #0x2
- beq SkipTSpikes
- cmp r1, #0x2
- beq SkipTSpikes
- PoisonCheck:
- cmp r0, #0x3
- beq AbsorbTSpikes
- cmp r1, #0x3
- beq AbsorbTSpikes
- SteelCheck:
- cmp r0, #0x8
- beq SkipTSpikes
- cmp r1, #0x8
- beq SkipTSpikes
- cmp r6, #0x1
- beq NormalTSpikes
- b HarshTSpikes
- SkipTSpikes:
- ldr r0, .SkipTSpikesBS
- ldr r1, .ActiveBSPointer
- str r0, [r1, #0x0]
- b End
- NormalTSpikes:
- ldr r0, .NormalTSpikesBS
- ldr r1, .ActiveBSPointer
- str r0, [r1, #0x0]
- b End
- HarshTSpikes:
- ldr r0, .HarshTSpikesBS
- ldr r1, .ActiveBSPointer
- str r0, [r1, #0x0]
- b End
- AbsorbTSpikes:
- mov r0, r5
- ldrb r1, [r0, #0xa]
- mov r2, #0xf3
- and r1, r2, r1
- strb r1, [r0, #0xa]
- ldr r0, .AbsorbTSpikesBS
- ldr r1, .ActiveBSPointer
- str r0, [r1, #0x0]
- End:
- pop {r0}
- bx r0
- .align 2
- .ActiveMon: .word 0x02023bc4
- .HalverStruct: .word 0x02023de4
- .ActiveBSPointer: .word 0x02023d74
- .SkipTSpikesBS: .word 0x08C8947B !!fix this
- .NormalTSpikesBS: .word 0x08C894AB !!fix this
- .HarshTSpikesBS: .word 0x08C894BB !!fix this
- .AbsorbTSpikesBS: .word 0x08C894CB !!fix this
- .BattleStruct: .word 0x02023be4
- /////////////////////////////////////////////
- SkipTSpikesBS should point to 5 bytes before a callasm on SpikesHurt.
- NormalTSpikesBS should point to 5 bytes before this:
- 2E 85 3E 02 02 02
- 16
- F8 (SpikesHurt)
- HarshTSpikesBS should point to 5 bytes before this:
- 2E 85 3E 02 02 06
- 16
- F8 (SpikesHurt)
- AbsorbTSpikesBS should point to 5 bytes before this:
- 10 (your "t-spikes disappeared" message ID)
- 12 40 00
- F8 (SpikesHurt)
- =============================================
- SpikesHurt:
- =============================================
- .org 0x251580
- push {lr}
- mov r0, #0x0
- bl 0x16e24
- ldr r4, .HurtBank
- strb r0, [r4, #0x0]
- mov r4, r0
- bl 0x751c4
- ldr r1, .HalverStruct
- mov r2, #0xc
- mul r0, r2, r0
- add r0, r1, r0
- mov r5, r0
- ldrb r0, [r0, #0xa]
- mov r3, #0x3
- and r0, r3, r0
- cmp r0, #0x0
- beq SkipSpikes
- mov r6, r0
- ldr r0, .BattleStruct
- mov r1, #0x58
- mul r1, r4, r1
- add r0, r1, r0
- add r0, #0x20
- mov r7, r0
- Ability:
- ldrb r1, [r7, #0x0]
- cmp r1, #0x1a
- beq SkipSpikes
- cmp r1, #0x5d
- beq SkipSpikes
- BirdCheck:
- ldrb r0, [r7, #0x1]
- ldrb r1, [r7, #0x2]
- cmp r0, #0x2
- beq SkipSpikes
- cmp r1, #0x2
- beq SkipSpikes
- DamCalculate:
- ldrh r0, [r7, #0xc]
- mov r1, #0xa
- mov r2, r6
- add r2, r6, r2
- sub r1, r1, r2
- bl 0x1e4018
- ldr r1, .DamageDealt
- str r0, [r1, #0x0]
- ldr r2, .ActiveBSPointer
- ldr r3, .SpikesDamageBS
- str r3, [r2, #0x0]
- b End
- SkipSpikes:
- ldr r2, .ActiveBSPointer
- ldr r3, .SpikesSkipBS
- str r3, [r2, #0x0]
- End:
- pop {r0}
- bx r0
- .align 2
- .HurtBank: .word 0x02023fdb
- .HalverStruct: .word 0x02023de4
- .DamageDealt: .word 0x02023d50
- .ActiveBSPointer: .word 0x02023d74
- .BattleStruct: .word 0x02023be4
- .SpikesDamageBS: .word 0x08C894DB !!fix this
- .SpikesSkipBS: .word 0x08C8948B !!fix this
- /////////////////////////////////////////////
- SpikesSkipBS should point to 5 bytes before a callasm on SRHurt.
- SpikesDamageBS should point to 5 bytes before this:
- 0B 00
- 0C 00
- 41 2C 8D 1D 08
- 19 00 00 00 00 00 00
- 19 00 01 DF 8C 1D 08
- F8 (SRHurt)
- =============================================
- SRHurt:
- =============================================
- .org 0x251610
- push {lr}
- mov r0, #0x0
- bl 0x16e24
- mov r4, r0
- bl 0x751c4
- ldr r1, .HalverStruct
- mov r2, #0xc
- mul r0, r2, r0
- add r0, r1, r0
- mov r5, r0
- ldrb r0, [r0, #0xa]
- mov r3, #0x10
- and r0, r3, r0
- cmp r0, #0x0
- beq SkipSR
- mov r6, r0
- ldr r0, .BattleStruct
- mov r1, #0x58
- mul r1, r4, r1
- add r0, r1, r0
- add r0, #0x20
- mov r7, r0
- Ability:
- ldrb r1, [r7, #0x0]
- cmp r1, #0x5d
- beq SkipSR
- mov r0, #0x8
- ldrb r1, [r7, #0x1]
- mov r2, #0x0
- TypeMatchup:
- cmp r1, #0x1
- beq Resist
- cmp r1, #0x2
- beq Weak
- cmp r1, #0x4
- beq Resist
- cmp r1, #0x6
- beq Weak
- cmp r1, #0x8
- beq Resist
- cmp r1, #0xa
- beq Weak
- cmp r1, #0xf
- beq Weak
- b TypeLoop
- Resist:
- lsl r0, r0, #0x1
- b TypeLoop
- Weak:
- lsr r0, r0, #0x1
- TypeLoop:
- add r2, #0x1
- mov r3, r1
- ldrb r1, [r7, #0x2]
- cmp r1, r3
- beq EndTypeLoop
- cmp r2, #0x2
- bne TypeMatchup
- EndTypeLoop:
- DamCalculate:
- mov r1, r0
- ldrh r0, [r7, #0xc]
- bl 0x1e4018
- cmp r0, #0x0
- bne ApplyDamage
- mov r0, #0x1
- ApplyDamage:
- ldr r1, .DamageDealt
- str r0, [r1, #0x0]
- ldr r2, .ActiveBSPointer
- ldr r3, .SRDamageBS
- str r3, [r2, #0x0]
- b End
- SkipSR:
- ldr r2, .ActiveBSPointer
- ldr r3, .SRSkipBS
- str r3, [r2, #0x0]
- End:
- pop {r0}
- bx r0
- .align 2
- .HalverStruct: .word 0x02023de4
- .DamageDealt: .word 0x02023d50
- .ActiveBSPointer: .word 0x02023d74
- .BattleStruct: .word 0x02023be4
- .SRDamageBS: .word 0x08C894FB !!fix this
- .SRSkipBS: .word 0x08C8949B !!fix this
- /////////////////////////////////////////////
- SRSkipBS should point to 5 bytes before a callasm to WebHurt.
- SRDamageBS should point to 5 bytes before this:
- 0B 00
- 0C 00
- 10 86 01
- 12 40 00
- 19 00 00 00 00 00 00
- 19 00 01 DF 8C 1D 08
- F8 (WebHurt)
- =============================================
- WebHurt:
- =============================================
- .org 0x2516C0
- push {lr}
- mov r0, #0x0
- bl 0x16e24
- mov r4, r0
- bl 0x751c4
- ldr r1, .HalverStruct
- mov r2, #0xc
- mul r0, r2, r0
- add r0, r1, r0
- ldrb r0, [r0, #0xa]
- mov r3, #0x20
- and r0, r3, r0
- cmp r0, #0x0
- beq SkipWeb
- ldr r0, .BattleStruct
- mov r1, #0x48
- mul r1, r4, r1
- add r0, r1, r0
- add r0, #0x20
- mov r7, r0
- Ability:
- ldrb r1, [r7, #0x0]
- cmp r1, #0x1a
- beq SkipWeb
- BirdCheck:
- ldrb r1, [r7, #0x1]
- ldrb r0, [r7, #0x2]
- cmp r1, #0x2
- beq SkipWeb
- cmp r0, #0x2
- beq SkipWeb
- ApplyWeb:
- ldr r2, .ActiveBSPointer
- ldr r3, .WebApplyBS
- str r3, [r2, #0x0]
- b End
- SkipWeb:
- ldr r2, .ActiveBSPointer
- ldr r3, .WebSkipBS
- str r3, [r2, #0x0]
- End:
- pop {r0}
- bx r0
- .HalverStruct: .word 0x02023de4
- .BattleStruct: .word 0x02023be4
- .ActiveBSPointer: .word 0x02023d74
- .WebApplyBS: .word 0x08C8951B !!fix this
- .WebSkipBS: .word 0x08C8953B !!fix this
- /////////////////////////////////////////////
- WebApplyBS should point to 5 bytes before this:
- 10 ("caught in a web" message ID)
- 12 40 00
- 2E 85 3E 02 02 18
- 16
- 35 D0 3D 02 02 00 01 10 00
- 3C
- WebSkipBS should point to 5 bytes before this:
- 35 D0 3D 02 02 00 01 10 00
- 3C
- .............................................
- This gets the four hazards working properly.
- To make the moves function without memory editing, replace Spikes's script with this:
- 2A 00 4A 3D 02 02 MM MM XX XX XX XX
- 2A 00 4A 3D 02 02 NN NN YY YY YY YY
- 2A 00 4A 3D 02 02 OO OO ZZ ZZ ZZ ZZ
- 00
- F8 (LaySpikes)
- 02
- 03
- 09
- 0A
- 10 94 00
- 12 40 00
- 28 4E 69 1D 08
- Where:
- MM MM is Toxic Spikes's move ID; XX XX XX XX points to its battle script
- NN NN is Stealth Rock's move ID; YY YY YY YY points to its battle script
- OO OO is Sticky Web's move ID; ZZ ZZ ZZ ZZ points to its battle script
- At XX XX XX XX:
- 00
- F8 (LayToxicSpikes)
- 02
- 03
- 09
- 0A
- 10 ("poison spikes scattered" message ID)
- 12 40 00
- 28 4E 69 1D 08
- ...and so on for the other two.
- =============================================
- LaySpikes
- =============================================
- .org 0x251730
- push {r4, lr}
- ldr r4, .ActiveBank
- ldrb r0, [r4, #0x0]
- bl 0x751c4
- mov r1, #0x1
- eor r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- ldr r1, .HalverStruct
- lsl r2, r0, #0x1
- add r0, r2, r0
- lsl r0, r0, #0x2
- add r3, r0, r1
- ldrb r0, [r3, #0xa]
- mov r1, #0x3
- and r0, r1, r0
- cmp r0, #0x3
- bne LaySpikes
- ldr r2, .Unknown
- ldrb r1, [r4, #0x0]
- lsl r0, r1, #0x2
- add r0, r0, r1
- lsl r0, r0, #0x2
- add r0, r0, r2
- ldrb r1, [r0, #0x0]
- mov r2, #0x20
- orr r1, r2
- strb r1, [r0, #0x0]
- ldr r3, .ActiveBSPointer
- ldr r1, .FailAddr
- str r1, [r3, #0x0]
- b End
- LaySpikes:
- ldr r1, .HalverMarker
- add r1, r2, r1
- ldrh r2, [r1, #0x0]
- mov r0, #0x10
- orr r0, r2
- strh r0, [r1, #0x0]
- ldrb r0, [r3, #0xa]
- add r0, #0x1
- strb r0, [r3, #0xa]
- End:
- pop {r4}
- pop {r0}
- bx r0
- .align 2
- .ActiveBank: .word 0x02023d6b
- .HalverStruct: .word 0x02023de4
- .Unknown: .word 0x02023ecc
- .ActiveBSPointer: .word 0x02023d74
- .HalverMarker: .word 0x02023dde
- .FailAddr: .word 0x081D7DEB
- =============================================
- LayTSpikes
- =============================================
- .org 0x2517C0
- push {r4, lr}
- ldr r4, .ActiveBank
- ldrb r0, [r4, #0x0]
- bl 0x751c4
- mov r1, #0x1
- eor r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- ldr r1, .HalverStruct
- lsl r2, r0, #0x1
- add r0, r2, r0
- lsl r0, r0, #0x2
- add r3, r0, r1
- ldrb r0, [r3, #0xa]
- mov r1, #0xc
- and r0, r1, r0
- lsr r0, r0, #0x2
- cmp r0, #0x3
- bne LayTSpikes
- ldr r2, .Unknown
- ldrb r1, [r4, #0x0]
- lsl r0, r1, #0x2
- add r0, r0, r1
- lsl r0, r0, #0x2
- add r0, r0, r2
- ldrb r1, [r0, #0x0]
- mov r2, #0x20
- orr r1, r2
- strb r1, [r0, #0x0]
- ldr r3, .ActiveBSPointer
- ldr r1, .FailAddr
- str r1, [r3, #0x0]
- b End
- LayTSpikes:
- ldr r1, .HalverMarker
- add r1, r2, r1
- ldrh r2, [r1, #0x0]
- mov r0, #0x10
- orr r0, r2
- strh r0, [r1, #0x0]
- ldrb r0, [r3, #0xa]
- mov r1, #0xc
- and r1, r0, r1
- lsr r1, r1, #0x2
- add r1, #0x1
- lsl r1, r1, #0x2
- orr r0, r0, r1
- strb r0, [r3, #0xa]
- End:
- pop {r4}
- pop {r0}
- bx r0
- .align 2
- .ActiveBank: .word 0x02023d6b
- .HalverStruct: .word 0x02023de4
- .Unknown: .word 0x02023ecc
- .ActiveBSPointer: .word 0x02023d74
- .HalverMarker: .word 0x02023dde
- .FailAddr: .word 0x081D7DEB
- =============================================
- LaySR
- =============================================
- .org 0x251860
- push {r4, lr}
- ldr r4, .ActiveBank
- ldrb r0, [r4, #0x0]
- bl 0x751c4
- mov r1, #0x1
- eor r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- ldr r1, .HalverStruct
- lsl r2, r0, #0x1
- add r0, r2, r0
- lsl r0, r0, #0x2
- add r3, r0, r1
- ldrb r0, [r3, #0xa]
- mov r1, #0x10
- and r0, r1, r0
- cmp r0, #0x0
- beq LaySR
- ldr r2, .Unknown
- ldrb r1, [r4, #0x0]
- lsl r0, r1, #0x2
- add r0, r0, r1
- lsl r0, r0, #0x2
- add r0, r0, r2
- ldrb r1, [r0, #0x0]
- mov r2, #0x20
- orr r1, r2
- strb r1, [r0, #0x0]
- ldr r3, .ActiveBSPointer
- ldr r1, .FailAddr
- str r1, [r3, #0x0]
- b End
- LaySR:
- ldr r1, .HalverMarker
- add r1, r2, r1
- ldrh r2, [r1, #0x0]
- mov r0, #0x10
- orr r0, r2
- strh r0, [r1, #0x0]
- ldrb r0, [r3, #0xa]
- mov r1, #0x10
- orr r0, r1, r0
- strb r0, [r3, #0xa]
- End:
- pop {r4}
- pop {r0}
- bx r0
- .ActiveBank: .word 0x02023d6b
- .HalverStruct: .word 0x02023de4
- .Unknown: .word 0x02023ecc
- .ActiveBSPointer: .word 0x02023d74
- .HalverMarker: .word 0x02023dde
- .FailAddr: .word 0x081D7DEB
- =============================================
- LayWeb
- =============================================
- .org 0x2518F0
- push {r4, lr}
- ldr r4, .ActiveBank
- ldrb r0, [r4, #0x0]
- bl 0x751c4
- mov r1, #0x1
- eor r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- ldr r1, .HalverStruct
- lsl r2, r0, #0x1
- add r0, r2, r0
- lsl r0, r0, #0x2
- add r3, r0, r1
- ldrb r0, [r3, #0xa]
- mov r1, #0x20
- and r0, r1, r0
- cmp r0, #0x0
- beq LayWeb
- ldr r2, .Unknown
- ldrb r1, [r4, #0x0]
- lsl r0, r1, #0x2
- add r0, r0, r1
- lsl r0, r0, #0x2
- add r0, r0, r2
- ldrb r1, [r0, #0x0]
- mov r2, #0x20
- orr r1, r2
- strb r1, [r0, #0x0]
- ldr r3, .ActiveBSPointer
- ldr r1, .FailAddr
- str r1, [r3, #0x0]
- b End
- LayWeb:
- ldr r1, .HalverMarker
- add r1, r2, r1
- ldrh r2, [r1, #0x0]
- mov r0, #0x10
- orr r0, r2
- strh r0, [r1, #0x0]
- ldrb r0, [r3, #0xa]
- mov r1, #0x20
- orr r0, r1, r0
- strb r0, [r3, #0xa]
- End:
- pop {r4}
- pop {r0}
- bx r0
- .align 2
- .ActiveBank: .word 0x02023d6b
- .HalverStruct: .word 0x02023de4
- .Unknown: .word 0x02023ecc
- .ActiveBSPointer: .word 0x02023d74
- .HalverMarker: .word 0x02023dde
- .FailAddr: .word 0x081D7DEB
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement