Skip to content
Pokémon est une marque déposée de Nintendo, Game Freak Inc. et The Pokémon Company. Ce contenu est réalisé par des fans pour des fans. Copyright (c) 2006-2026 Pokémon Trash. Pour vos demandes, privilégiez les réseaux sociaux ou via contact@pokemontrash.com
[Tutoriel][Simplifié] Insérer le Split sur Rouge Feu dans Club | Pokémon Trash
[Tutoriel][Simplifié] Insérer le Split sur Rouge Feu
Andy Sama - 12 août 2022 à 13:03
Simple avertissement: Faites toujours des backups.
Split Physique, Special et Status: Update du 29 Mars 2024
1 - Introduction
Je vais vous la faire courte, une nouvelle implementation faite par AGSMGMaster a drop, ce qui rend à peu près toute l'entièreté de ce tuto obsolète.
2 - Utilisation
Mon implémentation (qui est une conversion de celle de DoesntKnowHowToPlay) est peut-être fonctionnelle, mais pour être 100% sur, utilisez celle-ci à la place:
[spoiler]
# Physical/Special Split
# Credits to DoesntKnowHowToPlay for making the original patches
# Credits to Darthatron/Jambo for the FR icon changes
# Credis to Tlatchi/Xencleamas for the Emerald icon changes
# Credits to AkameTheBulbasuar for the Thaw check fix
# Edits and HMA script by AGSMGMaster64
# This script makes some changes to how physical/special damage is determined in the Gen 3 games
# More specifically, the category of a move is based on a normally unused byte for move stats instead of the move type
# This allows ???-type moves to do damage as well since it removes the hardcoding for them
# This script also adds the Sandstorm Rock Sp Def buff which relies on the physical/special split to work
.python
if data.pokemon.moves.stats.battle.Run.ElementContent[0].Length != 1:
editor.SelectedTab.RaiseError("Cannot apply PSS after move expansion."
editor.SelectedTab.AbortScript()
.end
@data.pokemon.moves.stats.battle
^data.pokemon.moves.stats.battle[effect.moveeffectoptions power. type.data.pokemon.type.names accuracy. pp. effectAccuracy. target|b[]movetarget priority.|z info|b[]moveinfo unused. category.movecategory unused.]data.pokemon.moves.names
@!game(AXVE0) @1E0868
@!game(AXVE1) @1E0880
@!game(AXPE0) @1E07F8
@!game(AXPE1) @1E0810
@!game(BPRE0) @1E4018
@!game(BPRE1) @1E4088
@!game(BPGE0) @1E3FF4
@!game(BPGE1) @1E4064
@!game(BPEE0) @2E7540
@!game(BPRF0) @1E243C
@!game(All) ^thumb.Divsi3
@!game(AXVE0_AXVE1_AXPE0_AXPE1) @01C3AE
@!game(BPRE0_BPGE0) @01DF3E
@!game(BPRE1_BPGE1) @01DF52
@!game(BPEE0) @04674E
@!game(BPRF0) @01DEAE
@!game(All) ^thumb.physicalspecialsplit.accuracy
@!game(AXVE0_AXVE1_AXPE0_AXPE1) @01DB66
@!game(BPRE0_BPGE0) @01F69A
@!game(BPRE1_BPGE1) @01F6AE
@!game(BPEE0) @047EDA
@!game(BPRF0) @01F60A
@!game(All) ^thumb.physicalspecialsplit.datahp1
@!game(AXVE0_AXVE1_AXPE0_AXPE1) @01DDD4
@!game(BPRE0_BPGE0) @01F908
@!game(BPRE1_BPGE1) @01F91C
@!game(BPEE0) @048148
@!game(BPRF0) @01F878
@!game(All) ^thumb.physicalspecialsplit.datahp2
@!game(AXVE0_AXVE1_AXPE0_AXPE1) @021A70
@!game(BPRE0_BPGE0) @0234DC
@!game(BPRE1_BPGE1) @0234F0
@!game(BPEE0) @04BE98
@!game(BPRF0) @02344C
@!game(All) ^thumb.physicalspecialsplit.defrost
@!game(AXVE0_AXVE1_AXPE0_AXPE1) @03BA2C
@!game(BPRE0_BPGE0) @03ECEC
@!game(BPRE1_BPGE1) @03ED00
@!game(BPEE0) @06957C
@!game(BPRF0) @03EBC4
@!game(All) ^thumb.CalculateBaseDamage
@!game(AXVE0_AXVE1_AXPE0_AXPE1) @03BC96
@!game(BPRE0_BPGE0) @03EF06
@!game(BPRE1_BPGE1) @03EF1A
@!game(BPEE0) @069746
@!game(BPRF0) @03EDDE
@!game(All) ^thumb.physicalspecialsplit.typeboostitems
@!game(AXVE0_AXVE1_AXPE0_AXPE1) @03BDD2
@!game(BPRE0_BPGE0) @03F03A
@!game(BPRE1_BPGE1) @03F04E
@!game(BPEE0) @06986E
@!game(BPRF0) @03EF12
@!game(All) ^thumb.physicalspecialsplit.thickfat
@!game(AXVE0_AXVE1_AXPE0_AXPE1) @03BFBC
@!game(BPRE0_BPGE0) @03F224
@!game(BPRE1_BPGE1) @03F238
@!game(BPEE0) @069A58
@!game(BPRF0) @03F0FC
@!game(All) ^thumb.physicalspecialsplit.physicalcheck
@!game(AXVE0_AXVE1_AXPE0_AXPE1) @03C122
@!game(BPRE0_BPGE0) @03F38A
@!game(BPRE1_BPGE1) @03F39E
@!game(BPEE0) @069BC2
@!game(BPRF0) @03F262
@!game(All) ^thumb.physicalspecialsplit.specialstatuscheck
@!game(AXVE0_AXVE1_AXPE0_AXPE1) @03C25C
@!game(BPRE0_BPGE0) @03F4C4
@!game(BPRE1_BPGE1) @03F4D8
@!game(BPEE0) @069CFC
@!game(BPRF0) @03F39C
@!game(All) ^thumb.physicalspecialsplit.weather
# in "Cmd_accuracycheck"
# Changes the check for Hustle so that it checks for the 11th byte instead of the type byte
@thumb.physicalspecialsplit.accuracy .thumb
ldrb r0, [r0, #10]
.end
@thumb.physicalspecialsplit.accuracy+182 .thumb
cmp r1, #0 @ if (gBattleMons[gBattlerAttacker].ability == ABILITY_HUSTLE && IS_MOVE_PHYSICAL(move))
bne <thumb.physicalspecialsplit.accuracy+196>
.end
# in "Cmd_datahpupdate"
# Changes the way how physical and special damage are recorded for use with Counter/Mirror Coat
@thumb.physicalspecialsplit.datahp1 .thumb
b <thumb.physicalspecialsplit.datahp1+1A> @ Without this, Hidden Power and other type-changing damaging moves will still refer to the actual type
.end
@thumb.physicalspecialsplit.datahp1+28 .thumb
ldrb r6, [r0, #10]
.end
@thumb.physicalspecialsplit.datahp2 .thumb
cmp r6, #0 @ if (IS_MOVE_PHYSICAL(move) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE))
bne <thumb.physicalspecialsplit.datahp2+84>
.end
@thumb.physicalspecialsplit.datahp2+84 .thumb
cmp r6, #1 @ else if (IS_MOVE_SPECIAL(move) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE))
bne <thumb.physicalspecialsplit.datahp2+F2>
.end
# in "Cmd_moveend"
# Changes the check for thawing/defrosting to check for any Fire damage and not just special
@thumb.physicalspecialsplit.defrost .thumb
add r0, r0, #4 @ if (gSpecialStatuses[gBattlerTarget].dmg)
.end
# in "CalculateBaseDamage"
# Adds in r11 to store the split byte to be referenced later
@!game(AXVE0_AXVE1_AXPE0_AXPE1)
@thumb.CalculateBaseDamage .thumb
push \{r4-r7, lr\}
mov r7, r11
mov r6, r10
mov r5, r9
mov r4, r8
push \{r4-r7\}
sub sp, #44
mov r7, r0
str r1, [sp, #4]
str r2, [sp, #8]
ldr r0, [sp, #80]
ldr r1, [sp, #84]
ldr r2, [sp, #88]
ldr r4, [sp, #92]
lsl r3, r3, #16
lsr r3, r3, #16
str r3, [sp, #12]
lsl r0, r0, #16
lsr r3, r0, #16
lsl r1, r1, #24
lsr r6, r1, #24
lsl r2, r2, #24
lsr r2, r2, #24
str r2, [sp, #16]
lsl r4, r4, #24
lsr r4, r4, #24
mov r5, #0
cmp r3, #0
bne PowerOverride
ldr r2, [pc, <thumb.CalculateBaseDamage+70>]
ldr r1, [pc, <thumb.CalculateBaseDamage+74>]
ldr r3, [sp, #8]
lsl r0, r3, #1
add r0, r0, r3
lsl r0, r0, #2
add r0, r0, r1
ldrb r0, [r0, #1]
strh r0, [r2, #0]
b GetMoveCategory
nop
PowerOverride:
ldr r0, [pc, <thumb.CalculateBaseDamage+70>]
strh r3, [r0, #0]
GetMoveCategory:
ldr r1, [pc, <thumb.CalculateBaseDamage+74>]
ldr r2, [sp, #8]
lsl r0, r2, #1
add r0, r0, r2
lsl r0, r0, #2
add r0, r0, r1
ldrb r2, [r0, #10]
mov r11, r2 @ Puts split byte for the move used in r11 to be checked later
cmp r6, #0
bne <thumb.CalculateBaseDamage+78>
.end
@!game(BPRE0_BPRE1_BPGE0_BPGE1_BPRF0)
@thumb.CalculateBaseDamage .thumb
push \{r4-r7, lr\}
mov r7, r11
mov r6, r10
mov r5, r9
mov r4, r8
push \{r4-r7\}
sub sp, #44
mov r6, r0
str r1, [sp, #4]
str r2, [sp, #8]
ldr r0, [sp, #80]
ldr r1, [sp, #84]
ldr r2, [sp, #88]
ldr r4, [sp, #92]
lsl r3, r3, #16
lsr r3, r3, #16
str r3, [sp, #12]
lsl r0, r0, #16
lsr r3, r0, #16
lsl r1, r1, #24
lsr r7, r1, #24
lsl r2, r2, #24
lsr r2, r2, #24
str r2, [sp, #16]
lsl r4, r4, #24
lsr r4, r4, #24
mov r5, #0
cmp r3, #0
bne PowerOverride
ldr r2, [pc, <thumb.CalculateBaseDamage+70>]
ldr r1, [pc, <thumb.CalculateBaseDamage+74>]
ldr r3, [sp, #8]
lsl r0, r3, #1
add r0, r0, r3
lsl r0, r0, #2
add r0, r0, r1
ldrb r0, [r0, #1]
strh r0, [r2, #0]
b GetMoveCategory
nop
PowerOverride:
ldr r0, [pc, <thumb.CalculateBaseDamage+70>]
strh r3, [r0, #0]
GetMoveCategory:
ldr r1, [pc, <thumb.CalculateBaseDamage+74>]
ldr r2, [sp, #8]
lsl r0, r2, #1
add r0, r0, r2
lsl r0, r0, #2
add r0, r0, r1
ldrb r2, [r0, #10]
mov r11, r2 @ Puts split byte for the move used in r11 to be checked later
cmp r7, #0
bne <thumb.CalculateBaseDamage+78>
.end
@!game(BPEE0)
@thumb.CalculateBaseDamage .thumb
push \{r4-r7, lr\}
mov r7, r11
mov r6, r10
mov r5, r9
mov r4, r8
push \{r4-r7\}
sub sp, #48
mov r6, r0
str r1, [sp, #4]
str r2, [sp, #8]
ldr r0, [sp, #84]
ldr r1, [sp, #88]
ldr r2, [sp, #92]
ldr r4, [sp, #96]
lsl r3, r3, #16
lsr r3, r3, #16
str r3, [sp, #12]
lsl r0, r0, #16
lsr r3, r0, #16
lsl r1, r1, #24
lsr r7, r1, #24
lsl r2, r2, #24
lsr r2, r2, #24
str r2, [sp, #16]
lsl r4, r4, #24
lsr r4, r4, #24
str r4, [sp, #20]
mov r5, #0
cmp r3, #0
bne PowerOverride
ldr r2, BattleMovePower
ldr r1, [pc, <thumb.CalculateBaseDamage+78>]
ldr r3, [sp, #8]
lsl r0, r3, #1
add r0, r0, r3
lsl r0, r0, #2
add r0, r0, r1
ldrb r0, [r0, #1]
strh r0, [r2, #0]
b GetMoveCategory
BattleMovePower:
.word 0x020244E0
PowerOverride:
ldr r0, [pc, <thumb.CalculateBaseDamage+74>]
strh r3, [r0, #0]
GetMoveCategory:
ldr r1, [pc, <thumb.CalculateBaseDamage+78>]
ldr r2, [sp, #8]
lsl r0, r2, #1
add r0, r0, r2
lsl r0, r0, #2
add r0, r0, r1
ldrb r2, [r0, #10]
mov r11, r2 @ Puts split byte for the move used in r11 to be checked later
cmp r7, #0
bne <0695F8>
.end
# For Type-boosting items
@!game(AXVE0_AXVE1_AXPE0_AXPE1_BPRE0_BPRE1_BPGE0_BPGE1_BPRF0)
@thumb.physicalspecialsplit.typeboostitems .thumb
mov r1, r11
cmp r1, #0 @ if (IS_MOVE_PHYSICAL(move)) attack = (attack * (attackerHoldEffectParam + 100)) / 100;
bne <thumb.physicalspecialsplit.typeboostitems+8>
.end
@!game(BPEE0)
@thumb.physicalspecialsplit.typeboostitems .thumb
mov r1, r11
cmp r1, #0 @ if (IS_MOVE_PHYSICAL(move)) attack = (attack * (attackerHoldEffectParam + 100)) / 100;
beq <06966C> @ specific to Emerald, so it's ok to leave it like this
.end
# Change Thick Fat to affect physical moves as well
@!game(AXVE0_AXVE1_AXPE0_AXPE1)
@thumb.physicalspecialsplit.thickfat .thumb
cmp r0, #47 @ Abilty ID of Thick Fat
bne HustleCheck
mov r2, r9
cmp r2, #10 @ Fire Type
beq ThickFat
cmp r2, #15 @ Ice Type
bne HustleCheck
ThickFat:
mov r3, r8
lsr r3, r3, #1
mov r8, r3
lsr r6, r6, #1
b HustleCheck
nop
nop
nop
HustleCheck:
ldr r0, [sp, #36]
ldrb r4, [r0, #0]
cmp r4, #55 @ Abilty ID of Hustle
bne <thumb.physicalspecialsplit.thickfat+2A>
lsr r0, r6, #1
add r6, r0, r6
.end
@!game(BPRE0_BPRE1_BPGE0_BPGE1_BPRF0)
@thumb.physicalspecialsplit.thickfat .thumb
cmp r0, #47 @ Abilty ID of Thick Fat
bne HustleCheck
mov r2, r9
cmp r2, #10 @ Fire Type
beq ThickFat
cmp r2, #15 @ Ice Type
bne HustleCheck
ThickFat:
mov r3, r8
lsr r3, r3, #1
mov r8, r3
lsr r7, r7, #1
b HustleCheck
nop
nop
nop
HustleCheck:
ldr r0, [sp, #36]
ldrb r4, [r0, #0]
cmp r4, #55 @ Abilty ID of Hustle
bne <thumb.physicalspecialsplit.thickfat+2A>
lsr r0, r7, #1
add r7, r0, r7
.end
@!game(BPEE0)
@thumb.physicalspecialsplit.thickfat .thumb
cmp r0, #47 @ Abilty ID of Thick Fat
bne HustleCheck
mov r2, r10
cmp r2, #10 @ Fire Type
beq ThickFat
cmp r2, #15 @ Ice Type
bne HustleCheck
ThickFat:
mov r3, r8
lsr r3, r3, #1
mov r8, r3
lsr r7, r7, #1
b HustleCheck
nop
nop
nop
HustleCheck:
ldr r0, [sp, #40]
ldrb r4, [r0, #0]
cmp r4, #55 @ Abilty ID of Hustle
bne <thumb.physicalspecialsplit.thickfat+2A>
lsr r0, r7, #1
add r7, r0, r7
.end
@!game(All)
# Change a check for physical-based calculations to use the new byte
@thumb.physicalspecialsplit.physicalcheck .thumb
mov r1, r11
cmp r1, #0 @ if (IS_MOVE_PHYSICAL(move))
beq <thumb.physicalspecialsplit.physicalcheck+8>
.end
# Removes the ???-type hardcoding as well as changing the check for special-based calculations
# Also delinks Weather from only being affected by special attacks
@!game(AXVE0_AXVE1_AXPE0_AXPE1)
@thumb.physicalspecialsplit.specialstatuscheck .thumb
mov r6, r11
cmp r6, #3 @ if (IS_MOVE_STATUS(move))
bne SpecialCategoryCheck
mov r5, #0
SpecialCategoryCheck:
mov r0, r11
cmp r0, #1 @ if (IS_MOVE_SPECIAL(move))
beq <thumb.physicalspecialsplit.specialstatuscheck+10>
b <thumb.physicalspecialsplit.weather>
.end
@!game(BPRE0_BPRE1_BPGE0_BPGE1_BPEE0_BPRF0)
@thumb.physicalspecialsplit.specialstatuscheck .thumb
mov r7, r11
cmp r7, #3 @ if (IS_MOVE_STATUS(move))
bne SpecialCategoryCheck
mov r5, #0
SpecialCategoryCheck:
mov r0, r11
cmp r0, #1 @ if (IS_MOVE_SPECIAL(move))
beq <thumb.physicalspecialsplit.specialstatuscheck+10>
b <thumb.physicalspecialsplit.weather>
.end
@!game(All)
# Rewrites weather calcs to fit in Sp Def boost for Rock
@thumb.physicalspecialsplit.weather+2C .thumb
ldr r2, BattleWeather
ldrh r4, [r2, #0]
cmp r4, #0
beq <thumb.physicalspecialsplit.weather+B0>
mov r6, r10
mov r0, #96 @ B_WEATHER_SUN
and r0, r4
cmp r0, #0
beq SandstormCheck
cmp r6, #10 @ Fire Type
beq WeatherHalfBoost
cmp r6, #11 @ Water Type
beq WeatherHalfDamage
b <thumb.physicalspecialsplit.weather+B0>
BattleTypeFlags:
.word 0x02022FEC
MoveBattleStats:
.word <data.pokemon.moves.stats.battle>
BattleWeather:
.word 0x020243CC @ gBattleWeather
SandstormCheck:
mov r0, #24 @ B_WEATHER_SANDSTORM
and r0, r4
cmp r0, #0
beq MiscWeatherCheck
mov r0, r11
cmp r0, #1 @ Special Move
bne MiscWeatherCheck
ldr r2, BattleMonsType1
ldr r0, BattlerTarget
ldrb r1, [r0, #0]
mov r0, #88
mul r0, r1
add r3, r0, r2
ldrb r0, [r3, #0]
cmp r0, #5 @ Rock type (Primary)
beq SandstormBoostSpDef
ldrb r0, [r3, #1]
cmp r0, #5 @ Rock type (Secondary)
bne MiscWeatherCheck
SandstormBoostSpDef:
mov r0, #10
mul r0, r5
mov r1, #15
bl <thumb.Divsi3>
mov r5, r0
MiscWeatherCheck:
ldr r0, CurrentMove
ldrh r0, [r0, #0]
cmp r0, #76 @ Solar Beam recieves half. The sun check skips this if there is sun up.
beq WeatherHalfDamage
cmp r4, #7 @ B_WEATHER_RAIN
bhi <thumb.physicalspecialsplit.weather+B0>
cmp r6, #10 @ Fire Type
beq WeatherHalfDamage
cmp r6, #11 @ Water Type
beq WeatherHalfBoost
b <thumb.physicalspecialsplit.weather+B0>
BattleMonsType1:
.word 0x020240A5 @ gBattleMons+21 gBattleMons[].type1
BattlerTarget:
.word 0x0202420C @ gBattlerTarget
CurrentMove:
.word 0x020241EA @ gCurrentMove
WeatherHalfBoost:
lsr r0, r5, #1 @ damage = (15 * damage) / 10;
add r5, r5, r0
b <thumb.physicalspecialsplit.weather+B0>
WeatherHalfDamage:
lsr r5, r5, #1 @ damage /= 2;
.end
# Registers used and RAM addresses are different in other games
@!game(AXVE0_AXVE1_AXPE0_AXPE1_BPRE0_BPRE1_BPGE0_BPGE1_BPRF0)
@thumb.physicalspecialsplit.weather+34 .thumb
mov r6, r9 @ r9 is used in every other version
.end
@!game(AXVE0_AXVE1_AXPE0_AXPE1)
@thumb.physicalspecialsplit.weather+48
F8 39 02 02 <data.pokemon.moves.stats.battle> B8 4D 02 02
@thumb.physicalspecialsplit.weather+9C
A1 4A 02 02 08 4C 02 02 E6 4B 02 02
@!game(BPRE0_BPRE1_BPGE0_BPGE1_BPRF0)
@thumb.physicalspecialsplit.weather+48
4C 2B 02 02 <data.pokemon.moves.stats.battle> 1C 3F 02 02
@thumb.physicalspecialsplit.weather+9C
05 3C 02 02 6C 3D 02 02 4A 3D 02 02
# Pops back the r11 register added in for the physical/special split
@!game(AXVE0_AXVE1_AXPE0_AXPE1)
@thumb.physicalspecialsplit.weather+D8 .thumb
pop \{r3-r6\}
mov r8, r3
mov r9, r4
mov r10, r5
mov r11, r6
pop \{r4-r7\}
pop \{r1\}
bx r1
.end
@!game(BPRE0_BPRE1_BPGE0_BPGE1_BPEE0_BPRF0)
@thumb.physicalspecialsplit.weather+DC .thumb
pop \{r3-r6\}
mov r8, r3
mov r9, r4
mov r10, r5
mov r11, r6
pop \{r4-r7\}
pop \{r1\}
bx r1
.end
# Adds in the category icons for FRLG and Emerald
@!game(BPRE0) @13A124
@!game(BPRE1) @13A19C
@!game(BPGE0) @13A0FC
@!game(BPGE1) @13A174
@!game(BPRF0) @13A27C
@!game(BPRE0_BPRE1_BPGE0_BPGE1_BPRF0) ^thumb.summary.SpriteCB_MoveSelectionCursor
@graphics.pokemon.moves.categoryicons(240)
00 00 00 00 00 00 00 00 20 22 22 22 12 11 11 11
11 11 21 12 11 11 11 22 11 11 11 21 11 11 11 11
00 00 00 00 00 00 00 00 22 22 22 22 11 11 11 11
11 21 12 11 12 21 12 21 22 22 22 22 22 22 22 22
00 00 00 00 00 00 00 00 22 22 22 02 11 11 11 21
21 12 11 11 22 11 11 11 12 11 11 11 11 11 11 11
11 11 21 22 11 11 11 11 11 11 11 21 11 11 11 22
11 11 21 12 1E 11 11 11 E0 EE EE EE 00 00 00 00
22 22 22 22 22 22 22 22 22 22 22 22 12 21 12 21
11 21 12 11 11 11 11 11 EE EE EE EE 00 00 00 00
22 12 11 11 11 11 11 11 12 11 11 11 22 11 11 11
21 12 11 11 11 11 11 E1 EE EE EE 0E 00 00 00 00
00 00 00 00 00 00 00 00 70 77 77 77 D7 DD DD DD
DD DD DD DD DD DD DD FF DD DD FF DD DD DD DF DD
00 00 00 00 00 00 00 00 77 77 77 77 DD DD DD DD
FF FF FF FF DD DD DD DD DD FD FF DD FD DF DD FF
00 00 00 00 00 00 00 00 77 77 77 07 DD DD DD 7D
DF DD DD DD FD DF DD DD DD FD DF DD DD DD DF DD
DD FD DD DD DD DD DF DD DD DD FF DD DD DD DD FF
DD DD DD DD DE DD DD DD E0 EE EE EE 00 00 00 00
DF DD DD DD FD DF DD FF DD FD FF DD DD DD DD DD
FF FF FF FF DD DD DD DD EE EE EE EE 00 00 00 00
DF DD FD DD DD DD DF DD DD FD DF DD FD DF DD DD
DF DD DD DD DD DD DD ED EE EE EE 0E 00 00 00 00
00 00 00 00 00 00 00 00 A0 AA AA AA 9A 99 99 99
99 99 99 99 99 99 99 F9 99 99 F9 9F 99 99 F9 99
00 00 00 00 00 00 00 00 AA AA AA AA 99 99 99 99
F9 FF FF 9F 9F 99 99 F9 99 F9 FF 99 99 FF FF 9F
00 00 00 00 00 00 00 00 AA AA AA 0A 99 99 99 A9
99 99 99 99 9F 99 99 99 F9 9F 99 99 99 9F 99 99
99 99 9F 99 99 99 F9 99 99 99 F9 9F 99 99 99 F9
99 99 99 99 9E 99 99 99 E0 EE EE EE 00 00 00 00
99 FF FF FF 99 99 FF FF 99 99 99 FF 9F 99 F9 FF
F9 FF FF 9F 99 99 99 99 EE EE EE EE 00 00 00 00
FF FF 99 99 FF 9F 99 99 FF 9F 99 99 9F 99 99 99
99 99 99 99 99 99 99 E9 EE EE EE 0E 00 00 00 00
@graphics.pokemon.moves.categoryicons ^graphics.pokemon.moves.categoryicons`ucs4x3x6|graphics.pokemon.type.palettes`
@thumb.summary.CategoryIcons(70) .thumb
Start:
push \{r0-r4\}
ldr r0, SummaryScreenRAMOffset1
ldrb r1, [r0, #0]
lsl r1, r1, #1
ldr r0, Move_List_Loc
ldr r0, [r0, #0]
ldr r3, SomeNumber
add r0, r0, r3
add r0, r0, r1
ldrh r3, [r0, #0]
cmp r3, #0
beq Return
lsl r0, r3, #1
add r0, r0, r3
lsl r0, r0, #2
ldr r1, MoveBattleStat
add r0, r0, r1
ldrb r4, [r0, #10]
lsl r0, r4, #1
add r4, r4, r0
lsl r4, r4, #6
ldr r0, CategoryIcons
add r0, r0, r4
ldr r1, VRAM
mov r2, #48
swi #11
ldr r0, CategoryIcons
add r0, r0, r4
add r0, r0, #96
ldr r1, VRAM
mov r2, #30
lsl r2, r2, #4
add r1, r1, r2
mov r2, #48
swi #11
Return:
pop \{r0-r4\}
ldr r4, Some_Offset
ldr r0, [r4, #0]
ldr r1, ReturnOffset
bx r1
MoveBattleStat:
.word <data.pokemon.moves.stats.battle>
SomeNumber:
.word 0x00003258
SummaryScreenRAMOffset1:
.word 0x0203B16D
Move_List_Loc:
.word 0x0203B140
VRAM:
.word 0x06001800
CategoryIcons:
.word <graphics.pokemon.moves.categoryicons>
Some_Offset:
.word 0x0203B148
ReturnOffset:
.word <thumb.summary.SpriteCB_MoveSelectionCursor+59>
.end
@thumb.summary.SpriteCB_MoveSelectionCursor+C .thumb
ldr r4, [pc, <thumb.summary.SpriteCB_MoveSelectionCursor+CC>]
.end
@thumb.summary.SpriteCB_MoveSelectionCursor+56 .thumb
bx r4
.end
@thumb.summary.SpriteCB_MoveSelectionCursor+7C
<thumb.summary.CategoryIcons+1>
@!game(BPEE0)
@1C0F44 ^thumb.summary.Task_HandleInput_MoveSelect
@1C12E4 ^thumb.summary.Task_HandleInput_MovePositionSwitch
@1C174C ^thumb.summary.Task_HandleReplaceMoveInput
@graphics.pokemon.moves.categoryicons(180)
00 00 00 00 00 00 00 00 00 00 00 00 00 20 22 22
00 32 33 33 00 33 32 23 00 33 22 23 00 33 23 22
00 00 00 00 00 00 00 00 00 00 00 00 22 22 02 00
33 33 23 00 32 23 33 00 32 22 33 00 22 32 33 00
00 33 22 22 00 33 23 22 00 33 22 23 00 33 32 23
00 3B 33 33 00 B0 BB BB 00 00 00 00 00 00 00 00
22 22 33 00 22 32 33 00 32 22 33 00 32 23 33 00
33 33 B3 00 BB BB 0B 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 20 22 22
00 32 33 33 00 33 23 22 00 33 72 77 00 23 37 22
00 00 00 00 00 00 00 00 00 00 00 00 22 22 02 00
33 33 23 00 22 32 33 00 77 27 33 00 22 73 32 00
00 23 23 33 00 23 73 22 00 73 32 77 00 33 27 22
00 37 73 77 00 70 77 77 00 00 00 00 00 00 00 00
33 32 32 00 22 37 32 00 77 23 37 00 22 72 33 00
77 37 73 00 77 77 07 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 90 99 99
00 89 88 88 00 88 F8 FF 00 88 8F 88 00 F8 88 F8
00 00 00 00 00 00 00 00 00 00 00 00 99 99 09 00
88 88 98 00 FF 8F 88 00 88 F8 88 00 FF 88 8F 00
00 F8 88 88 00 F8 88 88 00 88 8F F8 00 88 F8 FF
00 8A 88 88 00 A0 AA AA 00 00 00 00 00 00 00 00
FF 8F 8F 00 FF FF 8F 00 FF FF 88 00 FF 8F 88 00
88 88 A8 00 AA AA 0A 00 00 00 00 00 00 00 00 00
@graphics.pokemon.moves.categoryicons ^graphics.pokemon.moves.categoryicons`ucs4x2x6|graphics.pokemon.type.palettes`
@thumb.summary.CategoryIcons(118) .thumb
Prestart:
add r0, r0, r5
lsl r0, r0, #3
ldr r1, Replaced_Address
add r4, r0, r1
push \{r0-r5\}
ldr r0, CategoryIcons
ldr r1, OBJVRAM
mov r2, #192
swi #11
ldr r0, CurMoveIndex_DMA
ldr r0, [r0, #0]
mov r2, #16
lsl r2, r2, #8
add r2, r2, #13
add r0, r0, r2
ldrb r0, [r0, #0]
cmp r0, #0
bne StatFinish
mov r2, #16
lsl r2, r2, #8
add r2, r2, #10
cmp r6, #0
beq StatPreStart
Start:
ldr r0, CurMoveIndex_DMA
ldr r0, [r0, #0]
add r0, r0, r2
cmp r6, #1
bne Continue
add r0, r0, #1
Continue:
ldrb r1, [r0, #0]
cmp r1, #0
bne GetMove
mov r2, #32
lsl r2, r2, #8
add r0, r0, r2
ldrb r1, [r0, #0]
GetMove:
cmp r1, #4
beq GetFifthMove
lsl r1, r1, #1
ldr r0, SummaryScreenRAMOffset1
ldr r2, [r0, #0]
add r2, r2, #132
mov r0, r2
add r0, r0, r1
ldrh r3, [r0, #0]
Body:
mov r0, #0
lsl r0, r3, #1
add r0, r0, r3
lsl r0, r0, #2
ldr r1, MoveBattleStat
add r0, r0, r1
ldrb r4, [r0, #10]
lsl r4, r4, #1
mov r0, #64
lsl r0, r0, #20
ldr r1, [r0, #0]
mov r2, #32
orr r1, r2
stmia r0, \{r1\}
ldr r0, OAMMemAddress
ldr r1, IconOAM1
ldr r2, IconOAM2
cmp r4, #2
beq SpecAdd
cmp r4, #4
beq StatAdd
Draw:
stmia r0, \{r1-r2\}
ldr r0, OAMMemAddress
mov r1, #112
lsl r1, r1, #20
add r1, r1, #216
mov r2, #4
swi #11
StatFinish:
cmp r6, #1
beq MoveFinish
cmp r6, #2
beq LearnFinish
pop \{r0-r6\}
ldr r0, Return_Address_Stat
bx r0
GetFifthMove:
cmp r6, #2
bne StatFinish
ldr r0, CurMoveIndex_DMA
ldr r0, [r0, #0]
mov r2, #16
lsl r2, r2, #8
add r2, r2, #10
add r0, r0, r2
sub r0, #2
ldrh r3, [r0, #0]
cmp r3, #0
bne Body
mov r2, #32
lsl r2, r2, #8
add r0, r0, r2
ldrh r3, [r0, #0]
cmp r3, #0
bne Body
b Start
StatPreStart:
mov r3, #32
lsl r3, r3, #8
add r2, r2, r3
b Start
LearnFinish:
pop \{r0-r6\}
ldr r0, Return_Address_Learn
bx r0
MoveFinish:
pop \{r0-r6\}
ldr r0, Return_Address_Move
bx r0
SpecAdd:
mov r3, #16
lsl r3, r3, #8
add r3, r3, #4
add r2, r2, r3
b Draw
StatAdd:
add r2, r2, #8
b Draw
MoveBattleStat:
.word <data.pokemon.moves.stats.battle>
CurMoveIndex_DMA:
.word 0x0300090C
SummaryScreenRAMOffset1:
.word 0x0203CF1C
Replaced_Address:
.word 0x03005E08
Return_Address_Stat:
.word <thumb.summary.Task_HandleInput_MoveSelect+13>
Return_Address_Move:
.word <thumb.summary.Task_HandleInput_MovePositionSwitch+13>
Return_Address_Learn:
.word <thumb.summary.Task_HandleReplaceMoveInput+11>
IconOAM1:
.word 0x40280078
IconOAM2:
.word 0x0000D580
OBJVRAM:
.word 0x06013000
OAMMemAddress:
.word 0x030023E4
CategoryIcons:
.word <graphics.pokemon.moves.categoryicons>
.end
@thumb.summary.Task_HandleInput_MoveSelect+A .thumb
push \{r6\}
mov r6, #0
.end
@thumb.summary.Task_HandleInput_MoveSelect+10 .thumb
bx r1
.end
@thumb.summary.Task_HandleInput_MoveSelect+44
<thumb.summary.CategoryIcons+1>
@thumb.summary.Task_HandleInput_MovePositionSwitch+A .thumb
push \{r6\}
mov r6, #1
.end
@thumb.summary.Task_HandleInput_MovePositionSwitch+10 .thumb
bx r1
.end
@thumb.summary.Task_HandleInput_MovePositionSwitch+44
<thumb.summary.CategoryIcons+1>
@thumb.summary.Task_HandleReplaceMoveInput+8 .thumb
push \{r6\}
mov r6, #2
.end
@thumb.summary.Task_HandleReplaceMoveInput+E .thumb
bx r1
.end
@thumb.summary.Task_HandleReplaceMoveInput+54
<thumb.summary.CategoryIcons+1>
# Adds in a list to be referenced by the move stat table to edit a move's category
@!game(All)
.python
tab = editor.SelectedTab
categoryList = ['Physical', 'Special', 'Status']
tab.Model.SetList(tab.CurrentChange, "movecategory", categoryList, None, None)
.end
.python
no_values_set = sum() == 0
for move in data.pokemon.moves.stats.battle:
if move.power == 0:
# Turns all 0 base power moves into status moves as a relatively safe conversion
move.category = 'Status'
elif not move.info.contact and no_values_set:
# Turns all previously non-contact moves into special moves (only if no values had been set.)
move.category = 'Special'
if no_values_set:
# manual fixups of contact-special
data.pokemon.moves.stats.battle['Petal Dance'].category = 'Special'
# manual fixups of non-contact-physical
no_contact_physical = [
'Barrage', 'BeatUp',
'BoneClub', 'BoneRush',
'Bonemerang', 'BulletSeed',
'Earthquake', 'EggBomb',
'Explosion', 'Fissure',
'IcicleSpear', 'Magnitude',
'PayDay', 'PinMissile',
'PoisonSting', 'Present',
'RazorLeaf', 'RockBlast',
'RockSlide', 'RockThrow',
'RockTomb', 'SacredFire',
'SandTomb', 'SecretPower',
'SelfDestruct', 'SkyAttack',
'SpikeCannon', 'Twineedle'
]
for name in no_contact_physical:
data.pokemon.moves.stats.battle[name].category = 'Physical'
print('Physical/Special Split applied.\nThanks AGSMGMaster64!'
.end
@data.pokemon.moves.stats.battle
Copiez-coller tout ça dans un fichier .hma, "split.hma" par exemple et glissez ce dernier dans Hex Maniac Advance . lorsqu'il a fini de charger votre ROM.
Je laisse quand même mes anciens fichiers si jamais ça intéresse toujours quelqu'un, peu probable mais quand-même:
Si vous insistez pour utilisez mon système, vous devrez au préalable être capable d'insérer les icônes et modifier la routine dépendamment.
3 - Crédits
AGSMGMaster - Le nouveau script .hma.
Doesn'tKnowHowToPlay - Le Split Original.
Darthatron - Auteur de la routine et des images.
Jambo51 - Amélioration de la routine.
Si vous avez des questions , des commentaires ou des remarques que ce soit sur le Patch ou le tutoriel, faites le moi savoir.
Andy Sama - 3 avril 2023 à 05:32
Avec la venue d'Hex Maniac Advance, j'ai appris à créer des Scripts d'Automation. Ces scripts permettent en gros de vous éviter tous les changements de bytes,
les insertions de routines, les changements de pointeurs et plein d'autres fonctionnalités que je ne vais pas citer.
Vous devez d'abord télécharger Hex Maniac Advance, la release la plus récente est sur le Github si vous ne l'avez pas déjà.
Pour obtenir le script, télechargez le en utilisant ce lien .
Ouvrez votre ROM Rouge Feu FR, en bas à gauche de votre écran vous devriez voir
un label "Free Space", mettez l'offset qui vous plaît, glissez/deposez le Script
dans HMA et laissez le logiciel chercher de l'espace libre à partir de l'offset
que vous avez spécifié pour les icones et la routine ASM.
NesLeo - 24 août 2024 à 16:26
Un magistral merci pour cela ! B)