• Our software update is now concluded. You will need to reset your password to log in. In order to do this, you will have to click "Log in" in the top right corner and then "Forgot your password?".
  • Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.

16-Character Move Names Using the CFRU

  • Age 23
  • Seen today


Hi. This is a tutorial for getting around the ugly, ugly 12-character squashed move names under which we have all laboured for so long. No longer shall we suffer under the chains of First Press, Gras Terrain, or Water Stars; now, in areas limited by the GUI, we can have the infinitely-classier F.Impression, G. Terrain, and W. Shuriken, which, when used in battle or printed in strings that don't have any graphical limits to them, will be printed out fully as First Impression, Grassy Terrain, and Water Shuriken.

For the CFRU, at least. I'm sure you COULD rig up something like this for a hack without the CFRU, but I don't personally care to.

This is a bit of an ordeal, and I'm literally certain there are edge cases I've overlooked at the moment where the shortened move name is used instead of the longer one. Feel free to report any of these you find to me; the process of fixing them is pretty easy, it's finding them that's annoying. So let's talk about what you'll have to do.

Part 1: Setting the Table (haha)
First, you're going to want to dive into the strings folder, copy and paste attack_name_table.string, and rename the new file to something like attack_name_table_long.string. The first line in this file should read MAX_LENGTH=12 - go ahead and change that to MAX_LENGTH=16. Then, there's the line #org @gMoveNames - this is the name of the table and how the other files will recognize it. Change it to something memorable and simple, like, oh I don't know, #org @gLongMoveNames, just a suggestion. Now, whenever you want to reference this table instead of the wimpy 12-character one, you'll do so with gLongMoveNames rather than gMoveNames.

Minor problem: you have a new table, but every entry in that table is already declared, and that makes the compiler get a tummyache and complain. See how above all the names, there's an #org followed by an allcaps version of the move name? Like, for example, #org @NAME_POUND. You'll need to change all of those out. Thankfully, Notepad++ and most other editors can do mass find-and-replace; search for the string #org @NAME_, and replace it with #org @NAME_LONG_. There. Now, every move name in this table is declared separately.

The next part is largely going to be on you, fixing up both of the tables to your liking. Personally, if the full-length move name is 13 characters including a space, I'll shorten it just by removing the space (for example, Draining Kiss becomes DrainingKiss), and for all other moves, I'll target the first word in the name and abbreviate it - so Breaking Swipe would become Br. Swipe, Dazzling Gleam would become D. Gleam, and High Horsepower would be H.Horsepower. Note that for First Impression and High Horsepower, you can't have a space in the abbreviated name, but that is a small price to pay. You don't need to touch move names that already adhere to the 12-character or under limit, though for consistency's sake I'd advise going through and fixing up all the moves like DynamicPunch and PoisonPowder.

Okay! You've gotten your move table names souped up to your liking. Good on you. Now there's the matter of actually making these strings work in-game.

Part 2: Getting the Table Read in Battle
Thankfully, since the CFRU rewrites about the whole battle system, getting the strings into battle is easy. Crack open src\battle_strings.c. At the start of the file, line 27 or so, there should be a declaration, extern u8 gMoveNames[][MOVE_NAME_LENGTH + 1];. Immediately under this, declare the longer name table; it should read extern u8 gLongMoveNames[][MOVE_NAME_LENGTH + 5]; if you followed the instructions and called the table gLongMoveNames. The MOVE_NAME_LENGTH+5 part of that declaration tells the game that every entry should be 16 characters long (well, actually, 17 - one character for the terminator). Now you can call the long strings in printed messages. How? Locate the function within this file called BufferMoveNameBattle, which is where the game reads the strings from the move name tables. At the very last else statement, the line should read StringCopy(dst, gMoveNames[move]); - just replace this with StringCopy(dst, gLongMoveNames[move]);. Boom. Now the game should be using the longer names in battle, and the shorter names everywhere else.

Technically you can stop there. But let's not half-ass things, yeah? There are plenty of other places where you have the space to print the full names of the moves.

Part 3: Other Miscellany
We'll start with TMs. A nifty thing about the CFRU is that it actually has a built-in function for printing longer moves in the TM names, even though I don't think it's ever actually used. Well, we'll fix that. Open src\item.c, and at the top of the file, where gMoveNames is declared, declare gLongMoveNames in the exact same way you did before. The first functions you'll be modifying are, conveniently, back to back - CopyTMName and LoadTMNameWithNo. CopyTMName only has a single line, and all you need to do is replace the reference to gMoveNames with gLongMoveNames. Then, at the end of LoadTMNameWithNo, there's an if statement after a few StringAppends and before a StringCopy. Gut that entire if statement and replace it with StringAppendFullMoveName(gStringVar4, gLongMoveNames[ItemIdToBattleMoveId(itemId)]);. This will render all the TM names in a slightly smaller font, and they will now fit in the UI. The last function to fix is CheckTmPurchase - once again, there's a StringCopy with a reference to gMoveNames, and all you have to do is change that to gLongMoveNames.

Note that you can skip all of this if you don't have any move names longer than 12 characters in your TM list. Or if you do and are fine with them showing up abbreviated. I dunno, I'm not your boss.

Now, here's a scary bit. We're going to open scripts\insert.py and we're going to make a change that isn't just the offset to insert the data. Try not to faint while doing this. Really, though, it's super-duper easy, and, further, it's necessary, unless you want to keep track of a bunch of manual repoints and make those changes to the final ROM every time you build the CFRU like some kind of sucker. See, the CFRU has a nifty little feature where it automatically repoints every reference to the old move table that exists in the original ROM to the location of the new move table. This is handled in repointall. Sadly, we only want some of the old references to the move table to be replaced with the 16-character one; the others should continue to point to the 12-character table. Since the move name table is handled in repointall, this isn't usually possible. So we're going to scroll down to line 391, which should read # Read repoints from a file. Select this entire chunk of code up to line 425 and copy it. Then, scroll down to line 481, and paste the chunk of code in there. Then return to the original code chunk, and delete all of it. Now, the repoints read from the repoints file will be read AFTER the repoints from repointall, which means they'll be maintained instead of overwritten. This is vitally important.

Okay, you've done that, and probably need to shower from the stress of messing with The Sacred Texts and defiling them with your filthy, filthy coding hands. Don't shower yet. First, open repoints. The very first bit should be labelled ##Tables. Underneath the line gMoveDescriptions 08137BC8, add in the following (assuming your table is named gLongMoveNames; if it isn't, replace the name):
gLongMoveNames 080BFAA4
gLongMoveNames 08125BE4
gLongMoveNames 08125CE0
gLongMoveNames 0812606C
gLongMoveNames 08126128
gLongMoveNames 081261FC
gLongMoveNames 0812627C
gLongMoveNames 08126E64
This will handle move-teaching cases in the UI that are not touched by the CFRU, and therefore can't be changed natively. Mostly, this is for the party screen, when using TMs, move tutors, or the move deleter, with messages like, "X wants to learn the move Y!". Next, go to bytereplacement. Scroll to line 49, which should be just under ##End of Optional Byte Changes##. Add in the following:
##16-Character Move Name Limiters##
080BFA7C 11
08125B7E 11
08125C92 11
08126036 11
081260E8 11
081261BC 11
0812624A 11
08126E0A 11
This is necessary in tandem with the above change, because this will cause all those aforementioned UIs to read 17 characters per name, which, you may recall, is the length of each entry in our new table plus a terminator. If you don't change this, they'll still try to read 13 characters per name, and will output empty spaces or small, sad chunks of move names.

And... that's all! You're done. You should now have the shorter, abbreviated names appear in the summary screen and the move menu and other such areas, but they ought to turn into their proper names when used in battle. Have fun!
Last edited:

Dr. Seuss

Will finish GS Chronicles, I swear!
That's a very nice implementation. It always bothered me the abbreviated move names. I guess there's no way to have it applied to the in-battle moves box. I had the idea long time ago to remove the text "type/" and make the moves box wider but that will not do a big difference as far as I remember.

Thanks for the tutorial!
Thank you so much for this! It'll be coming to my hack in the next update; although getting it to work on TMs was super buggy for me (I've made a fair amount of changes to my CFRU which could be a reason, or maybe it's the DPP font patch I'm using?) so I just stuck to in-battle replacement and move learning. That'll more than suffice, it kind of hurt my soul having to reading stuff like Water Star and such.

Late reply, but here's a list of moves that need to be updated. There's probably more:

Clang Scales
Dark Lariat
Dragon Rise
Water Star
Double Iron
Mystic Fire
Power-Up Hit
Para Charge
Baneful Bunk
First Press
Giest Beam
Nature's Mad
Prism Laser
Revel Dance
Sparkle Aria
Spect Thief
Bad Tantrum
Sunsteel Ram
Teary Look
Elec Terrain
Gras Terrain
Mist Terrain
Psyc Terrain
Woods Curse
Light o Ruin
DMax Cannon
Fishy Rend
Clang Soul
Giant Blade (Behemoth Blade)
Giant Bash (Behemoth Bash)
Break Swipe
Weird Steam (Strange Steam)
False Yield
Expand Force
Rising Volt
Jealous Burn
Corrode Gas
Scorch Sands
Jungle Heal
Freeze Glare
Thunder Kick
Dragon Energy
Core Enforce
Steam Pump
Cliff Blades (Precipice Blades)
Space Fury
Space Hole
Disarm Cry
Dazzle Gleam
Doll Eyes
Drain Kiss

(if you have included added these moves from Crown Tundra / LGPE):
Astral Barr.
  • Age 32
  • Seen Jan 1, 2024
I know that this thread's a little old, but it was really helpful and I wanted to leave my thanks for it! I am familiar with CFRU's structure by now just from using it, but I don't have much of a mind for coding, so I often kind of follow instructions without really understanding what I'm actually doing, or I figure out what I want to do "backwards" by editing things blindly until I see the result I want. So I want to say I think you did a really good job of actually explaining the hows and whys with this tutorial. Again, thanks!