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) x24F30: 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