Skip to main content

Editing Moves

Author(s): MrHam88.
Implementation & Research: Aero, BlueRose, DarmaniDan, Drayano, Fexty, Lhea, Lmaokai, MapleDonut, Mixone, Paille92, RefinedPlat, Solace, TurtleIsaac, Yako?.

This page is a full guide on making changes to moves and their related data in Generation IV Pokémon games (moves, move effects, animations, learnsets, TMs, move tutors). This guide focusses on editing, re-organising and replacing existing data. There are methods to add new moves (without replacing any existing moves) to Generation IV Pokémon games, but these are significantly involved, and require moving data/tables.

The contents of the guide are proven for Platinum Version, HeartGold Version & SoulSilver Version. Many of the sections are directly applicable to Diamond Version and Pearl Version as well, but there may be differences in specific offsets when hex editing for these versions. If not stated otherwise, any hex editing offsets or files given in this page are for known good US versions of the relevant ROMs.

This guide is a collation of a number of tutorials and guides shared via other means previously (within the Kingdom of DS Hacking discord server, pastebin, GitHub etc.), with some additional content and context added. Attribution should be given to the researchers and original tutorial writers, these are noted at the beginning of the relevant sections (and collectively at the top of this section).

The contents of this guide are organised by the area of move editing, with an initial overview of data structure & some prompts/guidance on design considerations when planning move edits. The final section includes a number of case study examples to illustrate how the changes may be implemented.

The navigation bar at the top of the page, or right-hand side on PC, and the "Return to top of page" button can be used to navigate through the page in detail, below is a high-level overview of the page sections:

  1. Move (& Associated) Data Structure
  2. Design Thoughts & External Resources
  3. Basic Move Data (DSPRE)
  4. Move Effect Scripts
  5. Move Animations
  6. Move Categories (Battle Engine & AI)
  7. Move Compatibility (Distribution)
  8. Example Case Studies

A number of the sections in this guide rely upon a basic understanding of hex editing generally, and context on unpacking NARCs. An initial grounding in these subjects can be formed by reading and following these guides:


Move (& Associated) Data Structure

Every unique move (identified by move index/ID) in the game has:

  • One set of move data
  • One move script
    • Which may direct to exactly one move effect script
      • Which may contain zero or more effect sub-scripts
  • One move animation
    • Which is made up of one or more animation components

The exact mapping of how a move is executed can be found here in the Platinum Decompilation project. The specific file locations for each of these elements in HGSS can be found here, and an overview is below include HGSS & Platinum file names:

-HGSS FilePlatinum File
Move Data/a/0/1/1/poketool/waza/waza_tbl.narc
Move Scripts/a/0/0/0/battle/skill/waza_seq.narc
Move Animation/a/0/1/0/data/wazaeffect/we.narc
Continuous Animations/a/0/6/1/data/wazaeffect/we_sub.narc
Move Effect Scripts/a/0/3/0/battle/skill/be_seq.narc
Move Effect Sub-Scripts/a/0/0/1/battle/skill/sub_seq.narc
  • Move scripts are strictly per move and may not be shared. They may simply be an instruction to use the effect script, or may have more complexity.
  • Move effect scripts may be shared by multiple moves.
  • Each animation component may be used across many move animations, but each move has it's own animation definition. There are three main types of animation components/instructions (sprite translations, "particles" & backgrounds).
  • Each effect sub-script may be used across multiple move effect scripts, but a move effect script may use zero effect sub-scripts.
    • The move data NARC contains basic data on the move, which can be edited in DSPRE. This includes, for example, reference to the move effect script.
    • Move animations can be edited using a hex editor such as HxD, or by using a tool called WazaEditor.
    • Move move scripts, effect scripts & effect sub-scripts can be edited using a hex editor such as HxD.

Design Thoughts & External Resources

When considering replacing some moves in Generation IV Pokémon games, it may be useful to consider the following factors:

  1. Trainer Move Selection AI
  2. Move Variations
  3. Vanilla Move Compatibility
  4. Move Animation Options

Trainer Move Selection AI

The trainer selection AI in Generation IV Pokémon games uses a number of sources to determine which moves the opposing trainers should use. A solid understanding of how this works, related to the moves intended to change, is important to ensure changes result in the expected behaviour from opposing trainers. At least a minimal awareness is advised to ensure opponent and ally trainers use the edited moves as expected.

A thorough breakdown of the Generation IV trainer move selection AI can be found here.

Move Variations

A number of Pokémon moves have consistent similarities that can be used to categorise them into groups. When making decisions on replacing moves, either by "backporting" later generation moves, or creating entirely custom ones. It may be useful to consider these move variation groups to either maintain consistency/immersion, or to actively disregard it.

The groups referred to here are not mechanical groups/categorisations (such as Sound-based moves, or Punching moves), but design & thematic ones.

There are a number of online resources which document these groupings, for example this Bulbapedia page. Some examples of move "groups" are in the table below.

Icy Wind Low Kick Octazooka
Icy Wind, Mud Shot, Electroweb, SnarlLow Kick & Grass KnotOctazooka, Mud Bomb, Mirror Shot
Power55Variable (damage based on the target's weight)65
Accuracy95%100%85%
PP152010
CategorySpecialSpecialSpecial
RangeBothSingleSingle
Secondary Effect100% chance to reduce a stat of the opponent by one stage (Speed or Special Attack)No secondary effect30% chance to reduce the Accuracy of the opponent by one stage

Vanilla Move Compatibility

When deciding which moves to add to the game by replacing existing ones, one of the most important decisions is which move(s) to remove. There are a number of factors that could be considered when determining moves to be replaced.
Some examples are:

  • Signature moves for Pokémon that will not appear in the ROM hack. These could be for legendary Pokémon, for example Darkrai and the move Dark Void.
  • Low-distribution moves, for example Barrage, which is learned by level up, only by Exeggcute and Exeggutor.
  • Functional clones, for example Mind Reader & Lock-On have exactly the same effect (but different names, animations and learnsets).
  • How the move to be replaced is treated by the move selection AI (for example, without further changes, a move that replaces Roar will be treated by the AI Basic flag as being a Sound-based move, and not used when the opponent is known to have the ability Soundproof).

When looking to replace moves in Generation IV Pokémon games, DSPRE and some simple Excel formulae (COUNTIF) can be used to provide an understanding of the overall distribution of moves. This can be useful for identifying candidates for replacement that are narrowly distributed (only a few Pokémon learn them).

In DSPRE, the "Generate CSV" option from the Tools menu can be selected to export a number of .csv files from the currently loaded ROM. In version 1.13.1 this includes evolution, learnset, move, TM/HM, Pokémon personal data.

By taking the move data and learnset data it is possible to list the number of times each move appears in the learnset data by using a COUNTIF formula from the move data to the learnset data. Some cleanup of the learnset data may be required to remove [ and ] characters. A similar approach can be taken with TM learnsets.

An example of a basic level-up learnset count from HGSS is below. Bear in mind that this list does not account for TM/HM learnsets, egg moves or tutorable moves.

HGSS: Vanilla Move Level-Up Learnset Distribution (Reverse Ordered by Count)
Move IDMove NameLevel Up Learnset
15Cut0
57Surf0
70Strength0
165Struggle0
249Rock Smash0
285Skill Swap0
290Secret Power0
307Blast Burn0
308Hydro Cannon0
315Overheat0
338Frenzy Plant0
344Volt Tackle0
409Drain Punch0
411Focus Blast0
431Rock Climb0
432Defog0
434Draco Meteor0
446Stealth Rock0
447Grass Knot0
6Pay Day1
25Mega Kick1
41Twineedle1
148Flash1
159Sharpen1
167Triple Kick1
177Aeroblast1
190Octazooka1
208Milk Drink1
211Steel Wing1
216Return1
217Present1
218Frustration1
220Pain Split1
221Sacred Fire1
263Facade1
264Focus Punch1
295Luster Purge1
296Mist Ball1
298Teeter Dance1
333Icicle Spear1
342Poison Tail1
353Doom Desire1
391Heart Swap1
433Trick Room1
439Rock Wrecker1
448Chatter1
449Judgment1
454Attack Order1
455Defend Order1
456Heal Order1
459Roar of Time1
460Spacial Rend1
461Lunar Dance1
462Crush Grip1
463Magma Storm1
464Dark Void1
19Fly2
27Rolling Kick2
127Waterfall2
128Clamp2
134Kinesis2
135Softboiled2
140Barrage2
142Lovely Kiss2
144Transform2
155Bonemerang2
168Thief2
169Spider Web2
234Morning Sun2
265SmellingSalt2
293Camouflage2
294Tail Glow2
299Blaze Kick2
302Needle Arm2
410Vacuum Wave2
419Avalanche2
465Seed Flare2
467Shadow Force2
5Mega Punch3
26Jump Kick3
121Egg Bomb3
125Bone Club3
131Spike Cannon3
136Hi Jump Kick3
147Spore3
160Conversion3
176Conversion 23
198Bone Rush3
251Beat Up3
259Torment3
274Assist3
280Brick Break3
292Arm Thrust3
301Ice Ball3
309Meteor Mash3
323Water Spout3
339Bulk Up3
376Trump Card3
415Switcheroo3
430Flash Cannon3
457Head Smash3
130Skull Bash4
137Glare4
152Crabhammer4
158Hyper Fang4
214Sleep Talk4
215Heal Bell4
272Role Play4
289Snatch4
297FeatherDance4
306Crush Claw4
311Weather Ball4
325Shadow Punch4
327Sky Uppercut4
354Psycho Boost4
367Acupressure4
418Bullet Punch4
440Cross Poison4
2Karate Chop5
4Comet Punch5
66Submission5
81String Shot5
85Thunderbolt5
146Dizzy Punch5
151Acid Armor5
162Super Fang5
171Nightmare5
200Outrage5
223DynamicPunch5
231Iron Tail5
238Cross Chop5
257Heat Wave5
266Follow Me5
267Nature Power5
278Recycle5
288Grudge5
314Air Cutter5
357Miracle Eye5
365Pluck5
379Power Trick5
402Seed Bomb5
413Brave Bird5
421Shadow Claw5
429Mirror Shot5
438Power Whip5
443Magnet Bomb5
451Charge Beam5
452Wood Hammer5
13Razor Wind6
102Mimic6
143Sky Attack6
161Tri Attack6
183Mach Punch6
233Vital Throw6
245ExtremeSpeed6
261Will-O-Wisp6
277Magic Coat6
284Eruption6
320GrassWhistle6
348Leaf Blade6
356Gravity6
368Metal Burst6
384Power Swap6
385Guard Swap6
412Energy Ball6
416Giga Impact6
427Psycho Cut6
8Ice Punch7
12Guillotine7
32Horn Drill7
92Toxic7
118Metronome7
124Sludge7
187Belly Drum7
260Flatter7
303Slack Off7
317Rock Tomb7
395Force Palm7
407Dragon Rush7
441Gunk Shot7
11ViceGrip8
65Drill Peck8
80Petal Dance8
96Meditate8
112Barrier8
178Cotton Spore8
188Sludge Bomb8
191Spikes8
224Megahorn8
236Moonlight8
273Wish8
312Aromatherapy8
321Tickle8
330Muddy Water8
331Bullet Seed8
366Tailwind8
386Punishment8
394Flare Blitz8
396Aura Sphere8
20Bind9
69Seismic Toss9
119Mirror Move9
164Substitute9
170Mind Reader9
172Flame Wheel9
291Dive9
313Fake Tears9
335Block9
343Covet9
351Shock Wave9
369U-turn9
377Heal Block9
380Gastro Acid9
397Rock Polish9
406Dragon Pulse9
458Double Hit9
22Vine Whip10
24Double Kick10
30Horn Attack10
42Pin Missile10
58Ice Beam10
90Fissure10
91Dig10
107Minimize10
126Fire Blast10
138Dream Eater10
149Psywave10
166Sketch10
173Snore10
179Reversal10
206False Swipe10
243Mirror Coat10
247Shadow Ball10
258Hail10
304Hyper Voice10
305Poison Fang10
318Silver Wind10
322Cosmic Power10
329Sheer Cold10
332Aerial Ace10
349Dragon Dance10
453Aqua Jet10
9ThunderPunch11
82Dragon Rage11
195Perish Song11
222Magnitude11
237Hidden Power11
276Superpower11
286Imprison11
359Hammer Arm11
373Embargo11
375Psycho Shift11
382Me First11
399Dark Pulse11
442Iron Head11
7Fire Punch12
49SonicBoom12
51Acid12
67Low Kick12
68Counter12
120Selfdestruct12
139Poison Gas12
157Rock Slide12
180Spite12
186Sweet Kiss12
199Lock-On12
262Memento12
271Trick12
337Dragon Claw12
361Healing Wish12
393Magnet Rise12
420Ice Shard12
62Aurora Beam13
123Smog13
192Zap Cannon13
213Attract13
275Ingrain13
279Revenge13
287Refresh13
341Mud Shot13
350Rock Blast13
358Wake-Up Slap13
390Toxic Spikes13
404X-Scissor13
405Bug Buzz13
425Shadow Sneak13
76SolarBeam14
87Thunder14
115Reflect14
194Destiny Bond14
225DragonBreath14
239Twister14
241Sunny Day14
244Psych Up14
252Fake Out14
255Spit Up14
256Swallow14
328Sand Tomb14
336Howl14
347Calm Mind14
370Close Combat14
381Lucky Chant14
383Copycat14
437Leaf Storm14
3DoubleSlap15
88Rock Throw15
114Haze15
117Bide15
141Leech Life15
150Splash15
196Icy Wind15
210Fury Cutter15
212Mean Look15
229Rapid Spin15
254Stockpile15
319Metal Sound15
326Extrasensory15
355Roost15
388Worry Seed15
436Lava Plume15
444Stone Edge15
14Swords Dance16
18Whirlwind16
59Blizzard16
100Teleport16
110Withdraw16
122Lick16
197Detect16
202Giga Drain16
250Whirlpool16
324Signal Beam16
340Bounce16
374Fling16
398Poison Jab16
408Power Gem16
466Ominous Wind16
37Thrash17
47Sing17
79Sleep Powder17
132Constrict17
209Spark17
181Powder Snow18
360Gyro Ball18
378Wring Out18
83Fire Spin19
101Night Shade19
283Endeavor19
316Odor Sleuth19
362Brine19
387Last Resort19
450Bug Bite19
203Endure20
232Metal Claw20
235Synthesis20
345Magical Leaf20
392Aqua Ring20
35Wrap21
414Earth Power21
422Thunder Fang21
426Mud Bomb21
53Flamethrower22
113Light Screen22
153Explosion22
201Sandstorm22
268Charge22
372Assurance22
401Aqua Tail22
16Gust23
46Roar23
54Mist23
400Night Slash23
23Stomp24
34Body Slam24
99Rage24
108SmokeScreen24
174Curse24
269Taunt24
334Iron Defense24
346Water Sport24
403Air Slash24
417Nasty Plot24
424Fire Fang24
445Captivate24
17Wing Attack25
50Disable25
72Mega Drain25
73Leech Seed25
75Razor Leaf25
78Stun Spore25
105Recover25
226Baton Pass25
227Encore25
281Yawn25
282Knock Off25
363Natural Gift25
371Payback25
423Ice Fang25
21Slam26
193Foresight26
253Uproar26
270Helping Hand26
364Feint26
63Hyper Beam27
77PoisonPowder27
84ThunderShock27
175Flail27
204Charm27
240Rain Dance27
31Fury Attack28
74Growth28
89Earthquake28
189Mud-Slap28
230Sweet Scent28
1Pound29
40Poison Sting29
71Absorb29
95Hypnosis29
145Bubble29
205Rollout29
248Future Sight29
389Sucker Punch29
64Peck30
129Swift30
207Swagger30
300Mud Sport30
60Psybeam31
86Thunder Wave32
435Discharge32
61BubbleBeam33
104Double Team34
156Rest34
111Defense Curl35
352Water Pulse35
133Amnesia36
154Fury Swipes36
29Headbutt37
219Safeguard38
428Zen Headbutt38
182Protect39
228Pursuit40
94Psychic42
48Supersonic44
56Hydro Pump44
109Confuse Ray44
185Faint Attack44
38Double-Edge45
52Ember46
246AncientPower47
163Slash51
106Harden52
116Focus Energy52
310Astonish52
184Scary Face53
242Crunch53
10Scratch54
28Sand-Attack58
39Tail Whip60
93Confusion61
36Take Down67
55Water Gun67
103Screech68
97Agility69
44Bite75
98Quick Attack82
45Growl107
43Leer113
33Tackle146

Move Animation Options

There are a large number of animation components in the game, that are often used in conjunction with each other to create the overall move animations. There are some resources available to view/inspect the vanilla animations to get ideas for how to take elements of them and build custom animations. A later section (Move Animations) of the page will deal with editing animations specifically, but these resources can help with viewing vanilla animations in action without having to test individually in-game.


Basic Move Data (DSPRE)

The majority of the basic move data can be edited using DSPRE's "Move Data Editor", while the remainder is edited via Text Archives.

  1. Move Name / Index (changed via Text Archives)
  2. Type, Category, Power, Accuracy, PP (changed via Move Data Editor)
  3. Move Effect Selection (changed via Move Data Editor)
  4. Range (changed via Move Data Editor)
  5. Other Flags (changed via Move Data Editor)

Move Name, Description & Battle Texts

Move names and descriptions are present in a number of Text Archives accessible via the Text Editor in DSPRE:

  • Move Names, as they appear in:
    • Move selection in battle
    • Pokémon summary screen
    • Scripted word/phrase selection (e.g. the Primo phrase selection script in HGSS)
    • Battle texts (e.g. "x" used "y" move)
  • Move Descriptions, as they appear in:
    • Pokémon summary screen
    • TM item description (as approporiate)

The following are the relevant Text Archives for US versions of the Generation IV Pokémon games. The search function in DSPRE can be used to easily locate the right messages (and archives in other versions of the games).

HeartGold/SoulSilverPlatinumDiamond/Pearl
Move Names (Move Selection & Pokémon Summary)750647588
Move Names (Battle Texts)003000000
Move Names (Scripted Word Selection)751648589
Move Descriptions (Pokémon Summary)749646587
Move Descriptions (TM Item Description)221391343
Supplementary Battle Texts197368324

Type, Category, Power, Accuracy, PP

The majority of attributes of moves are adjusted in this section of the Move Data Editor in DSPRE. Many are self explanatory: Type, Power, Accuracy, PP. Below is a summary of some of the less intuitive attributes:

AttributePossible ValuesDescription
TypeNORMAL FIRE GRASS ... etc.The type of a move: the 18 types in Generation IV includes ??? but not Fairy
SplitPHYSICAL SPECIAL STATUSThe difference between physical damaging moves, special damaging moves & status moves that do not inflicy direct damage
Contest ConditionCOOL BEAUTIFUL CUTE SMART TOUGHThe five categories of competitions, moves and condition in "Super Contests" in Diamond, Pearl or Platinum.
Priority-32 to +32The priority stage of a move, where a higher number indicates a move to be executed earlier. Vanilla Generation IV moves range from -7 to +5.
Effect Sequence000 - ... to 470 - ...A numeric value that determines the more complex effects of the move beyond basic data (such as secondary effects, damage modifiers, more details in the Move Effect Scripts section below).
PP0 to 100The base number of Power Points, i.e. the amount of times the move can be executed before PP is restored.
Contest Appeal0 to 255A numeric value the determines the behaviour of the move in a "Super Contest" in Diamond, Pearl or Platinum. Index to Effect mapping in the table below.
Side Effect Probability0 to 255The probability in % of a secondary effect triggering, for example a stat boost or fall as a secondary effect to a damage-dealing move.
Power0 to 255The base power of a damage-dealing move.
Accuracy0 to 100The accuracy in % of a move. A value of 0 is infinite accuracy, i.e. the move never misses.
DPPt: Super Contests Appeal Effects
IndexEffectAppeal Hearts
1Enables the user to perform first in the next turn.2
2Enables the user to perform last in the next turn.2
4Earn +2 if the Judge's Voltage goes up.2
5A basic performance using a move known by the Pokémon.3
6Earn +3 if no other Pokémon has chosen the same Judge.1
7Allows performance of the same move twice in a row.2
8Increased Voltage is added to the performance score.0
9Earn +15 if all the Pokémon choose the same Judge.0
10Lowers the Voltage of all Judges by 1.2
11Earn double the score in the next turn.0
12Steals the Voltage of the Pokémon that just went.0
13Prevents the Voltage from going up in the same turn.2
14Makes the order of contestants random in the next turn.2
15Earns double the score on the final performance.2
16Raises the score if the Voltage is low.0
17Earn +2 if the Pokémon performs first in the turn.2
18Earn +2 if the Pokémon performs last in the turn.2
19Prevents the Voltage from going down in the same turn.2
20Earn +3 if two Pokémon raise the Voltage in a row.1
21Earn a higher score the later the Pokémon performs.0
22Earn +3 if the Pokémon that just went hit max Voltage.2
23Earn +3 if the Pokémon gets the lowest score.1

Range

One or less range flags should be set per move. Most moves have no flag, or "normal" range: where the move may affect any target adjacent to the user. Some moves do not target an opponent, self or ally, such as weather-setting moves which target one or both sides of the "field".

The below table explains the use of each range flag.

Range FlagMeaningExample Moves
-Opponent or Ally: May target one adjacent opponent or ally.Tackle, Magical Leaf, Psych Up
BOTHAll Opponents: Affects all adjacent opponents, but not allies.Tail Whip, Razor Leaf, Bubble
FOES_AND_ALLYAll Others: Affects all adjacent opponents and allies.Surf, Earthquake, Teeter Dance
USERUser: Affects the user.Swords Dance, Bide, Howl
USER_SIDEUser Side: Affects the user's side of the field.Mist, Light Screen, Tailwind
ACTIVE_FIELDAll Sides: Affects the user's and opponent's sides of the field.Haze, Sandstorm, Gravity
OPPONENTS_FIELDOpponent Side: Affects the opponent's side of the field.Spikes, Toxic Spikes, Stealth Rock
ALLYOne Ally: May target one adjacent ally.Helping Hand
ACUPRESSUREUser or Ally: May target the user or one adjacent ally.Acupressure
ME_FIRSTOne Opponent: May target any one adjacent opponent, but not allies.Me First
RANDOMOne Random Opponent: Affects a random opponent.Thrash, Petal Dance, Uproar
VARIABLEVaries: Variable based on move effect.Magic Coat, Counter, Sleep Talk

Other Flags

None or many flags may be set in this section, which help determine specific interactions & behaviours.

The below table explains the use of each flag.

FlagMeaningExample Moves
CONTACTThe move makes contact with the opponent, so may trigger contact-based abilities such as Static.Fire Punch, Steel Wing
PROTECTThe move can be blocked if the target has used a Protecting move, such as Protect or Detect.Pursuit, X-Scissor
MAGIC_COATThe detrimental status move is eligible for being "reflected" by an opponent using the move Magic Coat on the same turn.Leech Seed, Spikes
SNATCHThe beneficial status move is eligible for being "stolen" by an ally or opponent using the move Snatch on the same turn.Dragon Dance, Mist
MIRROR_MOVEThe damage-dealing move is eligible to be copied by Mirror Move.Frenzy Plant, Mud-Slap
KINGSROCKIf the user of the damage-dealing move is holding a King's Rock, and the move does not already have a chance to flinch secondary effect, the move gains a secondary effect of a 10% chance to flinch the target. This special-case chance to flinch is not increased by the user having the Serene Grace ability in vanilla Generation IV.Aura Sphere, Gunk Shot
KEEP_HP_BARA move animation flag, where the HP remains rendered on-screen during the move animation if the flag is set.Double Kick, Icicle Spear
DEL_SHADOWA move animation flag, where the Pokémon's shadow is removed during the move animation if the flag is set.Wish, Doom Desire

Move Effect Scripts

Source(s): Drayano, Lhea & Yako?

The most basic move effect script (sometimes referred to as "effect sequences", e.g. in DSPRE's Move Editor), is script 000 (used, for example by the move Tackle), which simply applies the most basic damaging logic:

  1. Determine whether the move is a Critical Hit.
  2. Calculate the damage the move will inflict.

In hex, this simple damage-dealing script in HGSS looks like this: 26 00 00 00 0F 00 00 00 E0 00 00 00

  • 26 00 00 00 - Critical hit determination,
  • 0F 00 00 00 - Damage calculation,
  • E0 00 00 00 - Ends the script. Note this command is different in Platinum (DE 00 00 00) & Diamond/Pearl (DA 00 00 00).

More complex damaging moves include this basic functionality at the end of their move effect script, but also include more logic, possibly including reference to one or more move effect sub-scripts, for example to apply guaranteed or chances of stat changes to the user or target.

Status moves which increase or decrease a single stat by one or two stages, usually call a specific move effect sub-script with and a parameter for the stat/no. of stages, including which of the list of possible side effects effects to apply.

In hex a common status-only stat-stage asjusting move effect script in HGSS looks like this:

32 00 00 00 07 00 00 00 AA AA AA AA ## ## ## ## E0 00 00 00

Where:

  • ## ## ## ## is a value that corresponds to the table of side effects linked above.
  • AA AA AA AA is 02 00 00 00, indicating that this is a "primary" effect.
  • E0 00 00 00 - Ends the script (see above version note).

In hex a common damaging move with a chance (which might be 100%) to adjust stat-stages in HGSS looks like this:

26 00 00 00 0F 00 00 00 32 00 00 00 07 00 00 00 AA AA AA AA ## ## ## ## E0 00 00 00

Where:

  • ## ## ## ## is a value that corresponds to the table of side effects linked above.
  • AA AA AA AA is 03 00 00 00, indicating that this is a "secondary" effect.
  • E0 00 00 00 - Ends the script (see above version note).

Primary effects will occur 100% of the time. Secondary effects occur after Primary effects, and are subject to the "Side Effect Probability" percentage value. Although they are not mixed in the Vanilla Generation IV games. It is possible to create a move effect script which includes a primary and secondary stat-stage adjustment.

Status moves which change multiple stats (e.g. Calm Mind) use different effect sub-scripts.

"Broken" Move Effect Scripts

Source(s): Yako?

Because they are not used in the vanilla Generation IV Pokémon games, there are a number of move effect scripts which do not actually call/use the common "side effects" effect sub-script and the reference to the right parameters. These move effect scripts are named in DSPRE as the intended use, but if they are to be used, they require hex edits.

The process to fix these move effect scripts is relatively straightforward, involving copying the move effect script of a similar fuinctional move and substituting in the correct parameters (table entries). For example, move effect script 012 is intended to increase the user's Speed stat by one stage, a side effect that does not occur in the vanilla Generation IV games (in isolation).

  • As with the others, move effect script 012 currently contains only the basic move effects (to determine critical hits and calculate damage). In hex this appears as: 26 00 00 00 0F 00 00 00 E0 00 00 00
  • Replacing it with the below will set the effect script to raise the user's Speed stat by one stage (in line with the DSPRE description): 32 00 00 00 07 00 00 00 02 00 00 00 11 00 00 40 E0 00 00 00
  • The 11 00 00 40 parameter section can be determined by looking into a similar sub script. For example, the increase Speed by one stage entry in the table is row 24, row 23 increase defence by one stage. This is a vanilla-used side effect (for example the move Harden). The move effect script 011 can be found and viewed in a hex editor, which is: 32 00 00 00 07 00 00 00 02 00 00 00 10 00 00 40 E0 00 00 00
  • From which the parameter value can be incremented by one from 10 00 00 40 to 11 00 00 40.

The element that is replaced is formed of two parts, the first two bytes are the effect, the last two bytes are the target (00 40 for the user, 00 80 for the target). The effects of the first two bytes are listed in the table below:

The content of the final byte (denoted by ## in the table) is different for the user or the target:

UserTarget
00 4000 80
Hex Elements Identifying Stat Changes
StatHex (+1)Hex (+2)Hex (-1)Hex (-2)
Attack0F 00 00 ##27 00 00 ##16 00 00 ##2E 00 00 ##
Defense10 00 00 ##28 00 00 ##17 00 00 ##2F 00 00 ##
Speed11 00 00 ##29 00 00 ##18 00 00 ##30 00 00 ##
Special Attack12 00 00 ##2A 00 00 ##19 00 00 ##31 00 00 ##
Special Defense13 00 00 ##2B 00 00 ##1A 00 00 ##32 00 00 ##
Accuracy14 00 00 ##2C 00 00 ##1B 00 00 ##33 00 00 ##
Evasion15 00 00 ##2D 00 00 ##1C 00 00 ##34 00 00 ##

The below table lists the non-implemented move effect scripts, which can be fixed by replacing their contents with the given hex. The content of the final four bytes (denoted by ## ## ## ## in the table) is different in:

HeartGold/SoulSilverPlatinumDiamond/Pearl
E0 00 00 00DE 00 00 00DA 00 00 00
Corrections for "non-implemented" but named in DSPRE move effect scripts
Effect Script IDEffectRequired Hex
12Increase user's Speed stat by one stage32 00 00 00 07 00 00 00 02 00 00 00 11 00 00 40 ## ## ## ##
14Increase user's Special Defence stat by one stage (non-damaging).32 00 00 00 07 00 00 00 02 00 00 00 13 00 00 40 ## ## ## ##
15Increase user's Accuracy stat by one stage (non-damaging).32 00 00 00 07 00 00 00 02 00 00 00 14 00 00 40 ## ## ## ##
21Reduce the target's Special Attack stat by one stage (non-damaging).32 00 00 00 07 00 00 00 02 00 00 00 19 00 00 80 ## ## ## ##
22Reduce the target's Special Defence stat by one stage (non-damaging).32 00 00 00 07 00 00 00 02 00 00 00 1A 00 00 80 ## ## ## ##
55Increase user's Accuracy stat by two stages (non-damaging).32 00 00 00 07 00 00 00 02 00 00 00 2C 00 00 40 ## ## ## ##
56Increase user's Evasion stat by two stages (non-damaging).32 00 00 00 07 00 00 00 02 00 00 00 2D 00 00 40 ## ## ## ##
61Reduce the target's Special Attack stat by two stages (non-damaging).32 00 00 00 07 00 00 00 02 00 00 00 31 00 00 80 ## ## ## ##
63Reduce the target's Accuracy stat by two stages (non-damaging).32 00 00 00 07 00 00 00 02 00 00 00 33 00 00 80 ## ## ## ##
64Reduce the target's Evasion stat by two stages (non-damaging).32 00 00 00 07 00 00 00 02 00 00 00 34 00 00 80 ## ## ## ##
74Reduce the target's Evasion stat by one stage (damaging side-effect).26 00 00 00 0F 00 00 00 32 00 00 00 07 00 00 00 03 00 00 00 1C 00 00 80 ## ## ## ##

To replace the values for any one or more move effect scripts:

  1. Unpack the move effect NARC (using the DSPRE "Unpack NARC to Folder" function).
    • HGSS: /a/0/3/0
    • Platinum: be_seq.narc
  2. Open the relevant move effect using a hex editor (such as HxD).
  3. Replace the entire contents of the file with the new hex string (see above table for some examples).
  4. Save the file.
  5. Move the backup file created by the hex editor to another location (this may be named ###.bak for example). This is very important, if not done there will be issues with all move effect scripts after the modified one.
  6. Re-pack the move effect NARC (using the DSPRE "Build NARC from folder" function).
    • For HGSS, the NARC will be created with the .narc suffix, that should be removed.
  7. Open the ROM in DSPRE (from the extracted contents folder, not the ROM), and save the ROM.

Unused Move Effect Scripts

There are a number of move effect scripts that appear to have no intended use, and are not named in DSPRE. There are a number of unused move effect sub-scripts (for example a damaging side-effect reduction of the target's Special Attack), which may have at one point been intended to fill these gaps.

It is also possible to use these unused move effect scripts to implement unused combinations such as these. The below are the list of undocumented (unused) move effect scripts which only contain the standard damaging critical hit determination and damage calculation (or don't exist).

  • 96
  • 110
  • 131
  • 133
  • 134
  • 141
  • 157
  • 163
  • 277 - 470

Move Effect Script 264 is identified as "Undocumented" in DSPRE, but has unique code.
The safest scripts to use are the latter range of 277-470. These data aren't just the standard critical hit and damage calculation (and could be used for some unknown or unclear purpose), they just do not exist.

Backporting Stat-Changing Moves

Source(s): Drayano

A tutorial written by Drayano, details how to utilise the move effect sub-scripts already in the game, and abuse the potential of using primary and secondary effects in a single move effect script, to detail how stat-changing status moves that do not exist in-game (such as Coil) can be created.

Because this method uses only the existing sub-scripts, the appearance is not as clean (for example, a Coil approximation would raise Attack & Defense as a primary effect, and Accuracy as a secondary effect, resulting in two stat-increase animations).

It is possible to add new sub-scripts to accomodate more complex stat changes (or change existing sub-scripts to this end), as there is space in the sub-scripts file for this, however, it also requires addition to the specific "side-effects" mapping table. This is in overlay_0012 (four bytes for each subscript at offsets: 0x3550C to 0x3574c listing which sub-script is given which ID to be called/used in effect scripts), and there is no space for additional entries here, so would require re-pointing the table if desired.

Creating sub-scripts which handle different combinations of two or more 1- or 2-stage stat changes, is achievable by using sub-scripts for moves such as Calm Mind, Dragon Dance and Curse (non-Ghost) as a base, by reviewing the unpacked NARC, decompilation projects and reverse engineering tools (such as Ghidra). This more complicated method is beyond the scope of this guide, but an example of what can be achieved is included in the Case Studies section (Quiver Dance).


Move Animations

Source(s): Acent, DavveDP, Fexty

Move animations can be edited in a number of ways (not including using decompilation projects or HG-Engine), primarily:

  1. Direct hex editing of the relevant data,
  2. A tool called WazaEffectEditor (often shortened to WazaEditor) that has a UI.

For the purposes of this guide it is assumed that WazaEffectEditor will be used to edit animations. WazaEffectEditor was initially designed for Pokémon Platinum Version by Acent, and a modified variation is available for HGSS (modified by DavveDP) as well (not, it is unclear if this variation is functionally complete as it appears to be in a work in progress state on the developer's GitHub repository). The different versions can be found here:

There are a number of other resources which may be useful in move animation editing:

Running WazaEffectEditor

The first time that WazaEffectEditor is opened a message about downloading libraries/moves from Bulbapedia may be presented, this should be accepted. This may then result in a hanging state after a few minutes. If this is the case, closing and re-opening the application should resolve and allow use of the tool.

WazaEffectEditor works on the same premise as tools like DSPRE, i.e. the user selects a ROM (.nds file), and the tool unpacks this (using the ROM's move names and animations). When saving, the ROM is re-packed and saved (with the option to override the existing ROM file, or rename). It is important to be aware of this if edits are being done across multiple tools, as WazaEffectEditor (HGSS) doesn't interact (for example), with the unpacked contents folder that DSPRE creates.

Review & Interpret Vanilla Animations

Pound Solar Beam Hydro Pump

Animations can be viewed in hex by unpacking the relevant NARC (see here for NARC details), or by viewing in WazaEffectEditor. Once opened, having the translation of the animation commands can be invaluable in interpreting what is happening. Only some commands are named in WazaEffectEditor, whereas almost all have been named by Fexty.

Lots of animations have common components, and some similar animations have similar patterns (such as charging or recharge moves having different animations on the first and second turn).

There are three main types of animation components/instructions:

  1. Sprite translations - where the user or target Pokemon sprite is rotated, scaled or translated (moved).
  2. "Particles" - where new visual elements are added "on top" of the view in battle.
    • "Particles" translations.
  3. Backgrounds - where the current background is replaced with a unique colour/design background.
  4. Sound Effects - where custom or situational sounds are played.

A simple animation (Pound) is shown below in three different formats, to illustrate how interpreting an animation can be done. Line-breaks have been inserted into the hex representation to illustrate the mapping between the different formats:

Pound (Hex)
38 00 00 00
39 00 00 00 00 00 00 00
39 00 00 00 01 00 00 00
39 00 00 00 02 00 00 00
39 00 00 00 03 00 00 00
3A 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3A 00 00 00 05 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00
3A 00 00 00 06 00 00 00 00 00 00 00 02 00 00 00 02 00 00 00
3A 00 00 00 07 00 00 00 00 00 00 00 03 00 00 00 03 00 00 00
2D 00 00 00 4E 00 00 00 01 00 00 00 00 00 00 00
33 00 00 00 00 00 00 00 20 00 00 00 01 00 00 00
3B 00 00 00
3C 00 00 00 00 00 00 00
3C 00 00 00 01 00 00 00
3C 00 00 00 02 00 00 00
3C 00 00 00 03 00 00 00
2E 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00
2E 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00
2D 00 00 00 24 00 00 00 05 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 02 00 00 00 08 01 00 00
16 00 00 00 23 07 00 00 75 00 00 00
32 00 00 00
35 00 00 00 00 00 00 00
04 00 00 00
Pound (WazaEffectEditor)
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x20 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
LoadAnim 0x0 0x1 0x4
LoadAnim 0x0 0x0 0x4
ApplyCmd 0x24 0x5 0x1 0x0 0x1 0x2 0x108
PlaySound 0x723 0x75
WaitAnim
Cmd_35 0x0
End
Pound (WazaEffectEditor with Fexty Command Names)
BattleAnimScriptCmd_InitPokemonSpriteManager
BattleAnimScriptCmd_LoadPokemonSpriteDummyResources 0x0
BattleAnimScriptCmd_LoadPokemonSpriteDummyResources 0x1
BattleAnimScriptCmd_LoadPokemonSpriteDummyResources 0x2
BattleAnimScriptCmd_LoadPokemonSpriteDummyResources 0x3
BattleAnimScriptCmd_AddPokemonSprite 0x4 0x0 0x0 0x0
BattleAnimScriptCmd_AddPokemonSprite 0x5 0x0 0x1 0x1
BattleAnimScriptCmd_AddPokemonSprite 0x6 0x0 0x2 0x2
BattleAnimScriptCmd_AddPokemonSprite 0x7 0x0 0x3 0x3
BattleAnimScriptCmd_CallFunc 0x4e 0x1 0x0
BattleAnimScriptCmd_LoadParticleSystem 0x0 0x20 0x1
BattleAnimScriptCmd_FreePokemonSpriteManager
BattleAnimScriptCmd_RemovePokemonSprite 0x0
BattleAnimScriptCmd_RemovePokemonSprite 0x1
BattleAnimScriptCmd_RemovePokemonSprite 0x2
BattleAnimScriptCmd_RemovePokemonSprite 0x3
BattleAnimScriptCmd_CreateEmitter 0x0 0x1 0x4
BattleAnimScriptCmd_CreateEmitter 0x0 0x0 0x4
BattleAnimScriptCmd_CallFunc 0x24 0x5 0x1 0x0 0x1 0x2 0x108
BattleAnimScriptCmd_PlayPannedSoundEffect 0x723 0x75
BattleAnimScriptCmd_WaitForAllEmitters
BattleAnimScriptCmd_UnloadParticleSystem 0x0
BattleAnimScriptCmd_End

With nothing more than these resources, and a basic understanding of what happens (and can happen) in a Pokemon battle generally, and with the specific move, we can infer a few things from Pound (many are applicable to other moves).

The move animation goes through some decipherable steps (with some obscured detail):

  1. Initialise the animation system,
  2. Load resources and specific sprites,
  3. Call some specific functions
  4. Load the animation system
  5. Remove sprites
  6. Load the specific "emitter" animations required (in this case concurrently)
  7. Call some specific functions
  8. Play a sound effect
  9. Wait for the animations to end
  10. Unload the animation system
  11. End

Various other things can be inferred:

  • The animation system must be loaded and unloaded before and after the animations play.
  • When animations/particle emitters are initiated, there will be a wait function to ensure the animation finishes.
  • Each unique "Particle System" (second parameter of the SetPlayAnim or LoadParticleSystem command), has a number of actual particle animations within it, played using the LoadAnim or CreateEmitter command.

To learn more, more complex move animations can be reviewed:

  • Such as two-turn moves like Solarbeam, where an initialisation and two sets of animations can be seen, managed with the command:
    • ov12_02220F30 (CheckTurn).
  • A move that includes a background being generated as well as "particle" animations, e.g. Hydro Pump, which uses the commands:
    • BattleAnimScriptCmd_SwitchBg (ChangeBackG),
    • BattleAnimScriptCmd_WaitForBgSwitch (WaitBack2) &
    • BattleAnimScriptCmd_RestoreBg (BackBackG).

Replace one Animation for another

A wholesale replacement of one animation with another is straightforward. Either a hex editor or WazaEffectEditor could be used to copy the entire animation and paste it into the animation file for another move.
Since WazaEffectEditor directly interacts with the ROM (.nds file), changes can be made in its user interface and saved, and be applied to the ROM.
If editing the Move Animations NARC in a hex editor such as HxD:

  1. The NARC must be unpacked,
  2. The file(s) edited in the hex editor,
  3. Backup (e.g. .bak) files moved out of the folder,
  4. The NARC must be packed,
  5. The ROM re-built using the NARC (e.g. using DSPRE), &
  6. The ROM saved as a .nds file.

Some elements of the animation are dependant upon the move effects. For example, if a single-turn move is given the vanilla animation of a two-turn move, only the first turn's animation will play, without further edits.

Edit Animation Elements

Editing individual elements of a move animation is straightforward with the above understanding, but may require some trial and testing to get the desired result. Often the basis for these changes is to identify the elements to change, and identify any existing moves that use the same patterns.

Changes such as the below are all relatively simple:

  • Add/remove/change particle animations from existing options
  • Add/remove/change background animations from existing options
  • Add/remove/change sound effects from existing options
  • Change a one-turn animation into a two-turn animation
  • Change a two-turn animation into a one-turn animation

Move Categories (Battle Engine & AI)

There are a number of mechanical categories of moves in the Pokémon games, these categories have some kind of interaction with certain Abilities and/or items, and are typically offensive or defensive. Some of these categories were introduced afterGeneration IV. This section provides an overview of the mechanical move categories already present in Generation IV, and how to edit the specific moves considered to be within these categories, while also ensuring that the Trainer AI comprehends the changes.

The table below is a list of mechanical categories which interact with Abilities or Items, including which generation they were introduced in. The following sections further detail the categories natively available in Generation IV.

Move CategoryRelated AbilitiesRelated ItemsGeneration Introduced
ExplosiveDampGeneration III
Sound-basedSoundproofThroat SprayGeneration IV
(Throat Spray added in Generation VIII)
PunchingIron FistPunching GloveGeneration IV
(Punching Glove added in Generation IX)
Bomb & BallBulletproofGeneration VI
Aura & PulseMega LauncherGeneration VI
BitingStrong JawGeneration VI
DancingDancerGeneration VI
Powder & SporeOvercoatSafety GogglesGeneration VI
SlicingSharpnessGeneration IX
WindWind Rider, Wind PowerGeneration IX
Trapping (Binding) MovesGrip Claw, Binding BandGeneration I
(Binding Band added in Generation V)
Multi-strike Moves (Variable)Skill LinkGeneration I
(Skill Link added in Generation IV)
One-Hit Knock Out (OHKO)No GuardGeneration I
(No Guard added in Generation IV)

Sound-based Moves

Since this mechanic is one that the trainer AI is aware of, any changes must be completed in two places:

  1. Enabling the Ability-based effect,
  2. Ensuring the trainer AI is aware of the change.

Twelve moves are classed as sound-based in the Generation IV Pokémon games, listed in the table below.

Sound-based Moves
Move ID (Decimal)Move ID (Hex)Move Name
452D 00Growl
462E 00Roar
472F 00Sing
4830 00Supersonic
10367 00Screech
173AD 00Snore
253FD 00Uproar
30430 01Hyper Voice
3193F 01Metal Sound
32040 01Grass Whistle
40595 01Bug Buzz
448C0 01Chatter

Sound-based Battle Effect (Ability Inclusion)

Source(s): Yako? (2025)

In order to change the moves that are impacted by the Soundproof ability mechanically the table of sound-based moves can be edited.

  • If the changes are replacements (e.g. remove move ID 405 Bug Buzz from the list, and add move ID 49 Sonic Boom), then simply changing the existing move ID is sufficient.
  • If the change involves only removing entries from this list, the bytes can be deleted, the same number of zero bytes added to the end of the list, and the expected length of the table updated.
  • If up to 4 (HGSS) / 14 (Platinum) / 2 (Diamond/Pearl) additional moves are to be added to the group, the empty bytes at the end of the list can be edited to include the new entries, and the expected length of the table updated.
  • If more than 4 (HGSS) / 14 (Platinum) / 2 (Diamond/Pearl) additional moves are to be added to the group, the table must be re-pointed, and the expected length of the table updated. This is considered beyond the scope of this guide, but the details here could be used to achieve this.

The changes must be made in a decompressed overlay.

Game VersionOverlayOffset (Move Table)Offset (Table Length)Offset (Table Pointer)
HeartGold/SoulSilverOverlay_00120x373600x1B7180x1B7A4
PlatinumOverlay_00160x35A4C0x1B1180x1B1A4
Diamond/PearlOverlay_00110x329C40x19F680x19FF4

The length and contents of the move table in the vanilla Generation IV Pokémon games varies between versions. In each there is some space for additional entries, each possible space represented by a set of 00 00.

  • HGSS: 2D 00 2E 00 2F 00 30 00 67 00 AD 00 FD 00 3F 01 40 01 30 01 95 01 C0 01 00 00 00 00 00 00 00 00
  • Platinum: 2D 00 2E 00 2F 00 30 00 67 00 AD 00 FD 00 3F 01 40 01 30 01 95 01 C0 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  • Diamond/Pearl: 2D 00 2E 00 2F 00 30 00 67 00 AD 00 FD 00 3F 01 40 01 30 01 95 01 C0 01 00 00 00 00

And the expected length of the table is 0C (12). This could be updated to a smaller or larger number depending on the desired number of sound-based moves (e.g. a value of 10 could be used for a total number of moves of 16, that is four additional ones).

Trainer Move Selection AI Soundproof Inclusion (BASIC Flag)

Source(s): Lhea & Yako? (2025)

This section of the guide ensures that any NPC trainers in the game which have the BASIC AI flag enabled (see this link for a breakdown of the Generation IV trainer move selection AI). Without this change, the AI could know that the target has the Soundproof ability and still select a move that has no effect on the target.

The AI only gains "knowledge" of the target's ability (in terms of immunity abilities like this) after either:

  1. It is triggered once in battle, or
  2. If the species can only have that ability.

The changes must be made in a decompressed overlay.

Game VersionOverlayOffset
HeartGold/SoulSilverOverlay_00100x4EA8
PlatinumOverlay_00140x4EA0
Diamond/PearlOverlay_00160x1DB70

This table is identical in all five Generation IV Pokémon games.

  • If only editing the moves in the table is required (no change to the overall quantity), the contents of this table can be searched for the relevant Move IDs to replace as needed.
  • If the total number of moves in the table will change (increase or decrease), the below change should be implemented by replacing the existing hex block with the new hex block.
Soundproof AI Awareness Table (Vanilla)
21 00 00 00 17 00 00 00 2D 00 00 00 4F 09 00 00 17 00 00 00 2E 00 00 00 4C 09 00 00 17 00 00 00 2F 00 00 00 49 09 00 00 17 00 00 00 30 00 00 00 46 09 00 00 17 00 00 00 67 00 00 00 43 09 00 00 17 00 00 00 AD 00 00 00 40 09 00 00 17 00 00 00 FD 00 00 00 3D 09 00 00 17 00 00 00 3F 01 00 00 3A 09 00 00 17 00 00 00 40 01 00 00 37 09 00 00 17 00 00 00 95 01 00 00 34 09 00 00 17 00 00 00 C0 01 00 00 31 09 00 00
Soundproof AI Awareness Table (Custom)
21 00 00 00 27 00 00 00 19 00 00 00 02 00 00 00 4E 09 00 00 4C 00 00 00 1B 00 00 00 2D 00 00 00 2E 00 00 00 2F 00 00 00 30 00 00 00 67 00 00 00 AD 00 00 00 FD 00 00 00 3F 01 00 00 40 01 00 00 95 01 00 00 C0 01 00 00 CA FE 00 00 CA FE 00 00 CA FE 00 00 CA FE 00 00 CA FE 00 00 CA FE 00 00 CA FE 00 00 CA FE 00 00 CA FE 00 00 CA FE 00 00 CA FE 00 00 CA FE 00 00 CA FE 00 00 CA FE 00 00 CA FE 00 00 FF FF FF FF

The custom format of the table has all sound-based moves present in the format of 2D 00 00 00 (for example for Roar), where one move is immediately after the last. CA FE 00 00 values can be replaced with additional moves (starting at the first one). This implementation allows for up to 15 moves to be added (regardless of game version). Assuming that the battel effect move table was not re-pointed, this is enough to handle the number of additional moves that can be added in each version.

Punching Moves

Source(s): Yako? (2025)

Since this mechanic is not one that the trainer AI is explicitly aware of (the EVALUATE ATTACK flag will include the Iron Fist power boost in its damage calculations in Generation IV Pokémon games), any changes must be only be completed in one place:

  1. Enabling the Ability-based effect.

Fifteen moves are classed as punching moves in the Generation IV Pokémon games, listed in the table below.

Punching Moves
Move ID (Decimal)Move ID (Hex)Move Name
404 00Comet Punch
505 00Mega Punch
707 00Fire Punch
808 00Ice Punch
909 00Thunder Punch
14692 00Dizzy Punch
183B7 00Mach punch
223DF 00Dynamic Punch
26408 01Focus Punch
30935 01Meteor Mash
32545 01Shadow Punch
32747 01Sky Uppercut
35967 01Hammer Arm
40999 01Drain Punch
418A2 01Bullet Punch

Punching Battle Effect (Ability Inclusion)

In order to change the moves that are impacted by the Iron Fist ability mechanically the table of punching moves can be edited.

  • If the changes are replacements (e.g. remove move ID 146 Dizzy Punch from the list, and add move ID 249 Rock Smash), then simply changing the existing move ID is sufficient.
  • If the change involves only removing entries from this list, the bytes can be deleted, the same number of zero bytes added to the end of the list, and the expected length of the table updated.
  • If any additional moves are to be added to the group, the table must be re-pointed, and the expected length of the table updated. This is considered beyond the scope of this guide, but the details here could be used to achieve this.

The changes must be made in a decompressed overlay.

Game VersionOverlayOffset (Move Table)Offset (Table Length)Offset (Table Pointer)
HeartGold/SoulSilverOverlay_00120x352FE0x1FF580x20224
PlatinumOverlay_00160x33AD60x1F9600x1FC2C
Diamond/PearlOverlay_00110x30CFA0x1E5340x1E81C

The length and contents of the move table in the vanilla Generation IV Pokémon games is consistent between versions.

  • Move Table: 08 00 07 00 09 00 B7 00 08 01 92 00 DF 00 67 01 05 00 04 00 35 01 45 01 99 01 A2 01 47 01

And the expected length of the table is 0F (15). This could be updated to a smaller or larger number depending on the desired number of punching moves (e.g. a value of 13 could be used for a total number of moves of 19, that is four additional ones).

Trainer Move Selection AI Iron Fist Inclusion (EVALUATE ATTACK Flag)

The EVALUATE ATTACK trainer AI flag assesses the damage output of moves to choose the best move; accounting for abilities such as Iron Fist; Reckless; Technician; Adaptability & Normalise. This means there is no need to make further changes for the AI to be aware of punching moves.

Editing the Iron Fist Damage Multiplier

The increase in damage dealt by a punching move when used by a Pokémon that has the Iron Fist ability is an ability effect, rather than a move effect, but is included here because it is known. The damage in these cases in the vanilla games is 120% of the normal damage. This is achieved by multiplying the damage by twelve (multiplier) and dividing by ten (divisor).

The information is located in different overlays for different game versions. For games where the overlays are compressed (HeartGold & SoulSilver), decompression of the overlays must be done before hex editing the overlay. A unique hex string of 0C 20 60 43 0A 21 can be searched to find the area to be edited, the specific values to change are the 0C (12 in decimal) and 0A (10 in decimal).

These values could be changed to other values, for example changing the multiplier to 0F (15) for an overall damage of 150% (matching similar damage-boosting Abilities in later generations of Pokémon games, such as Mega Launcher or Sharpness).

Game VersionOverlayOffset (Multiplier)Offset (Divisor)
HeartGold/SoulSilverOverlay_00120x1FF440x1FF48
PlatinumOverlay_00160x1F94C0x1F950
Diamond/PearlOverlay_00110x1E5200x1E524

Trapping (Binding) Moves

A number of moves in Pokémon are "trapping/continuous damage", or "trapping" moves. These moves deal an initial amount of physical or special damage, and then have a persistent effect to continually deal a fraction of the target's maximum HP for a number of turns thereafter. While the continuous effect is present, the opponent cannot be switched out by conventional means.

In Generation IV, the 'End of Turn' damage fraction is 1/16 (or 0.0625) of the target's maximum HP; the continuous effect lasts for 2-5 turns; and the moves are typically relatively low accuracy and damage. In later generations, newer trapping moves were added (for example Infestation). Editing a move to become a trapping move requires some additional changes, beyond the move effect script.

The steps required to turn a move into a trapping move are:

  1. Editing of the move data, including setting the effect script to a trapping effect (e.g. 042 - Binding move effect)
  2. Configuring the intial trapping text which appears when the 'End of Turn' effect takes hold.
  3. Configuring the 'End of Turn' trapping animation to play each turn that the trapping effect is present.

Editing Move Data

This can be accomplished in DSPRE, and is covered earlier in this guide, under the section titled Basic Move Data (DSPRE).

Initial Trapping Text

Source(s): Aero (2025)

The texts that are displayed at the beginning, during and end of the trapping effect are located in Text Archives, which can be viewed and edited in DSPRE, and are in different text archives in different game versions, as below.

HGSSPlatinumDiamond/Pearl
197368324
  • The texts that are displayed during the effect and when it ends are common to all the trapping moves, and are determined/defined directly from the relevant effect sub-scripts (0059 and 0060).
  • The text that is displayed when the trapping effect first applies, are varied, and can be unique per move. These are determined indirectly in the relevant sub-script (0058), which reuires their definition in the relevant move sccript (move script number equal to the move index/ID).
  • There is some further variation as some trapping moves initial text refer to the target only, and others refer to the target and the user. For example:
    • Bind initial trapping text: Target was squeezed by User
    • Fire Spin initial trapping text: Target was trapped in the vortex!

Where only the target is referenced, only three possible messages are required in the text archive. Where the target and user are referenced, seven possible messages are required. The move script for a move will define whether one or both are needed, and the first message in the set. The format of the hex required in the move script therefore varies by whether the target only, or the target and user are referenced.

TypeHex
Target only15 00 00 00 ## ## 00 00 02 00 00 00 02 00 00 00 24 00 00 00
Target & User15 00 00 00 ## ## 00 00 09 00 00 00 02 00 00 00 01 00 00 00 24 00 00 00

Where ## ## should be replaced by the hex of the first message index of the set. For example, for Bind, a value of EB 00 (235) is used; for Fire Spin, a value of F2 00 (242). A new trapping move could use the same texts as another existing trapping move, or new texts could be added at the end of the relevant file.

End of Turn Trapping Animation

Using the correct trapping effect script (042 - Binding move effect), will enable the mechanical aspects of the trapping effect, however, the animation will default to showing the Bind animation with the 'End of Turn' damage is applied at the end of each turn. In order to set the trapping animation to match the chosen move, two things must be done:

  1. The animation must be added to the NARC that contains these types of 'End of Turn' animations (trapping moves, leech seed, ingrain...etc.).
  2. The trapping effect sub-script must be updated to add logic to check for the newly added animation.

The second of these steps is fairly involved, and will require some edits to existing data as well as addition of new.

Adding the 'End of Turn' Animation

Source(s): Yako? (2025)

These steps assume that the exact animation of the move will be duplicated as the End of Turn animation, which is the case in the vanilla Generation IV games, though it is worth noting that this does not have to be the case, and a different animation could be designed.

  1. Unpack the "Move Animations" NARC using (using the DSPRE "Unpack NARC to Folder" function).
    • HGSS: /a/0/1/0
    • Platinum: /data/wazaeffect/we.narc
  2. Locate the animation for the move to being a trapping move, this can be done by identifying the move's index/ID, which will be the same number as the unpacked file name.
  3. Copy the whole animation file.
  4. Unpack the "Continuous Animations" NARC (using the DSPRE "Unpack NARC to Folder" function).
    • HGSS: /a/0/6/1
    • Platinum: /data/wazaeffect/we_sub.narc
  5. Once unpacked, this should contain 50 files (0-49).
  6. Add a new file at the end, this will contain the new trapping animation.
  7. Paste in the content copied in step 3.
  8. Pack the "Continuous Animation" NARC back up (using the DSPRE "Build NARC from folder" function), making sure to remove any backup (e.g. .bak files before doing so).
  9. Replace the NARC in the ROM's extracted contents folder.
Trapping Effect Sub-script Mapping

Source(s): Lhea, Paille92. & Yako? (2025)

In order for the new trapping animation to play when the appropriate trapping move is used, the trapping/binding effect sub-script must be update to compare the move used, and play the correct battle animation.
This is not necessarily complicated, but somewhat involved, because the comparison and the execution are in two different places, and there is some accounting for the Magic Guard ability in the file as well.

Viewing the sub-script hex and Decompilation together may help understand what is happening easier.

The relevant vanilla effect sub-script from HGSS (059), looks like this in a hex editor such as HxD.

When working in a hex editor for this file, it may be helpful to set the Bytes per row to 20.

This is not necessarily intuitive, therefore the above collapsible sections step through the edit steps one by one showing the changes at each step. This assumes that a single trapping move is added. It is possible to add multiple, but consider that multiple entries need adding in steps 1 and 2 for this, and the changes to jumps in step 3 will need to account for the number of trapping moves added. These sections assume a single trapping move is added (for simplicity).

In simple terms three tasks (steps 3-5) need to be completed for each new trapping move:

  1. Unpack the "Effect sub-scipts" NARC using (using the DSPRE "Unpack NARC to Folder" function).
    • HGSS: /a/0/0/1
    • Platinum: /battle/skill/sub_seq.narc
  2. Open sub-script 059 in a hex editor such as HxD.
3. Add a new check on the move that was used (compare function).
  • Each trapping move except Bind has five sets of four byts for the comparison.
    • Bind doesn't have one as it is the "fallback", this is why the Bind animation is used if this sub-script is not updated.
  • A new set of twenty bytes must be added after the last check (Sand Tomb in vanilla), replacing the 13th and 14th bytes with the relevant move ID (Little Endian).
    • Here is Sand Tomb's compare function from HGSS:
      20 00 00 00 00 00 00 00 23 00 00 00 48 01 00 00 1E 00 00 00
    • Here is a new function for a different move (Twister in this case):
      20 00 00 00 00 00 00 00 23 00 00 00 EF 00 00 00 1E 00 00 00
  • Paste the new byte-string after Sand Tomb's.

As an example, if the new trapping move is Twister (uses move ID 239, or EF 00 in hex), the modified effect sub-script looks like this with these changes.

4. Add a new execution to play the correct animation.
  • Each trapping move (including Bind) has five sets of four bytes for the execution.
    • Bind is first because this is a fallback that is executed if none of the compare functions are met.
  • A new set of twenty bytes must be added after the last execution (Sand Tomb in vanilla), replacing the ninth and tenth bytes with the relevant 'end of turn' move animation.
    • Here is Whirlpool's execution function from HGSS: 45 00 00 00 FF 00 00 00 26 00 00 00 3B 00 00 00 03 00 00 00
    • Here is Sand Tomb's execution function from HGSS: 45 00 00 00 FF 00 00 00 27 00 00 00 0E 00 00 00
    • Note that this last entry is four bytes smaller, because it doesn't have the jump element that the others do.
    • To add a new entry for a different move, the copied hex will include the jump command from the previous row (Whirlpool) and the up to the end of the 'end of turn' animation bytes for Sand Tomb. I.e. the following bytes should be copied and pasted immediately after the copied selection: 3B 00 00 00 03 00 00 00 45 00 00 00 FF 00 00 00 27 00 00 00
  • The 27 00 00 00 set of bytes needs to be edited to reference the new 'end of turn' animation (in hex). 27 00 refers to file 39 in decimal, if the new file added here was file 50, 27 00 00 00 should be replaced with 32 00 00 00 for example.

As an example, if the new trapping move is Twister (uses move ID 239, or EF 00 in hex), and the new 'end of turn' animation was added as file 50 (32 00 in hex), the modified effect sub-script now looks like this with these changes.

5. Update all the "jumps" in the whole sub-script to account for the new data.
  • The jumps between lines/functions now need correcting. If the file is viewed with Bytes per row set to 20, the four bytes at the end of each row relate to the Jumps that need changing.
  • These jumps are defined as a number of groups of four bytes. For example, to jump 20 bytes, the value will be five.
  • The first jump is following a check on the target having the Magic Guard ability, and this jump moves to the end of the sub-script. Therefore this jump must be increased by the total number of groups of four bytes added to the sub-script in both steps 1 and 2.
    • If one trapping move was added, this will mean replacing 4E 00 (78 in decimal) to 58 00 (88 in decimal).
  • The next rows (seven rows if a single trapping move was added) all jump the same number of bytes, jumping to the relevant execution steps (which is why it is important that the order is consistent between the two sections).
    • Since an extra five sets (of four bytes) have been added in the comparing functions, each of these jumps must be increased by this amount from 1E 00 (30 in decimal) to 23 00 (35 in decimal).
  • The final set of jumps are variable, ranging from 1C 00 (28) to 03 00 (3). This is because these jumps are all moving to a specific point after the animation is executed (the point immediately after the execution function added above).
    • The last jump must remain 03 00 and each preceding jump is increased by 5. This essentially results in the values "moving down", and a new highest value being added at the top of 21 00 (33).

As an example, if the new trapping move is Twister (uses move ID 239, or EF 00 in hex), and the new 'end of turn' animation was added as file 50 (32 00 in hex), the modified effect sub-script now looks like this with these changes.

  1. Pack the "Effect sub-scipts" NARC back up (using the DSPRE "Build NARC from folder" function), making sure to remove any backup (e.g. .bak files before doing so).

Continuous Trapping Effects (Common)

Though it relates to modifying the overall battle system, and not individual moves, since it is known and relevant, this section details how to alter:

  1. The amount of continuous damage dealt by trapping moves, and
  2. The number of turns that the effect applies.
Editing the Amount of Continuous Damage Dealt

Source(s): Lhea (2023), Lmaokai (2025), Paille92 (2025).

The amount of damage dealt at the end of each turn that a trapping effect is present is determined by a 'divisor'. This value is what the maximum HP of the affected Pokémon is divided by to determine how much HP is lost.

The information is located in different overlays for different game versions. For games where the overlays are compressed (HeartGold & SoulSilver), decompression of the overlays must be done before hex editing the overlay. A unique hex string of 48 43 10 21 09 F0 (HGSS/Plat) or 10 21 08 F0 E9 (Diamond/Pearl) can be searched to find the area to be edited, the specific value to change is the 10 (16 in decimal, hence 1/16 max HP damage per turn).

This value could be changed to another value, for example to 08 for 1/8 damage per turn (as in later generations of Pokémon games), or something totally different, for example 20 for 1/32 damage per turn. As this is a divisor, the higher the number the lower the damage dealt.

Game VersionOverlayOffset
HeartGold/SoulSilverOverlay_00120x12852
PlatinumOverlay_00160x1228A
Diamond/PearlOverlay_00110x11528
Editing the Duration of Trapping Moves

Source(s): Yako? & DarmaniDan

The number of turns that trapping moves last is determined in the effect sub-script which applies whenever a binding move begins (move effect sub-script 0058). There are two important values. The normal range of number of turns (2-5 in vanilla, or 3-6 including the turn the move is initially used on); and the guaranteed number of turns that is set if the Grip Claw item is held by the Pokémon who used the move at the time it is first used.

The effect sub-scripts locations in different game versions are listed here.

The sub-script contains the following hex: 38 00 00 00 03 00 00 00 03 00 00 00 which deals with the standard randomised duration, and can be broken down as:

  • 38 00 00 00 - get a random number from zero to...
  • 03 00 00 00 - maximum outcome
  • 03 00 00 00 - add three to the outcome

Resulting in 3, 4, 5 & 6 as possible outcomes (which translates to 2, 3, 4 or 5 turns).

Later in the sub-script, further information determines the outcome if the required held item is present: 32 00 00 00 07 00 00 00 09 00 00 00 06 00 00 00, which can be broken down as:

  • 32 00 00 00 (or 39 00 00 00 in Platinum) - update the following variable...
  • 07 00 00 00 - ...by setting it to a given value
  • 09 00 00 00 - the variable to update
  • 06 00 00 00 - the new value to write

Resulting in an outcome of 6 every time (which translates to 5 turns).

To change the standard randomised duration, the maximum outcome and number to be added can be adjusted. Two examples are below:

Example 1: fix the number of turns to always be 3 turns: 38 00 00 00 00 00 00 00 04 00 00 00

  • The random number is returned between 0 and 0 (always 0).
  • The number to be added is 4
  • The outcome is always 4, which translates to 3 turns.

Example 2: set the number of turns to ranndomly vary between 4 and 5 turns: 38 00 00 00 01 00 00 00 05 00 00 00

  • The random number is returned between 0 and 1.
  • The number to be added is 5
  • The outcome is either always 5 or 6, which translates to either 4 or 5 turns respectively.

A similar approach can be taken with the logic to override the outcome if the Grip Claw is held, but in this case, it is simply a matter of replacing the "new value to write" with the specific outcome desired. For example, to set this at 4 turns: 32 00 00 00 07 00 00 00 09 00 00 00 05 00 00 00.

  • The outcome (if the required held item is present) is always 5, which translates to 4 turns.

Move Compatibility (Distribution)

Level-Up Learnset

General Level-Up Edits

DSPRE's Pokémon Editor can be used for a variety of purposes, including changes to the level up learnsets of any Pokémon in-game. This editor can be accessed from the Other Editors menu option, and is a tabbed view. The Learnset Editor is the second tab.

Each entry in the list for each Pokémon can be edited or deleted, and new entries can be added, the relative positions of moves learned at the same level can also be amended. An entry cannot be added that exactly matches and existing entry (move and level); edits must be saved for each Pokémon before they are applied.

Adding a new EntryEditing an Existing Entry
  1. Select/enter the move to be learned.
  2. Select/enter the level to be learned.
  3. Click the Add button.
  4. Click the Save button.
Moves are listed in Move ID/index order, a move can be found by typing its name, or beginning to type its name.
  1. Select a move from the existing list (on the left).
  2. Click the Edit button.
  3. Change the selected move, level learned, or both.
  4. Click the Confirm button.
  5. Click the Save button.
Deleting an Existing EntryRe-ordering Entries Learned at the same Level
  1. Select a move from the existing list (on the left).
  2. Click the Delete button.
  3. Click the Save button.
  1. Select a move that is learned at the same level as another move in the learnset.
  2. Click the Move Up or Move Down buttons as appropriate.
  3. Click the Save button.

Maximum Move Threshold

Source(s): BagBoy, Chritchy & Mikelan98

In the Generation IV Pokémon games, level-up learnsets usually have a maximum of 20 entries. DSPRE can enable further entries to be added, but this causes issues, including when using the in-game move relearner for the affected Pokémon, either:

  • Game crashes and/or
  • Incomplete relearner lists to be populated

This upper limit can be edited with hex editing based on the research above for HGSS (Mikelan98), Platinum (BagBoy) & Diamond/Pearl (Chritchy & MrHam88), preventing the issues described above in the respective games.

The below table shows the required offsets for each game version, the standard (or "vanilla") values at these offsets, an example of what they would be changed to to increase the limit from 20 to 30 moves, and a calculation that can be used to find any required custom value. The upper limit on these values is not known.

Game VersionFileOffset(s)Standard Value
(move limit = 20)
Example Value
(move limit = 30)
Calculation
HeartGold/SoulSilverarm9.bin0x712E0
0x7153E
0x71908
2C (44 in decimal)40 (64 in decimal)(move limit +2) ×2
0x917C4
0x917CE
2A (42 in decimal)3E (62 in decimal)(move limit +1) ×2
0x9185815 (21 in decimal)1F (31 in decimal)move limit +1
Platinumarm9.bin0x77028
0x77286
0x77668
0x99830
0x9983A
2C (44 in decimal)40 (64 in decimal)(move limit +2) ×2
0x998C416 (22 in decimal)20 (32 in decimal)move limit +2
Diamond/Pearlarm9.bin0x695FC
0x69822
0x69C04
0x88E56
0x88E5A
2C (44 in decimal)40 (64 in decimal)(move limit +2) ×2
0x88EE416 (22 in decimal)20 (32 in decimal)move limit +2

Technical & Hidden Machines (TMs & HMs)

The following sections detail how to change the move that a TM teaches, and ensure that the learnsets of Pokémon are updated accordingly.

A case study example that uses all of these edits is outlined here

Editing the Move within a TM

Source(s): Mixone (2023) & Drayano (2021)

In order to change the move that a TM or HM teaches, two to four areas need editing in Generation IV Pokémon games, which can be grouped by the method of editing:

  1. ARM9 Edits (hex edits):
    • The move index number associated to the TM,
    • The TM icon palette being used by the TM item (the colour of the 'disc') - necessary only when the type of the move is changed,
  2. Text Edits (DSPRE):
    • The move description associated to the TM item (distinct from the move description), and
    • Any NPC text or other text called by Scripts that reference the move - necessary only when the TM is given to the player with context (e.g. by a Gym Leader after their defeat).

Part 1: Hex Edits

  1. Uncompress ARM9 (if not already uncompressed)

  2. Open ARM9 in a Hex editor

  3. Edit the move index number associated to the TM:

    • Go to offset 0x1000CC (HGSS), 0xF0BFC (Platinum) or 0xF84EC (Diamond/Pearl), which is the offset for TM01.
      • Each TM uses two bytes in a list from this point onwards.
      • This is Focus Punch (move index 264) in vanilla HGSS.
      • The decimal number 264 is 0x108 in hexadecimal, which is two bytes: 01 and 08.
      • The values are represented in Little-Endian, meaning that the bytes are reversed, so this appears as 08 01.
    • Identify the TM you wish to edit, simply by counting through to reach the right offset.
    • Replace the two bytes representing the vanilla move index, with the two bytes representing the move index you wish to replace it with.
      • A simple method to identify the move index is to check the Bulbapedia page for moves by index.
  4. Edit the TM icon palette used

    • Open ARM9 in a Hex editor
    • Go to offset 0x100BD6 (HGSS), 0xF1706 (Platinum) or 0xF8FF6 (Diamond/Pearl), which is the offset for TM01.
      • Each TM palette uses eight bytes in a list from this point onwards.
      • The bytes for TM01 (Focus Punch) are: 8D 01 8E 01 21 01 33 01 (in HGSS/Plat)
      • The third & fourth bytes refer to the palette (colour) of the TM disc as numbers from 8E 01 (398) to 9D 01 (413) plus 62 02 (610) (bizarrely; for the Bug Type).
    • Identify the TM you wish to edit.
    • Replace the two bytes representing the vanilla type palette, with the two bytes representing the type palette you wish to replace it with.
  5. Save ARM9

TM Item: Type Palettes
TypePalette
Fighting8E 01
Dragon8F 01
Water90 01
Psychic91 01
Normal92 01
Poison93 01
Ice94 01
Grass95 01
Fire96 01
Dark97 01
Steel98 01
Electric99 01
Ground9A 01
Ghost9B 01
Rock9C 01
Flying9D 01
Bug62 02

Part 2: Text Edits (DSPRE):

  1. Open the ROM in DSPRE from the extracted folder (to preserve the above ARM9 changes, opening the .nds file will re-extract the data from the ROM, and wipe the previous ARM9 edits unless they have previously been saved back to the .nds file).
  2. Edit the TM item description
    • Navigate to the Text Editor and select Text Archive 749 (HGSS), 646 (Platinum) or 587 (Diamond/Pearl); which contains the descriptions for all moves.
    • Identify the move description you wish to change (the Message number relates directly to the move index) the TM to and copy the Message
      • A simple method to identify the move index is to check the Bulbapedia page for moves by index.
    • Navigate to the Text Editor and select Text Archive 221 (HGSS), 391 (Platinum) or 343 (Diamond/Pearl); which contains the descriptions for all items.
    • Identify the TM you wish to edit by navigating to the message ID that matches the item index. TMs & HMs are indexes 328-427. A simple method to identify the index is to check the Bulbapedia page for Generation IV items by index.
    • Edit the Message to read the desired move description (previously copied).
    • Save the Text Archive
  3. Edit NPC contextual texts
    • Research/identify where the TM is acquired in the game (or where it is intended to be acquired in the ROM hack):
      • Where it is acquired by collection as an overworld item, or from a PokéMart seller, it is likely no further edits are required.
      • Where it is acquired as a gift from an NPC, there may be NPC texts that need adjustment.
    • Use the search function of the Header Editor to open the relevant Header.
    • Open the Text Archive associated to the Header
    • Search the Text Archive for messages that refer to the TM contents and adjust as necessary.
    • Save the Text Archive
  4. Save the ROM to .nds file using DSPRE.

Where the TM is acquired as a gift from an NPC, there may be NPC texts that need adjustment. For example, a Gym Leader rewards the player with a TM after their defeat. In their scripted text, they will refer to the name of the move and give some description of, or advice on, it's use.

Editing a Pokémon's Machine Learnset

Whether simply to change the availability of a vanilla TM, or to adjust compatibility/distribution based on a change to the move contained within a TM, editing which Pokémon can learn the move contained in the TM is a simple change in DSPRE.

  1. Open the ROM in DSPRE
  2. Navigate to the Pokémon Editor (via the "Other Editors" dropdown as of version 1.13.1 of the tool).
  3. On the "Personal Editor" tab, select the Pokémon to have it's TM learnset edited.
  4. Move a TM from the "Disabled" list to the "Enabled" list to allow the Pokémon to be taught the move in the TM, or visa versa to prevent the Pokémon from being taught the move from the TM.
  5. Save the changes to the Pokémon.
  6. Repeat steps 3-5 for all required Pokémon.
  7. Save the ROM to .nds file using DSPRE.

It may be useful to review public websites such as Bulbapedia or Serebii to easily identify which Pokémon can learn a move via TM and other means from the move's summary page.

Move Tutors

Source(s): Fantafaust, MapleDonut, Mixone, Solace, TurtleIsaac.

Move tutors are implemented in a number of different ways in the Generation IV Pokémon games, with some variation between games. There are two main varieties of move tutors, with some sub-types. The below table outlines the types as they are used in the vanilla games.

  1. Move Tutor by Pokémon Attributes
  2. Move Tutor by Compatibility & Special Currency
IDMethodAvailabilityExampleDescription/Overview
1APokémon Attributes (Type & Happiness)Diamond, Pearl, Platinum, HeartGold, SoulSilverDraco Meteor tutor (DPPt: Route 210; HGSS: Blackthorn City)This move tutor is fully implemented via scripting, that can be recreated/edited or adapted in DSPRE.
The script uses known commands to check that the selection Pokémon has Type 16 (Dragon) as either it's primary or secondary Type, whether the Pokémon has maximum happiness, and whether the Pokémon does not already know the move Draco Meteor.
If all checks are true, the move can be taught at no cost.
1BPokémon Attributes (Pokémon ID & Happiness)Diamond, Pearl, Platinum, HeartGold, SoulSilverElemental Beams tutor (DPPt: Route 228; HGSS: Blackthorn City)This move tutor is fully implemented via scripting, that can be recreated/edited or adapted in DSPRE.
The script uses known commands to check that the selection Pokémon has ID of one of a small number of values (for the fully evolved starter Pokémon), whether the Pokémon has maximum happiness, and whether the Pokémon does not already know the Type-specific Hyper Beam variant.
If all checks are true, the move can be taught at no cost.
Nb, incidentally, this script could probably be re-written to include the type check used in 1A to slightly streamline it.
2ACompatibility & Special Currency (Shards)PlatinumThree Shard Tutors (Route 212, Snowpoint City, Survival Area)This move tutor uses scripting, but also two tables of data stored in overlay_0005.bin, which define the available pool of moves that can be tutored, compatibiltiy with each Pokémon, the prices and assigned tutors for each.
2BCompatibility & Special Currency (Battle Points)HeartGold, SoulSilverThree BP Tutors (Frontier Access)This move tutor uses scripting, but also two tables of data stored in overlay_0001.bin and waza_oshie.bin, which define the available pool of moves that can be tutored, compatibiltiy with each Pokémon, the prices and assigned tutors for each.
2CCompatibility & Special Currency (Free)HeartGold, SoulSilverHeadbutt Tutor (Ilex Forest)This move tutor uses scripting, and a Headbutt-specific command, but also two tables of data stored in overlay_0001.bin and waza_oshie.bin.

Editing or Creating "Pokémon Attributes" Move Tutors

As described in the table above, move tutors which are driven by scripting to determine if a Pokémon meets certain criteria such as type, ID, happiness are available in all main series Generation IV Pokémon games, and require only scripting in DSPRE.

This means that creating new tutors is very straightforward using the vanilla scripts as a base, and it would even be possible to add checks for other Pokémon data attributes this way.

Editing "Compatibility & Special Currency" Move Tutors

While more complex, and involving hex edits, it is very possible to edit the more complex move tutors as well without significant re-pointing. In fact, in HGSS, there is even space to add up to 12 more moves that can be tutored (not the case in Platinum).

Since these tables only exist in Platinum, Heartgold & Soulsilver versions, these tutor methods are not available in Diamond & Pearl (without more significant work, possibly code injection).

There are some variations between versions, below will outline where edits are needed and how to define the desired results. All of these will require at least rudimentary hex editing skill. See this documentation to learn enough to proceed.

The below download link is for a Microsoft Excel file which can be used to easily produce the required hex strings to change the Tutorable Moves (incl. Costs & Tutor IDs) & the Tutorable Moves (Pokémon Compatibility) data in both Platinum & HGSS. The following sections describe where these changes should be done and any other context.

Download the GenIV Move Tutor Hex Creator Spreadsheet

Type 2A (Platinum): Compatibility & Special Currency (Shards)

Source(s): MapleDonut, TurtleIsaac & Solace (2021)

All of the data exists in Overlay_0005.bin, and edits can be made from an extracted file (as produced by DSPRE during unpacking, or via a program such as Tinke).

Move pool definition
The available pool of moves that can be tutored can be found at offest 0x2FF64 (and up to and including offset 0x3012B).
In platinum there are 38 used moves, each takes 12 bytes of space (plus two unused sets of bytes). A list of the moves available in the pool can be found in online sources such as Bulbapedia.

The format of the bytes is as follows: XX XX RR BB GG YY 00 00 LL 00 00 00
Where:

  • XX XX : Move ID in hex (little endian, ie Move 1C3 would be C3 01)
  • RR : Number of red shards required to tutor this move (red shards are used for Physical moves)
  • BB : Number of blue shards required to tutor this move (blue shards are used for Special moves)
  • YY : Number of yellow shards required to tutor this move (yellow shards are used for damaging or non-damaging moves with Status effects)
  • GG : Number of green shards required to tutor this move (green shards have no specific correlation with move attributes)
  • LL : Tutor ID. 00 is the tutor on Route 212, 01 is the tutor in the Survival Area, and 02 is the tutor in Snowpoint City.

As an example, the first tutorable move is:
23 01 02 04 02 00 00 00 00 00 00 00 Meaning this is move ID 291 (Dive), costs 2 Red Shards, 4 Blue Shards, 2 Green Shards & 0 Yellow Shards, and is available at the tutor on Route 212.

To check understanding, look at the last tutorable move, and identify the required information:
FD 00 00 00 06 02 00 00 02 00 00 00

Interpretation of the hex above

This is move ID 253 (Uproar), costs 0 Red Shards, 0 Blue Shards, 6 Green Shards & 2 Yellow Shards, and is available at the tutor in Snowpoint City.

This knowledge can be used to change any of the moves that the tutors can (collectively) teach, the costs for the move in shards, and the specific tutor who can teach it.

Note that the Tutor ID simply relates to an input to the CheckLearnableTutorMoves script command. This means that the moves aren't tied to specific NPCs, locations etc., and it means that new Tutors could be defined by editing the Tutor ID parts of the available pool of moves. It is also worth noting that the pool could theoretically have multiple of the same move present, for example if you wanted Tutor ID 00 and a new Tutor ID 03 to both teach Ominous Wind, you could replace an unwanted move in the table with a second for Omnious Wind with a different or same cost, and a different Tutor ID.

Pokémon compatibility

The compatibility table can be found at offest 0x3012C. In Platinum each Pokémon ID uses 5 bytes.

The format of the bytes is as follows: AA BB CC DD EE Where:

  • AA : Binary true/false definition for tutorable moves 01-08
  • BB : Binary true/false definition for tutorable moves 09-16
  • CC : Binary true/false definition for tutorable moves 17-24
  • DD : Binary true/false definition for tutorable moves 25-32
  • EE : Binary true/false definition for tutorable moves 33-40 (only 33-38 are used)

The individual bytes must be interpreted seperately for accuracy.

As an example, if a Pokémon should be able to learn the 2nd & 3rd moves in the tutorable table AA must be 06, and not 60 as the "positions" are read right to left in binary. An example below, shows this in action:

  • Compatible Moves: Mud-Slap (ID 2), Fury Cutter (ID 3)
  • Binary: 0000 0110
  • Hex: 06
  • A binary to hex converter could be used to work this out, or the BIN2HEX function in Microsoft Excel.

To find the offset of any given Pokémon to edit, paste the following formula into cell B1 of an Excel document (=(DEC2HEX(((A1-1)*8)+196908))), and put the National Dex ID of the Pokémon in cell A1.

Pokémon IDs (Special Forms)
Pokémon IDName/Form
1-493National Dex ID for normal form
494Deoxys (ATK)
495Deoxys (DEF)
496Deoxys (SPD)
497Wormadam (SAND)
498Wormadam (TRASH)
499Giratina (ORIGIN)
500Shaymin (SKY)
501Rotom (HEAT)
502Rotom (WASH)
503Rotom (FROST)
504Rotom (FAN)
505Rotom (MOW)
Type 2B (HGSS): Compatibility & Special Currency (Battle Points)

Move pool definition

Thanks to Fantafaust for related research which identifies the location of the move pool definition table in HGSS (overlay_0001).

The available pool of moves that can be tutored can be found at offest 0x23AE0 (and up to and including offset 0x23BC7) in an decompressed overlay_0001 (DSPRE can be used to decompress this overlay).
In HGSS there are 52 used moves, each takes four bytes of space. There is space in overlay_0001 for six more moves to be defined (which are just present as 00 10 00 00 in the vanilla game) A list of the moves available in the pool can be found in online sources such as Bulbapedia.

The format of the bytes is as follows: XX XX BB TT Where:

  • XX XX : Move ID in hex (little endian, ie Move 1C3 would be C3 01)
  • BB : Price in Battle Points
  • TT : Tutor ID. 00 is the top-left tutor, 01 is the top-right tutor and 02 is the bottom-right tutor, all in the house in the Frontier Access, 03 refers to the Headbutt tutor in Ilex Forest.

As an example, the first tutorable move is:
23 01 28 00 Meaning this is move ID 291 (Dive), costs 40 Battle Points, and is available at the top-left tutor.

To check understanding, look at the second-to-last (used) tutorable move, and identify the required information:
C2 01 20 00

Interpretation of the Hex above

This is move ID 450 (Bug Bite), costs 32 Battle Points, and is also available at the top-left tutor.

This knowledge can be used to change any of the moves that the tutors can (collectively) teach, the costs for the move in BP, and the specific tutor who can teach it.

Note that the Tutor ID simply relates to an input to the CheckLearnableTutorMoves script command. This means that the moves aren't tied to specific NPCs, locations etc., and it means that new Tutors could be defined by editing the Tutor ID parts of the available pool of moves. It is also worth noting that the pool could theoretically have multiple of the same move present, for example if you wanted Tutor ID 00 and a new Tutor ID 04 to both teach Ominous Wind, you could replace an unwanted move in the table with a second for Omnious Wind with a different or same cost, and a different Tutor ID.

When considering adding new Tutor IDs in HGSS, bear in mind that tutor ID 03 is used (the Headbutt tutor).

Pokémon compatibility

Source(s): Mixone (2024)

The compatibility table can be found in waza_oshie.bin at offest 0x0 (this is the entire file). In HGSS each Pokémon ID uses 8 bytes.

The format of the bytes is as follows: AA BB CC DD EE FF GG HH, where:

  • AA : Binary true/false definition for tutorable moves 01-08
  • BB : Binary true/false definition for tutorable moves 09-16
  • CC : Binary true/false definition for tutorable moves 17-24
  • DD : Binary true/false definition for tutorable moves 25-32
  • EE : Binary true/false definition for tutorable moves 33-40
  • FF : Binary true/false definition for tutorable moves 41-48
  • GG : Binary true/false definition for tutorable moves 49-56 (only 49-52 are used, 53-56 are present, but unused)
  • HH : Binary true/false definition for tutorable moves 57-64 (only 57-58 are present, but unused)

The individual bytes must be interpreted seperately for accuracy.

As an example, if a Pokémon should be able to learn the 2nd & 3rd moves in the tutorable table AA must be 06, and not 60 as the "positions" are read right to left in binary. The example below, taken from Mixone's reseach shows this in action:

  • Compatible Moves: Mud-Slap (ID 2), Fury Cutter (ID 3)
  • Binary: 0000 0110
  • Hex: 06
  • A binary to hex converter could be used to work this out, or the BIN2HEX function in Microsoft Excel.

To find the offset of any given Pokémon to edit, paste the following formula into cell B1 of an Excel document (=(DEC2HEX((A1-1)*8))), and put the National Dex ID of the Pokémon in cell A1.

Pokémon IDs (Special Forms)
Pokémon IDName/Form
1-493National Dex ID for normal form
494Deoxys (ATK)
495Deoxys (DEF)
496Deoxys (SPD)
497Wormadam (SAND)
498Wormadam (TRASH)
499Giratina (ORIGIN)
500Shaymin (SKY)
501Rotom (HEAT)
502Rotom (WASH)
503Rotom (FROST)
504Rotom (FAN)
505Rotom (MOW)
Type 2C: Compatibility & Special Currency (Free)

This type of move tutor is a variation on Type 2 where the tutor can only teach a single move, and that move is one that has a Tutor ID of 3 (in the case of the vanilla HGSS game: 52 Headbutt). It checks the compatibility table discussed in the previous section on Type 2B to confirm if the selected Pokémon can learn the more or not.

This is achieved through a very specific command CheckHeadbuttCompatibility which inherently checks for tutorable moves with tutor ID = 03. It is possible to use the same command along with the AdrsValueSet command to create other one move tutors, or even different uses. An example of this implementation is Fantafaust's HM Integration, which is used to perform compatibility checks for a HM-replacement system.

Creating New Move Tutors

With the information documented above, it is possible to create new move tutors, by utilising unused Tutor IDs (for both Platinum & HGSS). In HGSS it is easily possible to define six more moves that can be tutored, using the available space in the existing table in overlay_0001. Existing commonscripts can be copied/replicated to create new tutors that use the same purchasing mechanisms (shards or BP). It is also easily possible to use the same move tutor data to develop tutors that have more unique/complex logic controlling availability/purchase of the tutorable moves with custom scripting.

In HGSS, the Event and Script data of the move tutors in the Frontier Access can be reviewed to find that a small series of commonscripts are used to drive their dialogue & options. Adding a new tutor that uses (for example Tutor ID 04), can be acheived by following these steps:

  1. Update the Tutorable Moves data (overlay_0001) to include moves that are aligned to Tutor ID 04 (Details here; hex creator tool here).
  2. Update the Pokémon Compatibility data (waza_oshie.bin) to set the compatibility for the newly added moves (Details here; hex creator tool here).
  3. Locate the last move tutor commonscript (file 2, Script 3). Copy the script and paste it as Script 4, editing the SetVar commands for variables 32768 & 32775 to change the value the variable is set to (2) to 4, for example:
Script 4:  
SetVar 32768 4
SetVar 16399 24
SetVar 32775 4
Jump Function#1
  1. Copy the script used by one of the move tutors from the house in the Frontier Access, alter the commonscript called to be the correct (Script 4 in file 2 is 10443).
Script 999:
PlayFanfare SEQ_SE_CONFIRM
LockAll
FacePlayer
CommonScript 10443
ReleaseAll
End

In Platinum, this is slightly more involved, as commonscripts aren't utilised, the functions are within the Script files of the tutors themselves. In these cases, copying the relevant scripts & functions of the tutor, and directly changing the Tutor ID parameters of the CheckLearnableTutorMoves and ShowTutorMovesList commands (command names are as of DSPRE Organisation SCRCMD, DSPRE v1.14.0).

  1. Update the Tutorable Moves data to include moves that are aligned to Tutor ID 04 (Details here; hex creator tool here).
  2. Update the Pokémon Compatibility data to set the compatibility for the newly added moves (Details here; hex creator tool here).
  3. Locate one of the vanilla move tutor scripts & functions. Copy the script and all functions to the required script file, editing the Tutor ID parameters of the CheckLearnableTutorMoves and ShowTutorMovesList commands to 4.

Nb, if multiple tutors are being created in Platinum, setting up some commonscripts to function as per HGSS may be a sensible approach to make the process of calling them when required easier.

Egg Moves

Source(s): BluRose, Lhea, RefinedPlat (2023)

Egg moves are moves that can be learned by a Pokémon via breeding which are not moves that the hatched Pokémon would normally learn at level 1, moves that the hatched Pokémon could learn by level up, compatible moves that the male parent Pokémon learned from a TM.

When breeding for moves, Egg Moves are the last priority to be override existing moves, so if a hatched Pokémon could learn an Egg Move, it will definitely be learned. When determining the moves of a child Pokémon, the following sequence is followed, where at each stage if there are no empty move slots, the move to be learned overrides the slot after the last move chosen in this way.

  1. Level 1 moves.
  2. Moves that the child learns by level up, if both parents have them.
  3. Any compatible TM or HM moves known by the father.
  4. Any Egg Moves known by the father.

Definition

These moves are specifically defined for every Pokémon species that can legally hatch from an egg. This point specifically, is important to note for any ROM hacks where species that cannot normally be hatched from an egg, have been changed to allow this.

To illustrate this, here are a few examples:

  • The game holds Egg Move data for Bulbasaur, but does not hold Egg Move data for Ivysaur or Venusaur.
  • The game holds Egg Move data for Mantine, and does hold (different) Egg Move data for Mantyke.
  • The game holds Egg Move data for Pichu, but does not hold Egg Move data for Pikachu or Raichu.
  • The game holds no Egg Move data for Beldum, Metang or Metagross.

The data is continuous (when one species data ends the next begins, regardless of the quantity of Egg Moves) and arranged in the following way:

## ## AA AA BB BB ... PP PP

Where:

  • ## ## - is the Pokémon's index (National Pokedex ID) + 20,000 (e.g. Bulbasaur is 20,001 or 21 4E in Little Endian hex).
  • AA AA - is the first Egg Move's move index (e.g. Light Screen is 113 or 71 00 in Little Endian hex).
  • BB BB - is the second Egg Move's move index.
    ...
  • PP PP - is the last (up to sixteenth) Egg Move's move index.

Some additional notes:

  • Pokémon species who are hatched only when parents breed holding an Incense item (e.g. Mantyke) have different Egg Move data to the species that would hatch of the Incense was not used (e.g. Mantine).
  • There is a single "special" Egg move that is not defined in this data either: Pichu learning Volt Tackle if one of the parent Pikachu are holding a Light Ball.
  • The Egg Moves are not defined in any meaningful or consistent relative order for different species (e.g. Magical Leaf is defined earlier in the list than Ingrain for Bulbasaur, but later in the list for Bellsprout).
  • Each Pokémon species can have a maximum of 16 Egg Moves defined.

Location

Game VersionLocationOffset(s)
HeartGold/SoulSilver/a/2/2/90x0
Platinumoverlay_00050x29222
Diamond/Pearloverlay_00050x20668

Because the data is held in its own NARC for HGSS, it is easily editable and expandable, however for Diamond, Pearl & Platinum versions this data is held within an overlay with no space for expansion in-situ.

It is relatively straightforward to update/change existing entries, for example changing an Egg Move from 'x' move to 'y' move for a species. It is also simple to add new entries in HGSS, but the table would need re-pointing to add more (total) entries (without replacing existing data) in Diamond, Pearl or Platinum versions. Without re-pointing the table, entries could be added in these versions as long as the length of the total egg move data remained the same (i.e. removing other entries).


Example Case Studies

This section contains a number of specific step-by-step instructions to achieve specific outcomes. This can be used exactly as-is to produce working results, but is intended to provide working examples of the various techniques and tutorials detailed above. Specifically how editing a move can involve many techniques to "seamlessly" complete.

The majority of these tutorials are written using Pokémon Heartgold Version as the base ROM. The detailed sections above include all the information needed to adjust these for other Gerneration IV Pokémon games.

Two-turn > One-turn Move (Razor Wind)

In this case study, the move Razor Wind will be changed from a two-turn move to a single-turn stat recoil move: a mechanical clone of Leaf Storm.

This will be completed in a Pokémon HeartGold Version ROM, and will comprise of three steps:

  1. Edit the move effect and attributes/data
  2. Edit the move description texts
  3. Edit the move animation (so that the entire animation is seen on a single turn)

Step 1: Move Effect & Attributes

  1. Open DSPRE & load the ROM
  2. Open the Move Data Editor from the Other Editors toolbar option
  3. Select the move Leaf Storm and make a note of the configuration:
    • Effect Sequence: 204
    • Power: 120
    • Accuracy: 100
    • PP: 5
    • Side Effect Probability: 100
  4. Select the move Razor Wind and update the configuration to include the above (and anything else desirable, in this example the type is also changed to Flying).
  5. Click the Save button

Step 2: Move Description

  1. Open the Text Editor from the main toolbar
  2. Use the search function to find the move description, taking a small part of the text (as displayed in the Move Data Editor), e.g. "Blades of wind"
  3. Update the message to include a more accurate description (while retaining appropriate line breaks), for example changing the vanilla:
    • A two-turn attack.\nBlades of wind hit the\nfoe on the second\nturn. It has a high\ncritical-hit ratio. to something like:
    • Blades of wind hit\nthe foe. The attack’s\nrecoil sharply\nreduces the user’s\nSp. Atk stat.
  4. Click the Save Current Archive button
  5. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

Step 3: Move Animation

  1. Open WazaEffectEditor (for HGSS in this case)
  2. Select the move Razor Wind.
  3. Remove the initial CheckTurn command and End lines.
  4. Remove the duplicated elements of the remaining two sections (each representing the animation on one turn)
    • Everything from Init to Cmd_3c and from WaitAnim to End are common across both elements, so the second set of these can be removed.
  5. Merge the remaining elements as they should be animated:
    • Each LoadAnim commands should be retained in the order that exist in. In this case, the desired outcome is for the first animation to finish before the next starts, so teh Wait commands should be kept after each.
    • Insert the PlaySound from the first turn element just before the WaitSound and Wait from the second turn element.
    • Insert the ApplyCmd commands,
    • Discard the excess Wait
  6. Click the Save Current button to save the Animation script.
  7. Save the ROM from the File option on the toolbar.

The changes are now complete, and can be tested in-game. Below are examples of the changes in DSPRE & WazaEffectEditor.

Razor Wind (WazaEffectEditor vanilla)
CheckTurn 0x3 0x3f
End
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x2c 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
LoadAnim 0x0 0x1 0x3
Wait 0xa
PlaySound 0x72d 0xffffff8b
Wait 0xa
WaitAnim
Cmd_35 0x0
End
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x2c 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
LoadAnim 0x0 0x0 0x14
WaitSound 0x73b 0x75 0x5
Wait 0xa
ApplyCmd 0x24 0x5 0x3 0x0 0x1 0x2 0x108
ApplyCmd 0x24 0x5 0x3 0x0 0x1 0x2 0x110
WaitAnim
Cmd_35 0x0
End
Razor Wind (WazaEffectEditor custom one-turn)
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x2c 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
LoadAnim 0x0 0x1 0x3
Wait 0xa
LoadAnim 0x0 0x0 0x14
Wait 0xa
PlaySound 0x72d 0xffffff8b
WaitSound 0x73b 0x75 0x5
Wait 0xa
ApplyCmd 0x24 0x5 0x3 0x0 0x1 0x2 0x108
ApplyCmd 0x24 0x5 0x3 0x0 0x1 0x2 0x110
WaitAnim
Cmd_35 0x0
End
One-turn > Two-turn Move (Solar Blade)

In this case study, the move Leaf Blade will be changed from a one-turn move with high critical hit chance to a two-turn sun-powered move: a mechanical (but Physical) clone of Solar Beam. In this case the power, accuracy & PP of the move will be as-per Solar Beam, alternatively, the later generation values for these could be used.

This will be completed in a Pokémon HeartGold Version ROM, and will comprise of four steps:

  1. Edit the move effect and attributes/data
  2. Edit the move description texts
  3. Edit the move animation (so that the charging animation from Solar Beam is seen on turn one, and the Leaf Blade animation on turn two)
  4. Edit the required Pokémon learnsets

Step 1: Move Effect & Attributes

  1. Open DSPRE & load the ROM
  2. Open the Move Data Editor from the Other Editors toolbar option
  3. Select the move Solar Beam and make a note of the configuration:
    • Effect Sequence: 151
    • Power: 120
    • Accuracy: 100
    • PP: 10
    • Side Effect Probability: 0
  4. Select the move Leaf Blade and update the configuration to include the above (and anything else desirable).
  5. Click the Save button

Step 2: Move Description

  1. Open the Text Editor from the main toolbar
  2. Use the search function to find the move description, taking a small part of the text (as displayed in the Move Data Editor), e.g. "a sharp leaf"
  3. Update the message (349) to include a more accurate description (while retaining appropriate line breaks), for example changing the vanilla:
    • The foe is slashed\nwith a sharp leaf.\nIt has a high\ncritical-hit ratio.\n to something like:
    • A two-turn attack.\nThe user gathers\nlight, then slashes\nthe foe on the\nsecond turn.
  4. Click the Save Current Archive button
  5. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

Step 3: Move Animation

  1. Open WazaEffectEditor (for HGSS in this case)
  2. Select the move Solar Beam, and copy the initial and first-turn elements of the animation script (from Init to the second End).
  3. Select the move Solar Blade (previously Leaf Blade), paste the copied script at the beginning of the existing Leaf Blade script.
  4. Click the Save Current button to save the Animation script.
  5. Save the ROM from the File option on the toolbar.

Step 4: Adjust Learnsets

In this example, the Pokémon which learn the move will remain as-per Leaf Blade, including any that may learn via methods such as Egg Moves. However, the levels that these Pokémon learn the move will be altered to reflect the new power level of the updated move.

  1. Consult a source material to identify all Pokémon in the game which learn Leaf Blade by level up.
  2. Open DSPRE & load the ROM (from the .nds file to ensure animation changes are included)
  3. Decide which learnsets to adjust, in this example Grovyle & Sceptile's level up learnsets will be adjusted (and Victreelbel, Bellossom, Leafeon & Gallade will remain as-is).
  4. Open the Pokémon Editor from the Other Editors toolbar option, switch to the Learnset Editor tab.
  5. Select Grovyle and the move Solar Blade at level 29, click Edit.
  6. Enter a new level to be learned (e.g. 39), click Confirm.
  7. Click the Save button.
  8. Repeat steps 5-7 for Sceptile.
  9. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

The changes are now complete, and can be tested in-game. Below are examples of the changes in DSPRE & WazaEffectEditor.

Leaf Blade (WazaEffectEditor vanilla)
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x16e 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
LoadAnim 0x0 0x2 0x4
LoadAnim 0x0 0x3 0x4
LoadAnim 0x0 0x4 0x4
LoadAnim 0x0 0x1 0x4
LoadAnim 0x0 0x0 0x4
RepeatSound 0x779 0x75 0x2 0x7
Wait 0x1e
ApplyCmd 0x24 0x5 0x2 0x0 0x1 0x2 0x108
Wait_Func
WaitAnim
Cmd_35 0x0
End
Solar Beam (WazaEffectEditor vanilla)
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x6b 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
CheckTurn 0x3 0x2d
End
ApplyCmd 0x21 0x5 0x0 0x1 0x0 0xc 0x0
Wait_Func
LoadAnim 0x0 0x13 0x3
Wait 0xa
PlaySound 0x841 0xffffff8b
Wait 0x14
ApplyCmd 0x22 0x6 0x2 0x0 0x2 0x33ff 0xa 0x0
WaitAnim
Cmd_35 0x0
Wait_Func
ApplyCmd 0x21 0x5 0x0 0x1 0xc 0x0 0x0
Wait_Func
End
ApplyCmd 0x21 0x5 0x0 0x1 0x0 0xc 0x0
Wait_Func
LoadAnim 0x0 0x0 0x3
LoadAnim 0x0 0x8 0x3
LoadAnim 0x0 0x9 0x3
Wait 0x5
SomethingSound 0x7a6 0xffffff8b 0x75 0x4 0x2
Wait 0xf
LoadAnim 0x0 0xa 0x4
LoadAnim 0x0 0xb 0x4
LoadAnim 0x0 0x1 0x4
Wait 0x5
ApplyCmd 0x22 0x6 0x8 0x0 0x2 0x33ff 0xe 0x0
ApplyCmd 0x24 0x5 0x4 0x0 0x1 0xc 0x108
WaitAnim
Cmd_35 0x0
ApplyCmd 0x21 0x5 0x0 0x1 0xc 0x0 0x0
Wait_Func
End
Solar Blade (WazaEffectEditor custom two-turn)
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x6b 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
CheckTurn 0x3 0x2d
End
ApplyCmd 0x21 0x5 0x0 0x1 0x0 0xc 0x0
Wait_Func
LoadAnim 0x0 0x13 0x3
Wait 0xa
PlaySound 0x841 0xffffff8b
Wait 0x14
ApplyCmd 0x22 0x6 0x2 0x0 0x2 0x33ff 0xa 0x0
WaitAnim
Cmd_35 0x0
Wait_Func
ApplyCmd 0x21 0x5 0x0 0x1 0xc 0x0 0x0
Wait_Func
End
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x16e 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
LoadAnim 0x0 0x2 0x4
LoadAnim 0x0 0x3 0x4
LoadAnim 0x0 0x4 0x4
LoadAnim 0x0 0x1 0x4
LoadAnim 0x0 0x0 0x4
RepeatSound 0x779 0x75 0x2 0x7
Wait 0x1e
ApplyCmd 0x24 0x5 0x2 0x0 0x1 0x2 0x108
Wait_Func
WaitAnim
Cmd_35 0x0
End
+2 Accuracy Status Move (Sharp Eyes)

In this case study, the move Mind Reader will be changed from a guaranteed next turn hits status move to a increase accuracy by two stages status move. Much of the move attributes and data will be aligned to similar status moves like Calm Mind, Agility etc.

This will be completed in a Pokémon HeartGold Version ROM, and will comprise of five steps:

  1. Fix unused stat change effect scripts
  2. Edit the move effect and attributes/data
  3. Edit the move description texts
  4. Edit the move animation (copying the Glare animation)
  5. Edit the required Pokémon learnsets

Step 1: Fix Unused Stat Stage Effects

  1. Follow the steps here to correct the "non-implemented" move effect scripts.

Step 2: Move Effect & Attributes

  1. Open DSPRE & load the ROM
  2. Open the Move Data Editor from the Other Editors toolbar option
  3. Select the move Mind Reader and make the following configuration changes:
    • Effect Sequence: 055
    • Type: Dark
    • Range: USER
    • PP: 30
    • Contest Appeal: 11
    • Flags: SNATCH KEEP_HP_BAR
  4. Click the Save button

Step 3: Move Description

  1. Open the Text Editor from the main toolbar
  2. Use the search function to find the move description, taking a small part of the text (as displayed in the Move Data Editor), e.g. "foe's movements"
  3. Update the message (170) to include a more accurate description (while retaining appropriate line breaks), for example changing the vanilla:
    • The user senses the\nfoe’s movements\nwith its mind to\nensure its next\nattack does not miss. to something like:
    • The user’s predatory\neyesight focuses\non it’s targets.\nIt sharply boosts\nthe Accuracy stat.
  4. Click the Save Current Archive button
  5. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

Step 4: Move Animation

  1. Open WazaEffectEditor (for HGSS in this case)
  2. Select the move Glare, and copy entire animation script.
  3. Select the move Sharp Eyes (previously Mind Reader)
    • Delete everything after the final Cmd_3c.
    • Paste the copied script in place of the deleted elements.
  4. Click the Save Current button to save the Animation script.
  5. Save the ROM from the File option on the toolbar.

Step 5: Adjust Learnsets

In this example, the Pokémon which learn the move will be changed to limit the new move to some specific Pokémon, and Egg Move learnsets will also be adjusted.

  1. Consult a source material to identify all Pokémon in the game which learn Mind Reader by level up.

Level-Up Learnset Changes

  1. Open DSPRE & load the ROM (from the .nds file to ensure animation changes are included)
  2. Decide which new Pokémon will learn this move, and at what level, in this example we will add the move to the learnsets of some "predatory" Pokémon such as Sneasel, Spinarak, Kabuto, Hoothoot and their evolutions.
  3. Open the Pokémon Editor from the Other Editors toolbar option, switch to the Learnset Editor tab.
  4. Select Sneasel, choose the move Sharp Eyes, and enter the level it will be learned at.
  5. Click Add and click the Save button.
  6. Repeat steps 5-6 for any other Pokémon that will learn the new move.
  7. Decide which Pokémon that did learn Mind Reader, which will no longer learn Sharp Eyes. In this example the move will be replaced with the effective Mind Reader clone: Miracle Eye (though they could also be removed from the learnset), we will perform this substitution for Meditite and Medicham.
  8. Select Meditite and the move Sharp Eyes at level 18, click Edit.
  9. Enter a new move to be learned (e.g. Miracle Eye), click Confirm.
  10. Click the Save button.
  11. Repeat steps 9-11 for any other Pokémon that will learn Miracle Eye instead of Sharp Eyes the new move.
  12. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

Egg Move Learnset Changes

  1. Decide which new Pokémon will learn Sharp Eyes as an Egg Move, and which that did learn Mind Reader will no longer. In this example Surskit will no longer learn Sharp Eyes via breeding (Egg Move), but Eevee will. This one-to-one swap could be accomplished on any Generation IV version.
  2. Using DSPRE, unpack the egg move NARC /a/2/2/9, resulting in a single hex file (if following this example in Platinum or Diamond/Pearl, refer to this section for the relevant Overlay & Offset to edit instead).
  3. Using a hex editor such as HxD, open the file and find Surskit's data:
    • Surskit's National Dex ID + 20000 = 20283, or 0x4F3B in hex. This means that the hex string 3B 4F is the marker for Surskit's data.
  4. Find the bytes that relate to it being able to learn Sharp Eyes, which are very soon after Surskit's marker, and before the next Pokémon's marker (i.e. another very large hex number). The move ID is 170, or 0xAA in hex, this means that the hex string AA 00 is the notation for this move compatibility.
  5. Delete those bytes.
  6. Now find Eevee's data:
    • Eevee's National Dex ID + 20000 = 20133, or 0x4EA5 in hex. This means that the hex string A5 4E is the marker for Eevee's data.
  7. Add the bytes required (AA 00) for move ID 170 anywhere after Eevee's marker, and before the next Pokémon's marker (i.e. another very large hex number). This could be immediately after the A5 4E bytes, as order does not matter in this list.
  8. Save the file.
  9. Move any backup files created by the hex editor out of the folder.
  10. Using DSPRE, pack the egg move NARC from the edited folder, remove the .narc file extension and override the original NARC file with this updated one.
  11. Open DSPRE & load the ROM from the contents folder.
  12. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

The changes are now complete, and can be tested in-game. Below are examples of the changes in DSPRE & WazaEffectEditor.

Glare (WazaEffectEditor vanilla)
ApplyCmd 0x21 0x5 0x0 0x1 0x0 0xc 0x0
Wait_Func
Cmd_49 0x0 0x1 0x1 0x1 0x1 0x1 0x0 0x0
Cmd_4a 0x0 0x6
Cmd_4b 0x0 0x6 0x1
Cmd_4c 0x0 0x6
Cmd_4d 0x0 0x6
Cmd_4e 0x0 0x7 0x6 0x6 0x6 0x6 0x0 0x0 0x0
Wait 0x8
PlaySound 0x78d 0x0
Wait_Func
Cmd_50 0x0
ApplyCmd 0x21 0x5 0x0 0x1 0xc 0x0 0x0
Wait_Func
End
Sharp Eyes (WazaEffectEditor custom)
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0xbf 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
ApplyCmd 0x21 0x5 0x0 0x1 0x0 0xc 0x0
Wait_Func
Cmd_49 0x0 0x1 0x1 0x1 0x1 0x1 0x0 0x0
Cmd_4a 0x0 0x6
Cmd_4b 0x0 0x6 0x1
Cmd_4c 0x0 0x6
Cmd_4d 0x0 0x6
Cmd_4e 0x0 0x7 0x6 0x6 0x6 0x6 0x0 0x0 0x0
Wait 0x8
PlaySound 0x78a 0xffffff8b
WaitSound 0x78a 0xffffff8b 0x1e
WaitAnim
Cmd_35 0x0
ApplyCmd 0x21 0x5 0x0 0x1 0xc 0x0 0x0
Wait_Func
End
Move with -1 Evasion Side Effect (Constrict)

In this case study, the move Constrict will be changed to have a guaranteed one stage drop to evasion, and an increase to base power to become a mechanical clone of Mud-Slap.

This will be completed in a Pokémon HeartGold Version ROM, and will comprise of three steps:

  1. Fix unused stat change effect scripts
  2. Edit the move effect and attributes/data
  3. Edit the move description texts

Step 1: Fix Unused Stat Stage Effects

  1. Follow the steps here to correct the "non-implemented" move effect scripts.

Step 2: Move Effect & Attributes

  1. Open DSPRE & load the ROM
  2. Open the Move Data Editor from the Other Editors toolbar option
  3. Select the move Mind Reader and make the following configuration changes:
    • Effect Sequence: 055
    • Type: Dark
    • Range: USER
    • PP: 30
    • Contest Appeal: 11
    • Flags: SNATCH KEEP_HP_BAR
  4. Click the Save button

Step 3: Move Description

  1. Open the Text Editor from the main toolbar
  2. Use the search function to find the move description, taking a small part of the text (as displayed in the Move Data Editor), e.g. "foe's movements"
  3. Update the message (132) to include a more accurate description (while retaining appropriate line breaks), for example changing the vanilla:
    • The foe is attacked\nwith long, creeping\ntentacles or vines.\nIt may also lower the\ntarget’s Speed. to something like:
    • The foe is attacked\nwith long tentacles,\nvines or threads\nwhich lower the\ntarget’s Evasion.
  4. Click the Save Current Archive button
  5. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

The changes are now complete, and can be tested in-game. Below are examples of the changes in DSPRE.

+1 Sp.Atk, Sp.Def & Spd Status Move (Quiver Dance)

In this case study, the move Dragon Dance will be replaced with Quiver Dance. The move attributes will be aligned to the later generation implementation. The same approach can be taken to replicate other moves which adjust three different stats (Coil, Hone Claws), and an extension of this can be used for moves which affect even more (such as Shell Smash).

This will be completed in a Pokémon HeartGold Version ROM, and will comprise of five steps:

  1. Re-write the Dragon Dance sub-script
  2. Edit the move effect and attributes/data
  3. Edit the move description texts
  4. Edit the move animation
  5. Edit the required Pokémon learnsets

Note: the alternate method to achieve this is described in Drayano's tutorial, linked above.

Step 1: Re-write the Dragon Dance Sub-Script

  1. Using DSPRE, unpack the move effect sub-scripts NARC /a/0/0/1.
  2. Open file 152 in a hex editor such as HxD.
  3. Delete the contents of the file and replace it with the below.
21 00 00 00 01 00 00 00 07 00 00 00 16 00 00 00 0C 00 00 00 0C 00 00 00 21 00 00 00 01 00 00 00 07 00 00 00 17 00 00 00 0C 00 00 00 06 00 00 00 21 00 00 00 00 00 00 00 07 00 00 00 15 00 00 00 0C 00 00 00 29 00 00 00 3C 00 00 00 4C 00 00 00 32 00 00 00 0A 00 00 00 06 00 00 00 00 00 20 00 32 00 00 00 0A 00 00 00 06 00 00 00 01 40 00 00 32 00 00 00 0A 00 00 00 3C 00 00 00 80 00 00 00 32 00 00 00 07 00 00 00 22 00 00 00 12 00 00 00 3C 00 00 00 0C 00 00 00 32 00 00 00 07 00 00 00 22 00 00 00 13 00 00 00 3C 00 00 00 0C 00 00 00 32 00 00 00 07 00 00 00 22 00 00 00 11 00 00 00 3C 00 00 00 0C 00 00 00 32 00 00 00 0B 00 00 00 3C 00 00 00 02 00 00 00 32 00 00 00 0B 00 00 00 3C 00 00 00 80 00 00 00 E0 00 00 00 11 00 00 00 0E 00 00 00 1E 00 00 00 1E 00 00 00 12 00 00 00 00 03 00 00 02 00 00 00 07 00 00 00 0E 00 00 00 1E 00 00 00 1E 00 00 00 32 00 00 00 0A 00 00 00 0A 00 00 00 00 00 00 80 E0 00 00 00
  1. Save the file.
  2. Move any backup files created by the hex editor out of the folder.
  3. Using DSPRE, pack the move effect sub-scripts NARC from the edited folder, remove the .narc file extension and override the original NARC file with this updated one.
  4. Open DSPRE & load the ROM from the contents folder.
  5. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

Step 2: Move Effect & Attributes

  1. Open DSPRE & load the ROM
  2. Open the Move Data Editor from the Other Editors toolbar option
  3. Select the move Dragon Dance and make the following configuration changes:
    • Effect Sequence: 055
    • Type: Bug
    • Contest Condition: Beautiful
    • Contest Appeal: 6
  4. Click the Save button

Step 3: Move Description

  1. Open the Text Editor from the main toolbar
  2. Use the search function to find the move description, taking a small part of the text (as displayed in the Move Data Editor), e.g. "foe's movements"
  3. Update the message (349) to include a more accurate description (while retaining appropriate line breaks), for example changing the vanilla:
    • The user vigorously\nperforms a mystic,\npowerful dance that\nboosts its Attack and\nSpeed stats. to something like:
    • The user lightly\nperforms a mystic,\nbeautiful dance that\nboosts its Sp. Atk,\nSp. Def, & Speed stats.
  4. Click the Save Current Archive button
  5. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

Step 4: Move Animation

For the move animation, elements of Lunar Dance, Petal Dance & Thrash will be combined.

  1. Open WazaEffectEditor (for HGSS in this case)
  2. Select the move Lunar Dance, and copy the animation script from the first Init (after the CheckTurn) all the way to the next End (lines 4-75).
  3. Select the move Quiver Dance (previously Dragon Dance), and replace the entire animation script with the script elements copied in the previous step.
  4. Delete the elements that set the background:
    • Delete the ChangeBackG 0x2a 0x20001 and WaitBack2 elements (setting the special background).
    • Delete the BackBackG 0x2a 0x40001 and WaitBack2 elements (restoring the normal background).
  5. Click the Save Current button to save the Animation script.
  6. Select the move Petal Dance, and copy the second PlaySound line (PlaySound 0x7aa 0x75), which is responsible for the sound played when Petal Dance hits the opponent. This will be the sound played when Quiver Dance is used.
  7. Select the move Quiver Dance (previously Dragon Dance), and locate the PlaySound line (PlaySound 0x836 0xffffff8b). Replace this with the copied element.
  8. Click the Save Current button to save the Animation script.
  9. Select the move Thrash, and copy the elements that relate to the user's sprite movement (lines starting ApplyCmd 0x3c... and ApplyCmd 0x24...).
  10. Select the move Quiver Dance (previously Dragon Dance), add a new line between Cmd_3a 0x2 0x0 0x1 0x1 and Wait 0x1, then:
    • Paste the two copied lines.
    • Add a new line with Wait 0x3.
    • Add a new line with Wait_Func.
    • Paste the two copied lines.
  11. Click the Save Current button to save the Animation script.
  12. Save the ROM from the File option on the toolbar.

Step 5: Adjust Learnsets

In this example, the Pokémon which learn the move will be changed completely, and some new Pokémon will be able to learn this move by breeding.

  1. Consult a source material to identify all Pokémon in the game which learn Dragon Dance.

Level-Up Learnset Changes

  1. Open DSPRE & load the ROM (from the .nds file to ensure animation changes are included)
  2. Decide which new Pokémon will learn this move, and at what level, in this example we will add the move to the learnsets of some Bug & Grass type Pokémon such as Butterfree and Bellossom. The targets could be chosen by reviewing Generation V learnsets and aligning.
  3. Open the Pokémon Editor from the Other Editors toolbar option, switch to the Learnset Editor tab.
  4. Select Butterfree, choose the move Quiver Dance, and enter the level it will be learned at.
  5. Click Add and click the Save button.
  6. Repeat steps 5-6 for any other Pokémon that will learn the new move.
  7. Decide which Pokémon that did learn Dragon Dance, which will no longer learn Quiver Dance. In this example the move will be deleted entirely from their learnset, this will be done for Horsea, Dratini and their evolutions, Altaria, Tropius, Latios and Rayquaza.
  8. Select Horsea and the move Quiver Dance at level 45, click Delete.
  9. Click the Save button.
  10. Repeat steps 9-10 for any other Pokémon that will no longer learn Quiver Dance.
  11. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

Egg Move Learnset Changes

  1. Decide which new Pokémon will learn Quiver Dance as an Egg Move. In this example Smoochum, Zigzagoon, Lotad, Luvdisc and Cherubi will be made compatible with Quiver Dance as an Egg Move. This is an addition of a move, only possible in HGSS. To accomplish this with DDPt, another Egg Move would need removing from anywhere else in the Egg Move data to ensure the data remained at exact same size overall.
  2. Using DSPRE, unpack the egg move NARC /a/2/2/9, resulting in a single hex file (if following this example in Platinum or Diamond/Pearl, refer to this section for the relevant Overlay & Offset to edit instead).
  3. Using a hex editor such as HxD, open the file and find Smoochum's data:
    • Smoochum's National Dex ID + 20000 = 20239, or 0x4F0F in hex. This means that the hex string 0F 4F is the marker for Smoochum's data.
  4. Add the bytes required (84 00) for move ID 132 (or 0x84 in hex) anywhere after Smoochum's marker, and before the next Pokémon's marker (i.e. another very large hex number). This could be immediately after the 0F 4F bytes, as order does not matter in this list.
  5. Repeat steps 15 and 16 for any other Pokémon that will learn Quiver Dance by breeding (Egg Move).
  6. Save the file.
  7. Move any backup files created by the hex editor out of the folder.
  8. Using DSPRE, pack the egg move NARC from the edited folder, remove the .narc file extension and override the original NARC file with this updated one.
  9. Open DSPRE & load the ROM from the contents folder.
  10. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

The changes are now complete, and can be tested in-game. Below are examples of the changes in DSPRE & WazaEffectEditor.

Lunar Dance (WazaEffectEditor vanilla)
CheckTurn 0x3 0xed
End
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x1df 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x1 0x1df 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
Cmd_c 0x4 0x0
Cmd_c 0x0 0x0
Cmd_c 0x1 0x1
ChangeBackG 0x2a 0x20001
WaitBack2
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_3a 0x0 0x0 0x0 0x0
Cmd_3a 0x2 0x0 0x1 0x1
Wait 0x1
ApplyCmd 0x4b 0x5 0x0 0x51 0x3 0x0 0x0
ApplyCmd 0x4b 0x5 0x1 0x50 0x3 0x0 0x2
Wait 0x1
PlaySound 0x836 0xffffff8b
LoadAnim 0x0 0x3 0x3
LoadAnim 0x0 0x0 0x3
LoadAnim 0x1 0x1 0x11
Cmd_37 0x6 0x0 0x1 0x5 0x0 0x0 0x0
Cmd_37 0x4 0x1 0x0 0xfffff948 0x0
LoadAnim 0x1 0x2 0x11
Cmd_37 0x6 0x0 0x1 0x5 0x0 0x0 0x0
Cmd_37 0x4 0x1 0x0 0xfffff948 0x0
ApplyCmd 0x3f 0x6 0x2 0x0 0x1 0x0 0xa 0x33ff
Wait 0x14
ApplyCmd 0x3f 0x6 0x2 0x0 0x1 0xa 0x0 0x33ff
WaitAnim
Cmd_35 0x0
Cmd_35 0x1
Wait_Func
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3b
Cmd_c 0x4 0x0
Cmd_c 0x0 0x0
Cmd_c 0x1 0x1
Cmd_c 0x4 0x1
BackBackG 0x2a 0x40001
WaitBack2
End
Cmd_c 0x4 0x0
Cmd_c 0x0 0x0
Cmd_c 0x1 0x1
ChangeBackG 0x2a 0x20001
WaitBack2
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x1df 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x1 0x1df 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
PlaySound 0x836 0xffffff8b
LoadAnim 0x0 0x3 0x3
LoadAnim 0x0 0x0 0x3
Wait 0x14
ApplyCmd 0x22 0x6 0x2 0x0 0x1 0x7fff 0xa 0x0
Wait_Func
WaitAnim
Cmd_35 0x0
Cmd_35 0x1
Cmd_c 0x4 0x0
Cmd_c 0x0 0x0
Cmd_c 0x1 0x1
Cmd_c 0x4 0x1
BackBackG 0x2a 0x40001
WaitBack2
End
Quiver Dance (WazaEffectEditor custom)
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x1df 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x1 0x1df 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
Cmd_c 0x4 0x0
Cmd_c 0x0 0x0
Cmd_c 0x1 0x1
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_3a 0x0 0x0 0x0 0x0
Cmd_3a 0x2 0x0 0x1 0x1
ApplyCmd 0x3c 0x3 0x2 0x1 0xc
ApplyCmd 0x24 0x5 0x4 0x0 0x1 0x4 0x108
Wait 0x3
Wait_Func
ApplyCmd 0x3c 0x3 0x2 0x1 0xc
ApplyCmd 0x24 0x5 0x4 0x0 0x1 0x4 0x108
Wait 0x1
ApplyCmd 0x4b 0x5 0x0 0x51 0x3 0x0 0x0
ApplyCmd 0x4b 0x5 0x1 0x50 0x3 0x0 0x2
Wait 0x1
PlaySound 0x7aa 0x75
LoadAnim 0x0 0x3 0x3
LoadAnim 0x0 0x0 0x3
LoadAnim 0x1 0x1 0x11
Cmd_37 0x6 0x0 0x1 0x5 0x0 0x0 0x0
Cmd_37 0x4 0x1 0x0 0xfffff948 0x0
LoadAnim 0x1 0x2 0x11
Cmd_37 0x6 0x0 0x1 0x5 0x0 0x0 0x0
Cmd_37 0x4 0x1 0x0 0xfffff948 0x0
ApplyCmd 0x3f 0x6 0x2 0x0 0x1 0x0 0xa 0x33ff
Wait 0x14
ApplyCmd 0x3f 0x6 0x2 0x0 0x1 0xa 0x0 0x33ff
WaitAnim
Cmd_35 0x0
Cmd_35 0x1
Wait_Func
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3b
Cmd_c 0x4 0x0
Cmd_c 0x0 0x0
Cmd_c 0x1 0x1
Cmd_c 0x4 0x1
End
Sound-based Move (Snarl)

In this case study, the move Barrage will be replaced with the sound-based move from Generation V Pokémon games: Snarl. The attributes of the move will be as they are in Generation V, the animation will be a custom animation using components of other animations (Giga Impact & Howl).

This will be completed in a Pokémon HeartGold Version ROM, and will comprise of four steps:

  1. Edit the move effect and attributes/data
  2. Edit the move description texts
  3. Edit the move animation (so that the charging animation from Solar Beam is seen on turn one, and the Leaf Blade animation on turn two)
  4. Edit the required Pokémon learnsets

Step 1: Move Effect & Attributes

  1. Open DSPRE & load the ROM
  2. Open the Move Data Editor from the Other Editors toolbar option
  3. Select the move Barrage and update the configuration to:
    • Type: DARK
    • Split: SPECIAL
    • Effect Sequence: 71
    • PP: 15
    • Power: 55
    • Accuracy: 95
    • Range: BOTH
  4. Click the Save button

Step 2: Move Description

  1. Open the Text Editor from the main toolbar
  2. Use the search function to find the move description, taking a small part of the text (as displayed in the Move Data Editor), e.g. "Round objects"
  3. Update the message (140) to include a more accurate description (while retaining appropriate line breaks), for example changing the vanilla:
    • Round objects are\nhurled at the foe to\nstrike two to five\ntimes in a row.\n to something like:
    • The user attacks\nwith an aggressive\ngrowl, lowering the\nSp. Atk of the foes.
  4. Click the Save Current Archive button
  5. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

Step 3: Move Animation

  1. Open WazaEffectEditor (for HGSS in this case)
  2. Select the move Howl, and copy the animation script.
  3. Select the move Snarl (previously Barrage), delete the entire script and paste the copied script in it's place.
  4. Click the Save Current button to save the Animation script.
  5. Select the move Giga Impact, and copy the elements of the animation script that relate to the background animation:
Cmd_43
Cmd_c 0x7 0x1
ChangeBackG 0x5 0x800001
Cmd_43
Cmd_c 0x7 0x1
BackBackG 0x5 0x1000001
WaitBack2
  1. Select the move Snarl (previously Barrage), and paste the background animation into the script in the same relative position as they were in the Giga Impact animation script:
    • First element: immediately after Cmd_3c 0x3
    • Second element: immediately before End
  2. Click the Save Current button to save the Animation script.
  3. Save the ROM from the File option on the toolbar.

Step 4: Adjust Learnsets

In this example, the Pokémon which learn the move will be changed completely, and some new Pokémon will be able to learn this move by breeding.

  1. Consult a source material to identify all Pokémon in the game which learn Barrage.

Level-Up Learnset Changes

  1. Open DSPRE & load the ROM (from the .nds file to ensure animation changes are included)
  2. Decide which new Pokémon will learn this move, and at what level, in this example we will add the move to the learnsets of some "canine" Pokémon such as Houndour, Vulpix, Poochyena and their evolutions. The targets could be chosen by reviewing Generation V learnsets.
  3. Open the Pokémon Editor from the Other Editors toolbar option, switch to the Learnset Editor tab.
  4. Select Houndour, choose the move Snarl, and enter the level it will be learned at.
  5. Click Add and click the Save button.
  6. Repeat steps 5-6 for any other Pokémon that will learn the new move.
  7. Decide which Pokémon that did learn Barrage, which will no longer learn Snarl. In this example the move will be deleted entirely from their learnset, this will be done for Exeggcute and Exeggutor.
  8. Select Exeggcute and the move Snarl at level 1, click Delete.
  9. Click the Save button.
  10. Repeat steps 9-10 for any other Pokémon that will no longer learn Snarl (Exeggutor).
  11. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

Egg Move Learnset Changes

  1. Decide which new Pokémon will learn Snarl as an Egg Move. In this example Growlithe will be made compatible with Snarl as an Egg Move. This is an addition of a move, only possible in HGSS. To accomplish this with DDPt, another Egg Move would need removing from anywhere else in the Egg Move data to ensure the data remained at exact same size overall.
  2. Using DSPRE, unpack the egg move NARC /a/2/2/9, resulting in a single hex file (if following this example in Platinum or Diamond/Pearl, refer to this section for the relevant Overlay & Offset to edit instead).
  3. Using a hex editor such as HxD, open the file and find Growlithe's data:
    • Growlithe's National Dex ID + 20000 = 20058, or 0x4E5A in hex. This means that the hex string 5A 4E is the marker for Growlithe's data.
  4. Add the bytes required (8C 00) for move ID 140 (or 0x8C in hex) anywhere after Growlithe's marker, and before the next Pokémon's marker (i.e. another very large hex number). This could be immediately after the 5A 4E bytes, as order does not matter in this list.
  5. Save the file.
  6. Move any backup files created by the hex editor out of the folder.
  7. Using DSPRE, pack the egg move NARC from the edited folder, remove the .narc file extension and override the original NARC file with this updated one.
  8. Open DSPRE & load the ROM from the contents folder.
  9. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

The changes are now complete, and can be tested in-game. Below are examples of the changes in DSPRE & WazaEffectEditor.

Howl (WazaEffectEditor vanilla)
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x162 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
PlayCry 0x3 0xffffff8b 0x7f
ApplyCmd 0x2a 0x8 0x102 0x64 0x50 0x64 0x96 0x64 0x140001 0x60006
LoadAnim 0x0 0x1 0x11
Cmd_37 0x6 0x0 0x2 0x6 0x1 0x0 0x0
Wait 0x5
LoadAnim 0x0 0x0 0x11
Cmd_37 0x6 0x0 0x2 0x1 0x0 0x0 0x0
StopCry 0x0
Wait 0x2
Wait_Func
WaitAnim
Cmd_35 0x0
End
Giga Impact (WazaEffectEditor vanilla)
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x1b2 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
PlaySound 0x736 0xffffff8b
ApplyCmd 0x39 0x4 0x4 0xfffffff0 0x8 0x102
Wait_Func
Wait 0xf
Cmd_43
Cmd_c 0x7 0x1
ChangeBackG 0x5 0x800001
PlaySound 0x737 0xffffff8b
ApplyCmd 0x39 0x4 0x4 0x20 0xfffffff0 0x102
Wait_Func
LoadAnim 0x0 0x4 0x11
Cmd_37 0x6 0x0 0x2 0x2 0x0 0x0 0x0
LoadAnim 0x0 0x2 0x11
Cmd_37 0x6 0x0 0x2 0x2 0x0 0x0 0x0
LoadAnim 0x0 0x3 0x11
Cmd_37 0x6 0x0 0x2 0x2 0x0 0x0 0x0
LoadAnim 0x0 0x0 0x11
Cmd_37 0x6 0x0 0x2 0x2 0x0 0x0 0x0
LoadAnim 0x0 0x1 0x11
Cmd_37 0x6 0x0 0x2 0x2 0x0 0x0 0x0
ApplyCmd 0x39 0x4 0x4 0xfffffff0 0x8 0x102
Wait 0xa
PlaySound 0x743 0x75
ApplyCmd 0x24 0x5 0x4 0x0 0x1 0x2 0x108
ApplyCmd 0x44 0x5 0x0 0x5 0x0 0x5 0x0
Wait_Func
WaitAnim
Cmd_35 0x0
Cmd_43
Cmd_c 0x7 0x1
BackBackG 0x5 0x1000001
WaitBack2
End
Snarl (WazaEffectEditor custom)
Init
Cmd_39 0x0
Cmd_39 0x1
Cmd_39 0x2
Cmd_39 0x3
Cmd_3a 0x4 0x0 0x0 0x0
Cmd_3a 0x5 0x0 0x1 0x1
Cmd_3a 0x6 0x0 0x2 0x2
Cmd_3a 0x7 0x0 0x3 0x3
ApplyCmd 0x4e 0x1 0x0
SetPlayAnim 0x0 0x162 0x1
Cmd_3b
Cmd_3c 0x0
Cmd_3c 0x1
Cmd_3c 0x2
Cmd_3c 0x3
Cmd_43
Cmd_c 0x7 0x1
ChangeBackG 0x5 0x800001
PlayCry 0x3 0xffffff8b 0x7f
ApplyCmd 0x2a 0x8 0x102 0x64 0x50 0x64 0x96 0x64 0x140001 0x60006
LoadAnim 0x0 0x1 0x11
Cmd_37 0x6 0x0 0x2 0x6 0x1 0x0 0x0
Wait 0x5
LoadAnim 0x0 0x0 0x11
StopCry 0x0
Wait 0x2
Wait_Func
WaitAnim
Cmd_35 0x0
Cmd_43
Cmd_c 0x7 0x1
BackBackG 0x5 0x1000001
WaitBack2
End
Punching Move (Rock Smash)

In this example, Rock Smash will become a punching move in HeartGold Version, and thus recieve the Iron Fist damage boost when used.

To accomodate this without re-pointing the relevant table, the move Comet Punch will be removed from the punching move category, and removed from the learnsets of all Pokémon (this is a low-distribution move which is only learned by level up, and not TM, Tutor or Egg Move in Generation IV).

  1. Open DSPRE & load the ROM.
  2. Open the Overlay Editor from the Other Editors toolbar option.
  3. Decompress and mark as decompressed Overlay_0012.
  4. Using a hex editor such as HxD, open the decompressed overlay_0012 file and go to Offset 0x352FE.
  5. Identify the bytes that represent Comet Punch (Move ID: 4): 04 00, which are within the list of fifteen moves (30 bytes).
  6. Replace these with the bytes that represent Rock Smash (Move ID: 249): F9 00.
  7. Save the overlay and move any backup (e.g. .bak) files out of the folder.
  8. Open DSPRE & load the ROM from the contents folder.
  9. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.
Trapping Move (Twister)

In this case study, the move Twister will be changed from a damage-dealing move (with it's own special effects, such as chance to flinch and dealing double-damage to targets in the semi-invulnerable turns of Fly & Bounce), to a Dragon-type variant of Fire Spin in Pokémon HeartGold Version. The standard animation of Twister will be used, and applied both as the move is used, and as the end of turn damage is applied. No learnset changes will be made in this case study.

This will be completed in a Pokémon HeartGold Version ROM, and will comprise of four steps:

  1. Edit the move effect and attributes/data
  2. Edit the move description texts
  3. Set up the end of turn trapping animation
  4. Set up the initial trapping texts

Step 1: Move Effect & Attributes

  1. Open DSPRE & load the ROM
  2. Open the Move Data Editor from the Other Editors toolbar option
  3. Select the move Twister and update the configuration to:
    • Effect Sequence: 042
    • Side Effect Probability: 0
    • Range: no checkboxes selected (normal range)
    • Other elements such as power, accuracy, contest data & priority are not edited in this example (but could be).
  4. Click the Save button

Step 2: Move Description

  1. Open the Text Editor from the main toolbar
  2. Use the search function to find the move description, taking a small part of the text (as displayed in the Move Data Editor), e.g. "Round objects"
  3. Update the message (239) to include a more accurate description (while retaining appropriate line breaks), for example changing the vanilla:
    • The user whips up a\nvicious tornado to\ntear at the foe.\nIt may also make the\nfoe flinch. to something like:
    • The user traps the\nfoe inside a vicious\ntornado for two to\nfive turns.
  4. Click the Save Current Archive button
  5. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.

Step 3: End of Turn Trapping Animation

  1. Unpack the /a/0/1/0 NARC (using the DSPRE "Unpack NARC to Folder" function).
  2. Locate the animation for Twister (file 239) and copy the whole animation file contents.
  3. Unpack the /a/0/6/1 NARC (using the DSPRE "Unpack NARC to Folder" function).
  4. Add a new file at the end (file 50), this will contain the new trapping animation.
  5. Paste in the content copied in step 2, save the file.
  6. Move any backup (e.g. .bak) files out of the folder.
  7. Pack the modified /a/0/6/1 NARC back up (using the DSPRE "Build NARC from folder" function).
  8. Replace the NARC in the ROM's extracted contents folder.
  9. Unpack the /a/0/0/1 NARC (using the DSPRE "Unpack NARC to Folder" function).
  10. Replace the contents of file 059 with the below, and save the file.
  11. Move any backup (e.g. .bak) files out of the folder.
  12. Pack the modified /a/0/0/1 NARC back up (using the DSPRE "Build NARC from folder").
37 00 00 00 00 00 00 00 FF 00 00 00 62 00 00 00 58 00 00 00 20 00 00 00 00 00 00 00 23 00 00 00 23 00 00 00 23 00 00 00 20 00 00 00 00 00 00 00 23 00 00 00 53 00 00 00 23 00 00 00 20 00 00 00 00 00 00 00 23 00 00 00 CF 01 00 00 23 00 00 00 20 00 00 00 00 00 00 00 23 00 00 00 80 00 00 00 23 00 00 00 20 00 00 00 00 00 00 00 23 00 00 00 FA 00 00 00 23 00 00 00 20 00 00 00 00 00 00 00 23 00 00 00 48 01 00 00 23 00 00 00 20 00 00 00 00 00 00 00 23 00 00 00 EF 00 00 00 23 00 00 00 45 00 00 00 FF 00 00 00 21 00 00 00 3B 00 00 00 21 00 00 00 45 00 00 00 FF 00 00 00 22 00 00 00 3B 00 00 00 1C 00 00 00 45 00 00 00 FF 00 00 00 23 00 00 00 3B 00 00 00 17 00 00 00 45 00 00 00 FF 00 00 00 24 00 00 00 3B 00 00 00 12 00 00 00 45 00 00 00 FF 00 00 00 25 00 00 00 3B 00 00 00 0D 00 00 00 45 00 00 00 FF 00 00 00 26 00 00 00 3B 00 00 00 08 00 00 00 45 00 00 00 FF 00 00 00 27 00 00 00 3B 00 00 00 03 00 00 00 45 00 00 00 FF 00 00 00 32 00 00 00 0E 00 00 00 12 00 00 00 06 01 00 00 0A 00 00 00 FF 00 00 00 FF 00 00 00 0E 00 00 00 1E 00 00 00 1E 00 00 00 32 00 00 00 0A 00 00 00 06 00 00 00 40 00 00 00 23 00 00 00 02 00 00 00 E0 00 00 00

Step 4: Initial Trapping Texts

In this case study, the initial trapping text used by Fire Spin will be used for Twister.

  1. Unpack the move scripts NARC (using the "DSPRE Unpack NARC to Folder function") (/a/0/0/0 in US Heartgold Version).
  2. Open the index for Fire Spin (83) and copy the contents.
  3. Open the index for Twister (239) and override the existing contents with the hex copied from Fire Spin.
  4. Move any backup (e.g. .bak) files out of the folder.
  5. Pack the NARC (using the "DSPRE Build NARC from Folder" function).
  6. Replace the NARC in the original location with the new version.
  7. Open DSPRE & load the ROM from the contents folder.
  8. Click the Save ROM button from the main toolbar to apply the changes to a .nds ROM file.
Roost to Needle Arm (TM51)

In this example TM51 will be changed from Roost to Needle Arm in Pokémon HeartGold Version.

  • The move data and animations for both moves remains as-per the vanilla HGSS game.
  • The TM is acquired in the same location, but the TM will teach Needle Arm instead of Roost.

This is a change of move, type, description & requires some NPC adjustments (the TM is still recieved as a Gym Leader reward from Faulkner in Violet City Gym).

The steps outlined in the TMs & HMs section are followed, with the below specific edits:

  • For the hex edits (ARM9):

    • Open the uncompressed ARM9 in a hex editor
    • Go to offset 0x100130 and replace 63 01 with 2E 01 to change the move index from 355 to 302.
    • Go to offset 0x100D66 and replace the third and fourth bytes of 9D 01 (413 - Flying) with 95 01 (405 - Grass).
    • Save the ARM9 file
  • For the text edits (DSPRE):

    • Open DSPRE (from the extracted folder of the ROM), and use the Text Editor to:
    • Change the content of message 378 in Text Archive 221 (TM51's description) to be a copy of message 302 from Text Archive 749 (Needle Arm's move summary description).
    • Change the content of message 4 in Text Archive 558 to replace references to "Roost" with "Needle Arm", and to ensure Faulker's conversation accurately describes the new move.
    • Save the ROM to .nds file using DSPRE.
  • For adjusting the TM learnsets:

    • Review Roost's summary page in Bulbapedia to note Pokémon to remove TM51 availability for.
    • Use the Pokémon editor in DSPRE to disable TM51 for all of these Pokémon.
    • Review Needle Arm's summary page in Bulbapedia to note Pokémon which can learn Needle Arm in the vanilla game.
    • Decide which other Pokémon will now be able to learn Needle Arm from TM51 (based on personal ROM hack goals/strategy), e.g. Snover & Abomasnow.
    • Use the Pokémon editor in DSPRE to enable TM51 for all of these Pokémon.