![]() |
Sierra's MEGA-HUGE XSE Scripting Tutorial
For the Level Scripting Tutorial, click here. Sierra's MEGA-HUGE XSE Scripting Tutorial (PokeScript tutorial originally by thethethethe) Don't Take Or Modify Without Permission Update XSE To Latest Version And Extract All Files Or Else This Tutorial May Not Be Compatible I want to say thanks to thethethethe for letting me take this tutorial and modify it for XSE compatibility. Also, I want to thank HackMew for making XSE in the first place, and for Irish Witch and PokeScript for getting me started on scripting. I also want to thank zel for making the hack (ShinyGold) that started me on the road to hacking. Since this is just a modification to thethethethe's original tutorial, you'll see very many similarities. XSE is a program created by Hackmew, as I've already said. This program is, in my opinion, the best scripting program there is, having many advantages over ScriptED, PokeScript, Diamond Cutter, and the likes. Some of the important features of XSE are: Dynamic Offsets All you need to find is the starting offset. XSE will find the rest. Less Raws, More Commands It's to make it easier. Instead of having to use #raw 0x53 0x07, you can just use hidesprite 0x07. This tutorial is going to cover a lot. I'll show a script at the beginning and then explain everything "new" after it. Please note that because I hack Fire Red, most scripts are written to suit Fire Red/Leaf Green, and NOT Ruby/Sapphire/Emerald. I think I'll start with pointers. Pointers XSE is great in the way that it uses dynamic offsets. You just put the starting offset (found in FSF {Free Space Finder}) and XSE will do the rest. You can use any random name for the pointer. It could be, for example... @blah ; @iliketoeatcheese ; @1234567890 As long as there are no spaces in it, and there aren't two exact same pointers, the pointer will work. So, for example, these won't work @mr potato head ; @i like mews ; @pikachu rocks. Message Scripts Now I can move onto a normal message script. Code:
#dynamic 0x(FSF Offset) is the starting offset for your script. XSE will do the rest. #org @start marks the start of the script, obviously. It shows that it's the beginning. lock will lock your player so that while this script is "in motion" the player won't be able to move. faceplayer is used to make the sprite you are talking with face you. message is used when you want a message to display on the screen. It's followed by a pointer that will be placed at the bottom as shown. The actual message will appear like this. Quote:
Now the number after the pointer. That number MUST follow a msgbox pointer. Without this, the message box won't appear. In this case, I've used 0x6. I'll cover more numbers later. Now we use release. This will release the locked player. end will end the script, stopping it from reading any bytes past it that could crash your game when used. Extra Message Info There are lots of other little add-ons that can be used with the message. Here's a short list of them: Quote:
\c usually refers to a color. This message: Quote:
Here's a short list of the new ones: Fire Red/Leaf Green Spoiler:
Ruby/Sapphire Spoiler:
Emerald Spoiler:
\h is used with hex values. Here's an example: Quote:
So in this example, I'm going to use "$": Quote:
Spoiler:
Instead of using the codes below, I recommend using the Text Adjuster, found under Tools>Text Adjuster. Just type it in, press "Convert", and paste it in. It's that simple! \n is used when we want to go to a new line. So this message: Quote:
Quote:
\l is used in text for a new line, but it can only be used after \n has already been used. So this message: Quote:
Quote:
\p is used when we want the text to continue in a new box. This message: Quote:
Quote:
\v is used when we want display stored text. Here's an example: Quote:
Quote:
Quote:
Msgbox Numbers Here are the many different types, taken directly from The ROM Hacking Newsletter, also located in the ROM Hacking section.This week's tip comes from HackMew. This time, it's all about msgboxes. Below is a description, script example and in-game shot of the different msgbox types. 0x2 Spoiler:
0x3 Spoiler:
0x4 Spoiler:
0x5 Spoiler:
0x6 Spoiler:
Flags Flags are very useful when you need an event to only occur once or if you want a person to disappear. Let's say you set flag 0x200. If you want an overworld to disappear, we have to assign the set flag (in this example, 0x200) to the overworld's people ID in Advance-Map. I'll go into more detail on that later. Many flags are used within the game already. If you plan on leaving scripts that are already in the ROM, you'll need to be more careful on what flags you use, because flags can only really be used once. If you want some flags that are used in the ROM already, here's a list: Taken directly from the XSE Comprehensive Scripting Guide, found here: Help>Guide Ruby/Sapphire Spoiler:
Fire Red/Leaf Green: Spoiler:
Emerald: Spoiler:
I'll have to do a bit of explaining here, so I'll start with preventing events to happen. I'll use #dynamic 0x800000 for the rest of my examples. Code:
checkflag checks if a flag has been set. Checkflag is always followed by an if line. When using the if line after checkflag, it contains either a 0x1 or 0x0. 0x1, means that if the flag is set goto @(pointer), and if it's not set, it will continue with the script. Similarly, 0x0 checks if the flag is not set, and if it isn't, it will goto @(pointer), and if the flag is set, the script will continue normally. As you can see, the if 0x1 goto @done points to a different part of a script, as shown with the #org @done . At #org @done, we have both a message and a new command, clearflag. Once flags are set they can be "cleared" with the command clearflag. Clearflag has to be followed by the flag number, which in this case is 0x200. There is more than one way to use a flag. Some flags have some sort of game function, like these: Flags Fire Red: Spoiler:
Ruby/Sapphire: Spoiler:
Emerald: Spoiler:
I'll explain these in the next part. Givepokemon Givepokemon does exactly what it says. It gives the player a Pokemon. Here's my example script. There are lots of new commands to look at here. Code:
I'll start from the top. We've already covered checkflag and the if line, as well as msgbox. For info on 0x5, read the section labeled Msgbox Numbers. 0x5 is always followed by a compare line. compare needs a variable, which in this case is 0x800D, and a value, which in this case is 0x1. 0x800D is a useful variable that most commands store values in. When using compare after a msgbox @(text) 0x5 line, you only have two options for the value. They're 0x0, which is the value set to 0x800D when you choose NO, and 0x1, which is the value set to 0x800D when you choose YES. A compare 0x800D 0x1 line will check if you pressed YES and, of course, compare 0x800D 0x0 will check if you pressed NO. The if line that follows the compare line does the same thing as what it does for checkflag. if 0x1 will check if the button pressed matches the compared value. If it matches, it will goto @(pointer). If not, it will continue the script. Then we have a normal msgbox. The first new command here is givepokemon. givepokemon uses six values. The first is the Pokemon, the second being the level, the third being the Item Held, and the last three being buffers. So in the script above, mine shows.... Code:
Pokemon Convert them to HEX first and put 0x in front of them. Spoiler:
Items Same as above. Spoiler:
Now, we have fanfare 0x13E. This is a jingle. It's a short bit of music that's played when you receive something, like a Pokemon or an item. Then we have a msgbox. The only difference here is that we have used 0x4. But if it doesn't close, why would I use it? You'll just have to keep reading to find out. waitfanfare will do what it's name displays. It will wait for the fanfare to finish before it allows the script to continue. 0x4 left the box open while the fanfare plays. closeonkeypress is a very useful command. This is extremely useful when bundled with 0x4. It will basically make the 0x4 act as an 0x6, which allows for it to be closed with the press of a button. setflag 0x828... Do you remember what it's for? In Fire Red and Leaf Green, it activates the Pokemon Menu. Now, here's this part: Code:
If you use ScriptED, this would just be if2 to you. call is something used in other programming languages (sometimes named 'gosub') and is just used to say, "go to @offset, but you have to return." Let's look at what we have there. call @name. That means that we're going to go look at @name. Here, we have call 0x1A74EB. call by itself can be used in the same way: to call some other script within a ROM. It can also call another part of your script. In that case, it would appear like this: Code:
Now we have return. It makes the script return to wherever it was called from or called from. I didn't mention it earlier, but call should have a return to wherever it is called from. That return has brought us back to msgbox @5 0x6. The rest is already explained, so now we can move onto the next part. I think we'll move onto something similar and go to... Wildbattle Code:
I have to get a little "advanced" here. Hopefully, I'll explain it well enough so that it sounds simple. When we script cry, it takes 6 bytes: cry [pkmn #] 0x0 First we have the command. That's followed by the Pokemon number, which in this case is a Charizard. The last 0x0 is supposed to determine the "effect number", but play it safe and stick with 0x0. Now, we have the command wildbattle. In my script, we have: Code:
fadescreen is a command that is used to make the screen fade to black or white and back. fadescreen 0x1 will fade the screen out to black. There are some more fadescreens, listed here: Spoiler:
Now we can move onto hidesprite 0x800F. This is very useful, as it makes the overworld you're interacting with disappear. Here's some in-depth info on hidesprite 0x800F: Spoiler:
hidesprite can also be used a little differently. I'll explain that a little later in the tutorial. Remember how I mentioned something about the People ID in Advance-Map? This is where I'll be explaining that. Let's say you set flag number 0x200. We are going to change the script's overworld's People ID to 0200. The People ID is used to make sure that the overworld doesn't continue to re-appear. That's it! I guess we can move onto something else now. Checkgender Code:
checkgender, huh? I guess there isn't too much for me to explain here. So we have the command checkgender. Like most commands, it assigns a value to 0x800D. We check what this value is with compare 0x800D 0x*. The asterisk just stands for what we are checking for. checkgender assigns 0x0 to 0x800D for a male, and assigns 0x1 to 0x800D for a female. I've used two compares but it could have alternatively been written like this: Code:
Code:
I think that's all that I need to explain for this. Giveitem Code:
Now, onto the new things in this script. We have the giveitem command. Giveitem uses three values, the item no., the amount, and the message type. The message type can be either MSG_FIND or MSG_OBTAIN. In my script, I used these: Code:
Let's move onto some simple specials now. Special Code:
I'm going to do something different here. I'm going to start with the fadescreens. Do you still remember what fadescreen 0x0 does? Spoiler:
Now, we can move backwards and look at, “Why I used 0x4 instead of 0x6.” For some reason that I can't explain, if we use 0x6 before we use fadescreen 0x1, the box will remain open until we return to our normal screen with fadescreen 0x0. Once we are there, we will see it close, but we don't want that, do we? It doesn't look very good. We want it to close before we come back from our black screen. I also can't explain this, but for some reason, when we use 0x4 and closeonkeypress, it does just that. So whenever you have a script like this, use 0x4 and closeonkeypress before a fadescreen. The fanfare is very useful in this script. In theory, I could have used pause (which is a command I haven't covered yet), but I wanted to use the combination of fanfare 0x100 and waitfanfare. For those of you who don't know, fanfare 0x100 is the healing jingle that is played when someone heals your Pokemon. So with the help of waitfanfare, the screen will not return to normal until that jingle is completed. Now all that's left is, of course, special 0x0. This is a special command that will fully heal the Pokemon within your party. Useful, isn't it? I'm also going to include a short list of specials in a spoiler right here, for whoever may want it. Specials Spoiler:
For the earthquake animation, here's a few variables you should set before using the special: Code:
Applymovement Code:
Applymovement is a very useful command that allows to show an overworld walking or running depending on what we want. When we use applymovement, it has to be followed by a People Number, which is found here: http://files.domoreaweso.me/people%20event%20num.jpg It also needs a pointer to where our movements are. An overworld with a people number of "4" seems normal, doesn't it? But what about one with 0xFF (255). There's almost never 255 overworlds on one map. 0xFF is the “hero's” people number. Now, let's look at this movements list: (credit to HackMew for finding them and including them in XSE) Ruby/Sapphire/Emerald Spoiler:
Fire Red/Leaf Green Spoiler:
Before we look at the movements in a different view, I should explain the layout of the movements at the pointer. It's set out in a similar way to a message. We have #org @pointer first and what's being written to the ROM below that. You put #raw, then the movement that you want. You have to put #raw 0xFE at the end of the movements, or else the movements won't work. Now, we're going to look at waitmovement and pause. waitmovement is one of the best commands that you will ever find. It's the "perfect pause"! When used as waitmovement 0x0, it will wait for the exact amount of time that it takes for the movements to move the sprite. Really helpful, isn't it? Now, we have pause. pause will wait for a set amount of time. You have to add the amount that it will wait for. If you want to calculate pause time vs. seconds, here's a (not very good) conversion thingy: 0x20 Pause time = approx. 1 sec. real time I don't use this very often. I prefer to use waitmovement almost all of the time. Okay now, no more sidetracking. Let's look at the movements. Let's look at the script without anything but the applymovements, pause and waitmovements. This leaves us with this: Code:
ie. applymovement 0xXX @YYYYYY waitmovement/pause But let's look at the next set of movements. It's set up differently. We have two applymovements before we have some sort of pause. What would happen if I did that? They would both move at the same time. This is sometimes referred to as "follow-me." With a "follow-me", we can use as many applymovements before the pause as we want. This can be useful if we wanted a "group" to walk together. We can have three, four, five, six, or however many you want in a "group". I think that's all there is to the applymovement command. Now we can move onto that playsong. When we script playsong, we need a few bytes to get it to work. Here's a short summary of what we need: playsong [song #] 0x0 That 0x0 is a buffer. We need it in order for the command to work. Whatever game you're hacking, you can find the song numbers in A-Map. Now we have fadesong. What's that do? It's set up similar to playsong and will fade into the sound displayed. If you want more detail on how it works, just refer back to playsong. The only thing different is that it does not need that extra buffer. I thought I might point out something about the checkflag in this script. We actually have no setflag in this script. So why do I have a checkflag? In one script, we can check if a flag was set in a different script. In this section, we check if the Pokemon menu has been activated before the script will end (@done). Okay. Compile the script, assign it to a script tile (green with an S) and not a person. Now test it in the ROM. Then look at this spoiler. Spoiler:
So, what's next? Countpokemon I'm not going to show just one script. There's too much to explain in just one script. Here's the most basic example. Code:
Before I explain this fragment of a script, I should go into a little more detail on the command countpokemon itself. countpokemon checks how many Pokemon are in your party and assigns the value to 0x800D. If we have six Pokemon in our party, it would assign 0x06 to 0x800D, and if we had 3 Pokemon in our party, it would assign 0x03 to 0x800D. Now back to that part of a script. compare 0x800D 0x6 checks to see if there are six Pokemon in the player's party. Then, with if 0x1 goto @continue, it says, "if there are six Pokemon in your party, go to @continue". That's the simplest and easiest form of countpokemon. I'll add one more example just to help the information sink in. Code:
Trainerbattle 0x0 Just a simple trainerbattle script: Code:
rainerbattle is a battle with a trainer. trainerbattle is great because the game keeps track of whether you have beaten a trainer or not. In this script, we have no need for a checkflag/setflag situation. Now to explaining these values after the trainerbattle. These are: trainerbattle 0x0 [Type of battle] 0x001 [Trainer ID] 0x0 [Reserved Byte (normally 0x0)] @before [Pointer to Message When Seen] @after [Pointer to Winning Message] I guess I'll explain the type of battle. This byte determines whether it's a double battle, Gym Leader Battle, or another type. A normal trainerbattle is 0x0. The trainer will "see you", then go to the beginning message, then the battle, and then goes to the message when you win. Now we'll move onto the Trainer ID. This is the ID of a trainer that's found in PET. For example, Brock can be found with with a Trainer ID of 0x19E, and Blaine can be found with 0x1A3. Now, there are two pointers, @before & @after. I've labeled these to help display what they are used for. The first pointer, @before, shows the pointer to the message displayed before the battle. Now onto @after. It's the pointer to the message after the battle, obviously! This message appears while we are still in the battle itself. Remember the colors that were mentioned towards the beginning of this tutorial? Well, we can use colors with this too! They're different, though. Sadly, I don't have a list for those values. Now, if I were to test it in a ROM, what would happen after the trainerbattle? Nothing. The script ends. So why do I have a msgbox after it? Remember how I talked about trainerbattle keeping track of whether you have beaten them or not? Well, once you beat the trainer, the trainerbattle will be skipped, so when you speak to them after beating them in a battle, it'll be treated like a normal message script. Wait! Why don't I have a lock and faceplayer after the trainerbattle? The reason is that once you have beaten that trainer, trainerbattle will also act as the lock/faceplayer combo, and you don't have to worry about them in this script. That's the scripting side of this command done. Now the A-Map side. Now compile this script, and test it in a ROM. Did it work like a normal in-game trainer battle? I bet your answer is no. You'll need to fill in these boxes: http://files.domoreaweso.me/trainerbattle.jpg Trainerbattle 0x1 Code:
This script is a little longer than the previous trainerbattle script. You'll see that the "0x0" from the previous script has become a "0x1." There's also a third pointer. If the “Battle type” box says "0x1", it means that it needs three pointers after the trainerbattle command. The first two are the same as in the previous script: one for before the battle, and one for after the battle. But the third pointer doesn't go to a message! It points to @later. It's a separate part of the script. This is where the script continues after you've won the battle. If you refer to the flag section, you'll be able to see what the setflag 0x820 is. Spoiler:
I think that's about all I need to add on trainerbattles. Warp I think I'm at the stage in this tutorial where I don't need to show an example script for every command. This is one of those cases. So now we have warp. warp is there to allow the player to warp to a different map or location. warp is used like this: warp [map bank] [map number] [warp number] [extra, for now] [extra, for now] Let's say we wanted to warp to the door of Oak's Lab in Pallet Town. Open a Fire Red/Leaf Green Rom in Advance-Map and open the Pallet Town map. To the far left of the program's window, you should see an orange box next to the current open map. If you've clicked Pallet Town, it should say “Pallet Town (3.0)”. The "3" is the map bank and the "0" is the map number. Now, we need to click on the Warp on the door of Oak's Lab. It should say "Event Number: 2" on an unmodified Pallet Town. Now, we have our three values. Now, we write our warp command. Code:
Warp to Position Code:
Well, this should warp you straight to your bed in your room. This is in map PALLET TOWN (4.1). So, what's the 0xFF for? The 0xFF is what tells the command that it's going to warp to a certain position. What are the last values for? Let's look at the locations of the bed in your room. The values are: (X=2) (Y=6). They are actually 02 & 06. Now, just plug the numbers into the script. It's that simple! We can now warp to a certain position. Weather Commands When we want to change the weather in a script, there are two commands that we need to know about: setweather and doweather. setweather will set a certain type of weather to be activated by doweather. This is how we set up our setweather command: setweather [weather type, 2 bytes] A list of the different weather types is in A-Map. If we wanted to have rainy weather, we would have: Code:
doweather is used to activate the weather. So let's show a script to display these in use: Code:
This command will prepare the game to return back to its default map weather. Since this only prepares the ROM for it, it still must be followed by doweather. Pokemart Here's a basic script showing the pokemart command. By now, you should be able to add to it pretty easily: Code:
#raw word 0x(value) In this case, we have the these items, respectively:
#raw's I think I should go into a little detail on these. When we script in #raw, we're just scripting in hex. Here's an example script: Code:
Code:
Hidesprite and Showsprite hidesprite is the command that we covered a little in detail earlier. We used it like this: hidesprite 0x800F . It makes the last person we talked to disappear. But what if we wanted a certain person to disappear? A common mistake is confusing the People ID with the Event ID. Make sure you get the People ID. This is how you set out the command: hidesprite 0x(people no.) So let's use an example: People ID. = 4. Here's how it will appear: hidesprite 0x04 One more: People ID = 12. hidesprite 0x0C By now, you should have a pretty good understanding of the hidesprite command, so let's move onto showsprite. showsprite can make an OW re-appear once it has been hidden with hidesprite. showsprite is set out in the exact same way as hidesprite. Here's some complimentary examples from when I explained hidesprite: Example 1. People No. = 4. showsprite 0x04 Example 2. People No = 12. showsprite 0x0C If you remember back to wildbattle, you'll see that you need to use setflag to keep the person hidden. If we wanted to keep them viewable after using showsprite, we would need to use clearflag. Giveegg giveegg is a relatively simple command to use. All we need is to add the Pokemon species number after it. As an example, let's give a Pikachu Egg. Pikachu's Pokemon number is 25. Converting that to hex gives us 0x19. Our giveegg command would appear like this: Code:
Code:
Textcolor We have three useful colors here:
Black Text Code:
Blue Text Code:
Code:
Setmaptile I'll show a script and explain it for this one: Code:
setmaptile [X Coordinate] [Y Coordinate] [Tile Number] [Movement allowed?] So in my short script, we have: X Co-ordinate = 10 or 0xA Y-Co-ordinate = 13 or 0xD Tile = Normal Grass (in tileset 0 [Fire Red]) or 0x1 Movement Allowed = Yes or 0x0 We can find our X and Y coordinates in Advance-Map, which has been shown earlier. We can also find our tile number in Advance-Map. The number also depends on what tileset we are using. Hold your mouse over a tile in the right pane. In the little status bar at the bottom on the far left, you should have Block: XX Offset: XXXXXX Movement allowed has two possible options:
This special will reset the map so that it allows the tile to set. Without this, you'll have to leave the screen and come back before it will actually work. Special Trainer Commands We've got three commands here, all #raw's. First is checktrainerflag. Second is cleartrainerflag. Last is is settrainerflag. All three commands are set out in the same way: [command] [PET ID] For all three examples, I'm going to use the trainer "Leader Brock", with a PET ID of 0x19E. Now let's work with checktrainerflag. Since we're checking for something, the answer or result is going to have to be stored somewhere. Like most commands, the result is stored into 0x800D. Here's an example: Code:
Here's cleartrainerflag. Again, we'll be using Brock for the example: Code:
But if we want to re-enable the trainerbattle what command do we use? settrainerflag! I'm still using Brock. Code:
Checkitem/removeitem These are probably easier to view through an example: Code:
if 0x4 goto @pointer is different. Why have I used 0x4 instead of 0x1? Other than what we have here, we can also use values, like 0x1, 0x2, 0x3 etc. I'll propose a "table". Code:
Pretty useful, huh? From this point on, I'll only be using 0xX with the if line. I thought I'd warn you just so it doesn't look like I've totally changed the way I script without notice. Now checkitem. checkitem is scripted like this: Code:
Code:
By now, you should be able to tell what the if should do. Now, we go into removeitem. Obviously, it removes an item from your bag. It's set out in the same way as giveitem and checkitem. Code:
Copyvar A little command that's pretty easy to explain. It just copies what's stored in one variable to another. We will use this more and more often as we progress through the tutorial. Here's the explanation: Let 0x8008 be "A" and 0x800D be "B" Code:
I know that it's backwards, but that's just the way that copyvar is. Pretty easy, don't you think? Copyvarifnotzero This is what some might call a little "add-on" to the copyvar command. The name says it all, doesn't it? It says, “copy variables, if not equal to zero”. Code:
Setvar Setvar is a pretty simple command with a wide range of uses. It sets a certain value, ranging from 0x0 to 0xFFFF, to a certain variable, which is basically a number which is kept in memory and persists through saves. Think of them like flags that can be set to whatever number you want instead of just on and off. The command is written like this: Code:
Code:
You'll see more of this from this point on. IMPORTANT: Make sure to always use variables between 0x4011 and 0x40FF. If you don't, then anything could happen to your game, ranging from Bad EGGs in your players' PC boxes to a deleted save file. Random With this command, the ROM will choose a random number within the range of 0x0 to the value you set with the argument, and then assign it to 0x800D. Here's a little example: Code:
Code:
Special2 I'll show an example script fragment. This is a "checkpokemon" only usable for Fire Red. Code:
Now, we have special2. special2 is set out like this: Code:
The following compare and if act in the same way as the compare and if used with the checkitem. If you've forgotten, here's a quote of myself to help you: Quote:
Special, Part 2 We're adding to the special command. Well, not really. I'm just going to tell you about the waitstate command. Let's just use special 0x9D, which in Fire Red, shows the "Old Man Catches Weedle" scene. Look at how we're going to use it: Code:
Movesprite This will obviously move a sprite from one place to another instantaneously. It's set out like this: Code:
The X coordinate is the X coordinate of the tile that we want to move the overworld sprite to. Obviously, the Y coordinate is the Y coordinate of the tile that we want to move the overworld sprite to. Here's just a simple example of the command. We'll use People number = 4; X co-ordinate = 12; Y co-ordinate = 5. Code:
Code:
Setvar Lesson 2 I'll show an example of this command that thethethethe used in his hack, Legend of Dragons. It's actually three scripts. Script 1, right tile Code:
Script 2, middle tile Code:
Script 3, left tile Code:
Code:
I'll explain the goto a little later. But for now, let's look at what's in Script 1 under @script. We've got the usual checkflag 0x[flag] to prevent the event from repeating itself. Now, we've got some compare lines: Code:
I haven't actually explained goto yet, have I? We've only seen it with if. Well, at this point, if you've followed the rest of this tutorial, it should be obvious what the command does. It will goto a specified point, whether is be a @pointer or a 0x[hex address]. The command is set out like this: Code:
Look at the similarities between each one: Code:
Code:
Code:
Let's compile Script 1 into the ROM. After it's been burnt to the ROM, we should see a list of the different names of the pointers. We should have something like this: Quote:
If I were to use these pointers as an example, my Script 2 would be something like this: Code:
Resetvars This command doesn't reset every variable, just 0x8000, 0x8001 and 0x8002. It's just command resetvars. It doesn't need any extra arguments. All it needs it this: Code:
Money Commands This is a pretty big section, so I'll split it up into 6 sections for each of the money related commands.
Givemoney The name gives it away. This command will give the player a designated amount of money. The command is set out like this. Let XX be the money value: givemoney [XX] 0x00 The final 0x00 actually determines whether it updates your money account. If it were changed to 0x01, the money balance does not change and therefore defeats the purpose of the giving the player money. I'll move onto explaining the money now. I'll give you an example to show what's happening. We'll use the amount 10,000. so let's convert 10000 to Hex, which gives us 0x2710. Here's our line of code: Code:
Money amount = 500 [hex = 0x1F4] Code:
Paymoney Like givemoney, the name gives the function away. This command takes money from the player. The command is set up in an almost identical manner to givemoney. I'll show the setup again, just in case you forgot already: Let XX, be the money value: paymoney [XX] 0x00 The final 0x00 has the same function as what it does with givemoney. Just in case you wanted it, here's an example: Money amount = 600 [Hex = 258] Code:
Checkmoney This command, obviously, checks if your account for a designated amount of money. It's set up in the same way as the previous two commands, but there is a difference. I'll show you how it's set up. checkmoney [XX] 0x00 Looks the same, doesn't it? That's because it is exactly the same. The difference is that the reason for the 0x00 at the end is for something different than the other two. 0x00 means "Check Money account", and 0x01 would mean "Don't check Money account", so if you were to use 0x01, it would defeat the purpose of the command. Now, how do we check the amount? Remember the countpokemon command? We check in that same way, using the compare and if lines. Here's also a little example, just in case that wasn't explained very well: Conditions: Money amount = 1000 [Hex = 3E8] ; Need at least 1000 to continue in script Code:
Conditions: Money amount = 20,000 [Hex = 4E20] ; Need less than 20,000 to continue in script Code:
Showmoney This breaks away from the style that the other money commands are written in. It's set out like this: Code:
Here's a little example of what how it is set out: X and Y co-ordinates - (0,0) Code:
Hidemoney This one is also different from the rest of them. This command is set out like this: Code:
If I were to write this to counter-act the effect of my previously shown script, my hidemoney line would appear like this: Code:
Updatemoney This is the last money command. It's simply set out like this: Code:
Code:
Addvar The name says it all. It says "Add to Variable". Before I explain what it does, I'll show you how it's set out. Code:
addvar will add the designated value to the value that is already stored within the designated variable. What a mouthful. If that's a little complicated, I'll simplify it. As an example, let's say the variable 0x4036 already has the value 0x1 stored into it, and we want to add 0x3 to it to make it 0x4. I'll put it into an example: Code:
Subvar Of course, since we can add to a variable, we must be able to subtract from the variable. It's set out in the exact same way as addvar: Code:
Code:
Lockall It's just lockall. There's no other arguments. It's used when you want to lock all the people in the map, instead of locking just the person you're talking to. It's pretty useful. Showpokepic The name may be a little misleading. This command can bring up an image of a designated Pokemon. The command is set out like this: Code:
Conditions: Pokemon = Dratini Coordinates = (10,3) Center of Screen. Code:
Hidepokepic Without using this, your showpokepic box will remain open until you leave the map. The command is just hidepokepic. There's no need for any arguments. Well, here's an example of the two commands combined in a fragment of a script. Code:
Door Commands There are three door related commands.
I guess we'll start with setdooropened. Setdooropened Obviously, this opens doors on a map. It's set out like this:Code:
Code:
It didn't, did it? Here's the reason why. It need to be followed by this command. Doorchange This command needs to follow both setdooropened and setdoorclosed. Without this command following, they don't work. This command doesn't need any arguments. Here's an example, with the setdooropened command:Code:
Setdoorclosed It's set out in the same way as the setdooropened command. I'll show you the set-up again, just in case you've already forgotten. Code:
Code:
Coin Commands There are 6 coin commands, and they are very closely "related" to the money commands, as they have similiar arguments. Here's a list of the different commands:
Checkcoins This is a pretty simple command, and isn't as difficult or as long as checkmoney. It checks to see if you have a certain amount of coins. It's set out like this:Code:
Check for 3000 coins; if higher than, continue Code:
Givecoins/removecoins Since they have similiar aguments, I thought I'd put these two together. This is how they are set out: [command] [Amount] I guess I'll give an example of both so we can move onto the other three commands: givecoins Give 1000 coins Code:
removecoins Take 1000 coins Code:
Showcoins This command will display a little box with your coin count. It's set out in a similiar way to showmoney, except you drop off the last argument. This is how the command is set out: Code:
Code:
Hidecoins Obviously, this command hides the coin counter that was brought up with the showcoins command. It's set out in the same way as showcoins, but if you want to see it again, here it is: Code:
Updatecoins Of course, this will update the coin counter and show any changes within your "coin balance". How's this set out? I bet you would be able to guess correctly. It's set up the same way as the showcoins and hidecoins, and just for the heck of it, I'll show the example again. Code:
Code:
Displaying Names/Values The title may be a little hard to understand. This section is dedicated to assigning names of Pokemon, names of Items and numbers to \v\h02 and others of the sort. Here's a list of the commands that we will go over.
Bufferpokemon With this, we will assign a certain Pokemon's name to a \v\hXX variable. It's set out like this. Code:
Here's an example. We're going to assign Charizard's name to [buffer1]. bufferpokemon 0x00 0x06 msgbox @1 0x6 release end #org @1 = How is [buffer1]?[/code]Nice and basic. Just in case you want a second example, I'll 'chuck' one more below. Pokemon = Chikorita; Storing to? = \v\h03 Code:
Bufferfirstpokemon This command is set out a little differently to the one above. We just set it out like this: Code:
Since it's such a short command, I'll just show an example. In the example, we're going to show how to assign the first Pokemon in the party's name to [buffer1]. Code:
Bufferitem It's set out in the exact same way that bufferpokemon is, but it's still worth showing. In case you've forgotten how bufferpokemon was set out, here's how bufferitem is set out. bufferitem [buffer#] [item #] Since there really isn't too much need for a second explanation, I'll move straight into the example: Code:
Quote:
Bufferattack I bet you could probably guess how this command is set out. It's done the same way as bufferitem and bufferpokemon. It's set out like this. Code:
Anyway, here's the list. This will come in handy a little later: HEX Values Spoiler:
Now I guess I could jump into an example now, couldn't I? Code:
The message actually says: Quote:
Buffernumber This is just used to display a number stored in a variable. It's set up like this: buffernumber [buffer#] [Variable] The downside of this command is that it can only display numbers from 0-65535 [Hex = 0x0 - I'll show an example. We're going to put the number 50000 in [buffer1]. Code:
Msgboxsign This is a fun little command. This will turn your normal msgbox into a Signpost Box. Here's an example: Code:
The first message should appear as a normal boxset 0x6. But when we used msgboxsign, our second boxset 0x6 became a signpost box. But what's this msgboxnormal doing here? msgboxnormal converts the box back into a normal boxset 0x6. This is just a little playful command that gave us a break from the commands that are having four and five arguments. Callasm This command is used to call an ASM function that you have added to the ROM. I'm not going to write an example. I'm going to use the example of the command used with Mastermind X's "Shiny Hack".This is his hex script: Quote:
Quote:
Code:
He's called the ASM function twice: once to turn it on, and once to turn it off. I think he's explained everything else. Getplayerpos getplayerpos can be used to store the player's X and Y positions on the map into designated variables. The command is set out like this: Quote:
Code:
Repeattrainerbattle This is a simple command that will begin the Last Trainer battle commenced. It's done simply with command repeattrainerbattle. We can easily use this in a script by simply doing: Code:
Releaseall This command is used as the opposite to 'lockall''. This command will release all sprites on the current map. Here's how it can be used: Code:
Waitkeypress This command can be used as a pause. The command waitkeypress is used to wait until a key is pressed before it continues. It's used like this: Code:
It doesn't need any arguments. Yesnobox This command is somewhat pointless when there is msgbox @text 0x5. It acts in the same way as 0x5 where when you use compare, yes = 1 and no = 0. Its only reason for use might be to have some flexibility as to where you want the box to be placed. The command is set out like this: Quote:
yy: Y co-ordinate In a script, we can use it like this: Code:
Multichoice, preparemsg, waitmsg Yes, it's something people want to use, so here's a brief guide on multichoice and two other commands that normally accompany it. I'll show an example first, which will make it easier for me to explain how it's used: Code:
waitmsg is similar to closeonkeypress. This command is special and is used with preparemsg to close it. Now onto the multichoice command. YAY! Well, it's set out like this: Quote:
yy: Y co-ordinate zz: Multi ID. Refer to Multi List aa: Determines if B can cancel. 0x0 means B can cancel. The first two parameters are easy to use. Like other commands, they are just the X and Y co-ordinates on the screen. The third parameter is the options that appear on the multi list. It's for Fire Red, so sorry to Ruby hackers. Spoiler:
From the example script, you should be able to tell that the selected result from multichoice is stored into the variable 0x800D. You should be able to see I copied it to variable 0x8000 to see if it would confuse anyone. I hope it didn't. The copyvar was not needed. You can just compare with 0x800D, but by now, you should already know that. The following compares should be fairly obvious as to what they do. They compare what option has been selected. 0x0 is the top option, 0x1 is the second to the top, and so on until the final option. Name Pokemon Here's another working Name Pokemon sequence, although this one will only work if the Pokemon is given into the party and not a PC box. Here's a script where it can be used. I'll explain it in the code. But before I do that, Pokemon's party position is [Position] - 1. First in line is 0x0. And sixth would be 0x5. Now the script... Code:
Store Pokemon to Pokedex Okay, so here's another string like the Name Pokemon above. It simply adds a Pokemon to the 'Seen' section of your Pokedex. This one is fairly easy to do. Here's the script. It'll make it easier for me to explain. Code:
Pretty basic too. We put the Pokemon number of the Pokemon we want to set to 'Seen' to 0x8004. In this case, I'm preparing Mew to appear as Seen. Special 0x163 only finishes the job and actually sets it as Seen in your Pokedex. That was a very extensive and in-detail scripting tutorial. Hope you enjoyed it! If you see any bugs, feel free to tell me about them. |
This is great! :D
I hope to see more soon. Thanks Diego~ |
It'll definitely help all of the noobies who don't want to convert thethethethe's tutorial into XSE in their head. x3
That aside, it's good work, Diego. Thanks a lot ;) |
finally! an XSE tutorial based on thethethethe's pokescript tutorial. I have been waiting for ages for a tutorial. thanks for making this with thethethethe's approval. ;)
also, I disagree with the warp part... your example there is warp 0x3 0x0 0x2... why, every time I open a script with a warp command, it has a fifth value, for instance, warp 0xA 0x10 0x2 0xFA9C...? I wish to know that, even if it has already been answered in the old Script Help Thread... Also, can you include the usages of nop and nop1, for those commands mess my scripts if I play with No$GBA... :\ anyways, thanks again for this tutorial. |
Was this for
Well for instance, the fith variable would be the X/Y Co-ordinates.
As seen in Thethethethe's Tutorial. Let me add more: If the Co-ordinates are 03 00. You Reverse them to 00 30 then, its compatible with the script. but in XSE i'd think it was 0x0030. Hope I helped! |
WOW thanks! Really helpfull. I just needed the heal and trainerbattle explenation that wasn't in the other tutorials. Thanks alot!
|
Quote:
I am not sure, but the warp command posted is wrong. When you try to compile warp 0x3 0x0 0x2, XSE says, "Too less parameter". It needs X/Y co-ordinates. Example: Example:
0x1 is X coordinate. 0x3 is Y coordinate. Also, this XSE tutorial is very useful, but is explained for the old version of XSE. Like, it should not be: message @1 boxset 0x2 It should be: message @1 MSG_FACE or 0x2 The color commands can be set out differently, Like this for example: Example:
Just thought to clarify some things. For XSE now, is updated a lot. :] |
Year after year,I finally see a full tutroial about XSE!
I can make XSE scripts ,but It's better to have a dictionary like this.It makes me relieved. |
No offense but the updated guide explains basically anything you need to start scripting. Besides some info here is kinda wrong...
|
:\
Boxsets are no longer boxsets. They're just numbers after a message pointer now. |
Quote:
I suggest the author downloading latest XSE and adjusting the whole post to adjust or remove anything that's outdated, wrong or misleading. Thanks in advance. |
Bravo Diego, A very useful tutorial.
|
So how can you keep the sprite hidden with hidesprite? Setting the flag doens't work, if I walk away the sprite pop ups again, even if I set a flag right after the hidesprite command.
What I do is: a person blocks the entrence to a cave, but if you have the first badge he will walk away and and the sprite has to be hidden after that (so the player can enter the cave). What should I do to make it work? Edot: Never mind, didn't saw the sentence where you explain it a bit more. It works now. |
Me very very sorry..
I sent you a visitor message diego |
Quote:
|
Do you even know how to script? I'm just asking...
Anyways, I found a mistake in your "script" the one about giving Pokemon..And that's only because I scrolled upward from the last post Spoiler:
Oh and By the way, XSE uses "msgbox @1 0x6" Not boxset or callstd any more |
Quote:
Thanks for the heads-up, though. |
Eeeek, sorry man, ok, well just fix up some mistakes to make it 100% XSE sorry lol :)
|
wow this tutorial is incredible! i now understand how to script thank you! now if only i knew how to use connection points in advance map lol
|
This was a very helpful tutorial! Good job, thanks for putting in the effort to remake thethethethe's tutorial XSE style!
You mentioned that you'd do level scripts later on, and those are something that I've been having problems with. I haven't been able to find any info on those, I was wondering if you were planning on adding that? |
hey thanks bra, every one says use boxset but u had that other thing i dont wann look right now and now it works thanks man also the whole 0x0 at the end of the msgbox also helped so thanks alot good tutorial im book markign this **** cause no way ima remeber it all
|
Here's a link to the Level Script section:
http://www.pokecommunity.com/showthread.php?t=141650 THE TUTORIAL HAS BEEN MEGA-UPDATED! :D :D :D |
Also when using the callasm after inserting the shiny data you need to have the offset as the same on that you used.
|
this is the biggst tut I've seen for xse!! It covers tons of stuff!!
|
Diago you should've explained this more
do you even know half the scripts that your writing? |
| All times are GMT -8. The time now is 8:11 PM. |
![]()
© 2002 - 2018 The PokéCommunity™, pokecommunity.com.
Pokémon characters and images belong to The Pokémon Company International and Nintendo. This website is in no way affiliated with or endorsed by Nintendo, Creatures, GAMEFREAK, The Pokémon Company or The Pokémon Company International. We just love Pokémon.
All forum styles, their images (unless noted otherwise) and site designs are © 2002 - 2016 The PokéCommunity / PokéCommunity.com.
PokéCommunity™ is a trademark of The PokéCommunity. All rights reserved. Sponsor advertisements do not imply our endorsement of that product or service. User generated content remains the property of its creator.
Acknowledgements
Use of PokéCommunity Assets
vB Optimise by DragonByte Technologies Ltd © 2023.