![]() |
Quote:
That way you don't need to code the extra speed drop for each individual effect. |
Quote:
EDIT: Now updated. :D |
Quote:
Quote:
|
Quote:
Oran Berry would require some effort and some knowledge of regular scripting (which I haven't touched yet). I suppose it would require three routines: 1. One for pinch berry activation. 2. Second, when you use an Oran Berry on your Pokemon while battling. 3. Third, when you use an Oran Berry on your Pokemon in the Overworld. |
I'd like to say that this thread has been really helpful for me as my ASM skills are far worse than sub-par and, also, the Chain-Fishing one in particular is really cool to me. (◕‿◕✿)
I'd also like to request something for Fire Red BPRE v1.0 (adding to the infinite list of requests...): Stance Change. Basically, where a Pokémon uses an offensive move and changes its form to a more offensive Pokémon (or, rather, just a different index-number Pokémon entirely). However, when it uses a certain move (or just a status move would be fine, too), it reverts back to the old form. EDIT: Oh, and it would also have to revert to the other form outside of battle. What I was thinking was two separate abilities in order to accomplish this, but if one is possible, then that's great too! Thanks in advance! God I sound so rude I am so sorry EDIT: Also, should I go to DaniilS with this? I noticed that he had his own thread for form(e)s... EDIT EDIT: Okay, I just noticed something while I was trying to get the Male-only and Female-only evolution methods working on Burmy. But ALL of the Pokémon generated by your routine are Male unless if they have more of an 82 percent chance of being female, in which case they are, and the Pokémon already caught turn into females. This is also shown in you post showcasing it, as the Tyranitar are also all Male. Just wanted to say this, haha... |
Quote:
|
Quote:
Anyways, just in case: Shiny and Random |
Quote:
|
Quote:
Also, how can I make Ditto breeds with himself too, not only all other Pokémon? And genderless Pokémon, like Magnemite? How can I make them breed? Finally, for Nidorans and Volbeat/Illumise, I wanna make the male breed with the female, but not breedable with Ditto. How can I do it? Quote:
Thanks in advance! |
Disabling "Gain money
" after defeating a trainer", it's useful for those who want to have a battle frontier |
Life Orb Recoil
Spoiler:
|
I have a request.
A routine that copies the player's current pokemon in party (EVs IVs, moves, Abilities, held items, etc.) and pastes it on a trainerbattle (user gets to choose which trainer). So, like a Battle With yourself. Would be cool as a final Battle or something. Is this possible? Would be awesome if anyone made this. |
Anyone want to try to make it so you can only use 4 items per battle so you're on equal footing with the trainers you're fighting?
|
Can somebody post the code for the updated lightning rod/storm drain and sap sipper? I want to try modifying them to make my own abilities based on the same idea.
|
Quote:
Great work! I'll have to link this post when I write up the rest of my Sheer Force routines on the Ability Resource Thread. Quote:
|
Quote:
Same routine with Emerald offset ! Here : Spoiler:
Bonus: -Life Orb boost -Light ball updated -Item that boost a certain type of attack for Emerald -Timespace Orbs for Emerald Note that for timespace orbs and new boost-type item, you can adjust the power added the same way than miracle seed and the like. Spoiler:
Quote:
|
Quote:
Well it does prevent according to Bulbapedia. Also, I have already done the Sheer Force Check after checking the ability (literally copy pasted line-to-line your Sheer Force implementation xD). Quote:
Also, I might post a mini-documentation about the Battle Script Command 'cmd49' in the Quick R&D thread to provide insight of things that are happening at the End of a Move Execution. And it will also help to create things like Weakness Policy, Rocky Helmet, Absorb Bulb etc. Since I will be very busy doing College and Intern Projects, I don't have time to work on these for now. It would be better if some-one with free time will be able to work on these items. |
Quote:
|
Quote:
If you know more or less what it is but don't know how to insert it, refer to that post because I can't explain it in a better way : http://www.pokecommunity.com/showpost.php?p=8526603&postcount=199 Btw you can simply read the tutorials on that thread, they're very good : http://www.pokecommunity.com/showthread.php?t=343871 For the rest, read the instruction put together with the routine. If you still have problem (and you actually tried to make it work), you can PM me Hope it'll help |
Quote:
|
Quote:
Note that the boost power I post is only for Emerald though |
Quote:
|
Can we have run-like speed for surf and mach bike speed in FR? Even better would be an arbitrary speed value!
|
Hi FBI, first of all thanks for your work! You've been really helpful.
My question regards your battle routine http://www.pokecommunity.com/showthread.php?p=8527650#8527650 . I've been trying it without success in my Ruby rom hack hoping it would work just like in Fire Red. Is there any way to remove the whiteout after losing a battle in a Ruby hack rom? |
Quote:
Also, Is there any way how to disable the usage of bag during battle? Thanks! |
Quote:
Code:
Thanks for the code! |
I would like to request a modified Flash Fire which can be activated by another type as well as Fire. I didn't know where else to put this request since the Ability Resource Thread is for porting official ability effects and vanilla Flash Fire doesn't do this. The reason being my hack has an Oil type (0x18) which I'd like to activate Flash Fire, since we know what happens when you squirt oils onto a fire, but alas my brain refuses to comprehend ASM. It's worth noting that by default Fire is immune to Oil, so the ability would have to override that.
|
Quote:
Alternatively you can navigate to the offsets of the routine and add a branch at the beginning of the routine and check for Oil there. You are right though, the immunity may prevent it from happening. |
Quote:
|
oh i need you are help.i am do the"Preventing TMs from being consumed on use "for EM rom.And i have a trouble.
I change 1B6EE0 to 90 make we "can use TM but can not to reduce number" but I can not remove the quantities showing up in thebag so I need help.Thanks |
Quote:
- Go to 0x1326B8 and insert 00 00 17 E0. This makes TMs ungivable. - Go to some free space (I used 0x1BA540), select 36 FF e change them for (simply Ctrl + B in the first): 00 2D 01 D1 05 4B 18 47 38 1C 08 21 22 1C 04 4E 00 F0 02 F8 01 4B 18 47 30 47 C0 46 FF 1E 13 08 B1 35 13 08 - Go to 0x131EF4 and insert: 00 48 00 47 41 A5 1B 08 - Insert E0 at 0x131EA5. |
Quote:
|
Quote:
|
Quote:
|
Quote:
It is a table of pointers. Goto entry no. x3D (table starts from x0) and overwrite the pointer there with pointer to routine at YYYYYY. |
Transferred ownership of this thread to Lost Heart, so hopefully it can be updated more regularly now!
|
Whew~! I've gone through the entire thread and compiled a list of every routine. Expect an updated first post soon! :)
EDIT: It is done. |
Quote:
Quote:
48: Error: invalid offset, target not word aligned <0x000000E2> 48: Error: invalid offset, value too big <0x0000009E> My index number of Chilian Berry is 0x00A0 but it doesn't matter as I've tried changing the value many times and I still got the errors. |
For life orb, make sure that you have replaced the end command in the repointed command table.
I'll look into the Berry issue. |
Quote:
|
Quote:
To fix thd damage berry routine just, change the .hword in the second last line to .word. (The error was due to some issues in Hackmew's compiler) |
Quote:
|
I've been having some trouble getting the Berry System to work. For some reason, the script crashes when it gets to the first instance of the Get Tree Data routine. I know this is where the problem is because if I remove it from the script, it doesn't crash until it gets to the Berry Bag Selection routine, which for some reason crashes the game if I have a berry in the bag, but that could be a result of removing the Get Tree Ddata routine. I thought that maybe the problem was I installed JPAN's Save Block hack wrong (instructions seemed a little confusing at first, but I'm pretty sure I did it right), so I found this patch with the hack, applied it a clean FireRed 1.0 ROM, and then put all the other routines in, and had the same problem.
My script was a simple copy/paste from this thread, which the offsets filled in properly of course. All the ASM rotuines were also unmodified, and copied directly from this thread, I also tried compiling them myself and inserting them that way, but nothing seems to work. |
Edit : already solved. Sorry! I didnt check out first the thread.
|
Quote:
|
Quote:
Quote:
Quote:
Quote:
If you give up, I can give you hints. My policy about strictly specific routines still stand however. |
Quote:
|
Quote:
|
OAM routinesThe first hackathon was probably the worst thing that could have happened for this thread. It completely killed my motivation for hacking and made me quit for a few months. There are some good things that came out of it, I was able to do a lot of research on things I hadn't before including field moves, OAM, trainer generation and such. I was looking around my older routines for OAM manipulation, and I had trouble understanding and ripping my own code! I had lost the source code, so I decided to rip as much as I can and redo the jibberish including some clean up. Similar routines to these ones I'm presenting were used for the custom intro in team 4's hackoff ROM :) Generating OAMsThis routine is only to generate OAMs which are trainer or Pokemon sprites. I've modified it to be usable with a script, but honestly, setting the values yourself via ASM would've been faster (not that this is noticeably slow, just comparatively). I will have to do more research on making it portray an arbitrary image, but with the expansion work on the Pokedex and such, I don't see it as very necessary anymore. How to insert: Compile and insert the following routine into a free word aligned offset. Spoiler:
Usage: The usage is quite simple, but it takes up a lot of temporary variables :P Code:
Variable 0x8000 is to determine the Pokemon's shinyness. If you're showing a Pokemon in your party just use that Pokemon's party slot. If you're showing a shiny Pokemon go ahead and use 0x6. Basically 0x6 = shiny, anything else (must be lower) depends on party slot. Variable 0x8003 plays a key role. Make sure in the OAM viewer the sprite ID is free. http://i.imgur.com/rwUxxWe.png Here sprite number 0 is taken by Oak's OAM. Click the Arrow until you find something not occupied, and set this variable to that value! Variable 0x8007 is a switch of sorts. It determines whether to show a trainer sprite or a Pokemon sprite. I think the rest of the variables are self explanatory. Mess around with them a little :) OAM trackingSo I'm sure you can imagine, that at some point in time you want your OAM to disappear. You can't have it on the screen forever, maybe even make it disappear temporarily and reshow it without having to do the painfully expensive creation call again. I made a routine which will take into account the last OAM ID which you created and stores it in var 0x8008. Note that this is an ID assigned by the game code, not the same ID as the one we assigned on creation. Therefore it's important to track this. How to insert Compile and insert the following routine into free space. Spoiler:
Navigate to 080070B0 and insert the following byte changes: Code:
Usage: This routine doesn't really do anything by itself. It's more of a routine which works in the background. It just writes to variable 0x8008 the last displayed OAM's ID. Basically, just insert it and do nothing :3 A quick explanation of how OAMs are shown/hidden in FireRed.There's a neat RAM structure in FireRed which controls whether or not to show or unshow an OAM on the screen. This OAM's ID needs to be present in said structure. The structure, for some unknown reason, is 40 bytes in size. It looks like this: [OAM ID (1 byte)] [OAM ID (1 byte)] [OAM ID (1 byte)] ... [Byte 0x3F] [Filler bytes] ...[40th filler byte] In case you don't understand by now, it's basically a table of X entries where each entry is an OAM's ID to display. Every entry after the byte 0x3F is not read by game code, and is therefore nothing more than filler bytes! The reason as to why I'm confused the structure is 40 bytes is because the routines which use this structure restrict themselves by using another structure. This second structure only holds 13 OAMs at a time, which is why we can only have 13 OAMs present in FR on screen at once WITHOUT fully customized code. For the most part you'll never go over 13 anyways. I used 9 in total for the custom intro and the screen was cluttered :X My guess as to why it's 40 bytes is because it's used for animation frames as well. I'm not sure, I haven't researched that. This structure is located at 0x2021800. Hiding OAMs createdNow that you understood the data structure, you need to remove your OAM's byte ID from the table. But how do you know which byte is your OAM's byte? That was what the previous tracker routine was for. Right after you create your OAM the corresponding table ID will be in var 0x8008. Copy this value into somewhere you won't lose it (i,e a non-temporary variable), from there you can callasm this routine with the appropriate parameters :) How to insert: Compile and insert the following routine to free space: Spoiler:
Usage: In a script, set variable 0x8000 to the OAM ID you want to vanish, then simply callasm this routine. This data structure is updated every frame from what I was able to see, so the results should be immediate. Show OAMSometimes you want to hide an OAM but only temporary. This routine will show an OAM which has already been loaded, but flagged as hidden or similar. How to insert: Compile and insert into free space the following routine: Spoiler:
Usage: In a script, set variable 0x8000 to the OAM ID you want to reappear, then simply callasm this routine. This data structure is updated every frame from what I was able to see, so the results should be immediate. Closing notes:I may or may not update these with animations as well. One I'm particularly interested in doing is a slow fade. The biggest thing I want to address is how to use these in a script. I think it's fairly intuitive, but a quick example may help :) Spoiler:
Play around with it. It can be fun, and hopefully this will open more doors for hackers. I've made it as friendly as possible even opening up the potential to use it in scripts, but if you have any questions you can direct them to me at the ASM help thread or something :D |
Quote:
I was playing and normally using TMs for 20k Pokémon (not a number, I'm exaggerating). I'm after the league now, and I was giving Toxic to some Pokémon, to help me catch others, so I could get the 60 Pokémon to get National Dex and be able to go to Four Island. Problem is, when I was going to give Toxic to my Chansey, it was gone! Then I looked for the Psychic TM (other move I give to her, I took it out briefly for Rock Smash), and it was gone too. What the hell happened? Is there a limit for this? I got my save back, from the GBA in-game save, and I had Toxic yet. I tested giving it to one Pokémon and it didn't disappear. Then I gave it to other and then it wasn't there anymore. Is there a limited amout of times I can use a TM? Or there's something incomplete about this hack? |
Quote:
|
Quote:
EDIT: Second bug not confirmed! When I noticed this, I used it in my Abra, which only had Teleport. Then it was gone after I used it in my Ekans, which had 4 moves learned. But now, I used in an Ekans with 4 moves learned first, and I kept the TM. Then I used in my Abra, which had only one, and then the TM disappeared. So, 4 moves learned bug is not my problem, so it seems. |
Frontier Routines - Opponent Party generationI've been meaning to implement a frontier of sorts into FireRed for some time but never really got a good opportunity to do so. Today I got a little bored and decided that I might as well start up. The first problem is obviously to generate a pseudo random party for the opposing trainer. That's what I've done today! I had made a generation routine in the past as well, but it was incomplete and a little buggy. This one, as far as I can tell in my tests, should work fine :) Setting up some prerequisites: When making the routine for Pokemon generation, it was important that the hacker had some customization about which Pokemon were allowed into the opponents party (to prevent legendary Pokemon, or some specific Pokemon into the competition). The best way to do that is to either make a table of the Pokemon allowed to be in the opponent's party, or a table of the Pokemon not allowed to be in it. I decided to make the hacker do a table of all the Pokemon species allowed to be in the opponent's party. It's important to remember that Pokemon Species ID takes 2 bytes per species, and that each entry in the table is in reverse hex. Bulbasaur for example would be: "01 00" in the table. The size of the table is up to you. The biggest reason I made the table be a table of all the Pokemon allowed is because this allows you to put more than 1 entry of the same Pokemon (thus increasing it's likelihood to be selected) ==> not all Pokemon species have the same chance of being selected! Find some half-word aligned free space (offset divisible by 2) and fill up your table with as many entries as you'd like in this format: Code:
How to insert: First take a look at the routine in the spoiler. Scroll to the very bottom, and you will see two fields which need filling. The first is called "Table". Table is supposed to be a location to the table of IDs we made earlier, replace 0x8750000 with your table location. Tsize is supposed to be the amount of Pokemon your table has in it, adjust that accordingly as well. Finally, the routine is flag toggled. If flag 0x205 is set, the opponent is generated a random party. To adjust this change these lines accordingly: Code:
Spoiler:
Finally, in a hex editor insert the following byte changes at 0x112F8: Code:
Usage: The routine is flag toggled. Set flag 0x205 before entering battle, and the rest is done automatically. |
Quote:
|
Quote:
|
Quote:
|
Quote:
Bro, please update your Reusable TM post with this information. Not for me, I already have it working. For other people not to stumble in the same issue. Thanks for the help! |
Quote:
|
Quote:
EDIT: If you ever want me to find the Emerald offsets for you, I'd be glad to. EDIT^2: Edited routine for Emerald (Changes in Red) Spoiler:
|
Quote:
Quote:
Quote:
Quote:
Someone who's keen can go back and make efficiency changes to some of these. A brave and unlazy soul! |
Quote:
Spoiler:
Insert at 0x9C8EA. |
Battle Frontier routines (Generate a random trainer sprite)Something to compliment my opponent party generation routine, it generates a random trainer sprite for the opponent from a table of possible sprite entries. Incase you haven't noticed, tables are awesome and tables make things customizable! Lets cut to the chase. An important note about multi-use You may or may not be familiar with the Rival and Champion trainer class functions so I will briefly explain that to explain this multi-use. In short, if you assign a trainer the trainer class "Rival" or "Champion" they will automatically be assigned the name of your Rival (the one you name in the Oak intro). Some people have hacks in which there are more than 2 Rivals, and it may be important to you to have this said rival's sprite appear when battling them. I've removed the class dependency, and added that capability to the sprite generator. How to insert: Before compiling the routine in the spoiler below, there's a few things which you may want to customize. 1) The routine is flag toggled. By default I made this flag 0x205. See spoiler below about code to modify this Spoiler:
2) This routine reads from a table of byte long entries, each of the entries correspond to a specific sprite. See spoiler for info Spoiler:
3) This routine has an optional section described in the previous section. To remove this section please see the spoiler below. Spoiler:
To learn how to customize the optional section see the spoiler below. Spoiler:
The routine: Spoiler:
Once the changes have been made, compile and insert into free space. Then navigate to 0x37D30 and make the following byte changes: Code:
Usage: Just set flag 0x205 and let the magic happen. Set variable 0x8000 to 0xFF for the optional part mentioned throughout the post. Important: Please direct questions in the ASM help thread and not to my poor PM box :( |
Battle Frontier routines (Generate a random trainer name)So I've done generating the sprite, generating the team, now it's time to give our random trainer their name. Naming is a little trickier because we can't assign a male name to a female sprite and vise versa. I decided to make a simple system to avoid that which I will now explain here. Skip to the next section if you're uninterested and want to risk making your female sprite be named Arnold. Basically, without mentioning, in my previous post's routine I secretly stored the sprite's ID in variable 0x8001. This routine uses that information to generate a name which fits the sprite. Obviously, the only way to do that is to make a table whose entries are directly linked to the sprite table. How it works is, every sprite ID has a set amount of names which can be assigned to it, when a sprite is chosen at random, a name from the table which corresponds to the sprite is chosen at random. Here is how the table is formatted" Code:
An important note about multi-use You may or may not be familiar with the Rival and Champion trainer class functions so I will briefly explain that to explain this multi-use. In short, if you assign a trainer the trainer class "Rival" or "Champion" they will automatically be assigned the name of your Rival (the one you name in the Oak intro). Some people have hacks in which there are more than 2 Rivals, and if you use some of my naming routines, the player has the ability to name the second rival. This implies that the 2nd rival or important character's name will not be written into the ROM, but rather stored somewhere in the RAM. Which means you cannot just create a custom trainer and have it have the second Rival or important character's name (because like the rival's name, you don't know it to hard code it!). I've taken this into consideration and added some optional code to support this. I've removed the class dependency as well. Now you just need to set variable 0x8000 to 0xFF How to insert: Before compiling the routine in the spoiler below, there's a few things which you may want to customize. 1) The routine is flag toggled. By default I made this flag 0x205. See spoiler below about code to modify this Spoiler:
2) This routine reads from a table of 13 byte long entries, each of the entries correspond to a specific name for a sprite. See spoiler for info. Spoiler:
3) This routine has an optional section described in the previous section. To remove this section please see the spoiler below. Spoiler:
To learn how to customize the optional section see the spoiler below. Spoiler:
The routine: Spoiler:
Once the changes have been made, compile and insert into free space. Then navigate to 0xD8134 and make the following byte changes: Code:
Usage: Just set flag 0x205 and let the magic happen. Set variable 0x8000 to 0xFF for the optional part mentioned throughout the post. Important: Please direct questions in the ASM help thread and not to my poor PM box :( |
Excuse my triple post, but I have an update about the third routine which deals with actually making the trainer temporary. The whole idea of generating a randomized trainer using ASM routines, rather than using a script to pick a random battle from 50 or so, efficiency and time saving aside, is to save the Hacker 50 or so trainer slots which they would have used to make the trainers.
However, it became apparent to me while working on this that there was no need to make a custom trainerID or temporary trainer ID. In any frontier routine, the battle style would be Code:
I think this concludes the biggest problem about implementing a battle frontier in Fire Red. Some of the competitions, atleast the interesting ones, can be done with smart usage of the Pokemon storage system routines, and small edits of game code. I encourage people to post their solutions to said problems. I'm currently working on making minigames in FR. Let me know some of your ideas :) |
Quote:
|
Before I post this, I want to say thank you to everyone here for contributing to this thread, I'd do something if I wasn't so noob at ASM XD..
Anyways, is there a way to lose HP every step instead of regenerate? |
Quote:
For Emerald, I believe you need to change the pointer to evaluator to be 0x081A8D95, as well as changing the movement bytes and the animation (?). Special 0x8F isn't in Emerald afaik, so just replace instances of it with getplayerpos 0x8004 0x8005 (EDIT: it seems to not work if it isnt a special, so it's still easiest to replace one of the specials which point to a nop to point to the routine instead). All instances of 0xA5 should be replaced with the Rock Climb behaviour byte, and all instances of 0x1AF with your attack ID for Rock Climb. This works for any height of Rock Climb wall, provided each Rock Climb wall tile has the behaviour byte specified in this script. You should also assign this script to the behaviour byte, as well as for the field move, so it's multipurpose in that sense. The script could probably be far more efficient, the movement isn't ideal, the "Rock Climb can't be used here" isn't consistent with how trying to Surf where you cannot works, and (due to horizontal Rock Climbing being impossible / ugly with the Gen 3's 2D engine) horizontal movement doesn't work, but for all intents and purposes it's functional. Code:
|
Here are some of Jpans routines ported to Emerald.
All of which will be included in DSLN. Check D-Pad Spoiler:
Delete Pokemon From party(special 62) Spoiler:
Check pokemon Status (Special 63) Spoiler:
Spoiler:
Spoiler:
Change HP (Special 66) Spoiler:
More to come when I feel like it. |
If anybody ever wants the Wally thingy to use your rival's backsprite in Emerald for whatever reason, here's a routine that does just that:
Code:
|
Quote:
|
Warp redirectionThis is something similar to FR's elevator scripts in Celadon dept store. What it does is it redirects all warps to a specific one assigned by two variables (one for map bank and second for map number, I know you can make one variable to hold both of these, but I think the reverse hexing and math calculations might confuse people so 2 variables). I think this will be useful for a single warp or multiple warps which warps you to a different map depending on what's happening. It's better than FR's elevator script because you can have a default warp position, and the redirection only takes 2 setvar instructions (could've been one, but you know) :D How to insert: Code:
Spoiler:
Insert the following byte changes at 0x6DC78: Code:
Usage Unlike other similar routines I made, this one reads the variables to determine if it should execute. Have the Mbank var not equal to 0 to toggle execution. Of course, Mbank = map bank var and Mnumb = Map number var. |
HP Removal per stepIntro: Basically a routine to remove a Pokemon's HP every step. In this routine it's set to 3 per step. You may want to modify the exact amount to a percentage or something (see the commented lines). How to insert: First compile and insert the following routine into free space. Fire Red: Spoiler:
Emerald: Spoiler:
Usage: Set flag 0x270 (or the flag you customized in the routine), then the HP automatically decreases based on the amount you set in the routine every step. You can change the amount removed by reading the lines in the code which I've commented. Note: I did not test any of these; they should work in theory even though I didn't try it personally. This routine is a modification of FBI's, and is requested by Danny. Not sure why you'd want all Pokémon to constantly lose HP per step, so I added a flag check so it's toggle-able. This also doesn't work with the previous regeneration per step routine, if you thought it would for some reason. |
Quote:
To explain the gain routine a little more in detail, lets look at the parts which require changing. Code:
Code:
Code:
Code:
I thought I'd just help you out by pointing out some of the inconsistencies and the changes you'd need to make to make this work. I know you're just editing my gain HP routine, and trying to help. Good luck GoGo. :) |
Quote:
Changes added to the post |
Quote:
|
Update to Egg Check routine:
Now uses var 0x8004 for party slot instead of the user manually using the species. Good idea to use with a special 0x9F(FR) FR Spoiler:
EM (untested but idk why it wouldnt work) Spoiler:
I would recommend using this version of the routine over the old one as its more efficient and works better. Thanks to Touched Senpai for telling me something I shouldve known!, but was too stupid to remember. |
Quote:
|
Does anyone have a routine to open the flightmap in Emerald, I don't think it's a special like the normal map.
Thanks |
While clowning around in my game, I stumbled upon a bug with Protean. The Gale Wings ability (which Otachi has) trips Protean and changes the monster into a Flying type for some weird reason.
Video is silly but it does demonstrate the bug. |
Quote:
Quote:
|
Scrolling Multi-choice boxesMultiple choice boxes have been a really cool, yet in my opinion, a very unmastered feature in ROM hacks. Most people use JPAN's patch to make multichoice boxes, others edit the existing ones in the ROM. However, it seems like there is no solution for when the multiple choice box needs to hold more than just 8 or so options. Most competent hackers seem to have the last option be something which opens another box. It seems clunky and quite troublesome, so I decided to hack it and make it support scrolling and customization :) Here are some things which are in some popular hacks which use a work around that can be avoided altogether with this hack: http://i35.photobucket.com/albums/d178/prossy/20.pnghttp://i.imgur.com/7xjCAol.pnghttp://i.imgur.com/CnolW43.png The hack in action: How to insert: Before getting started with the hack there is a little bit of setting up which is required. You need to set up a table of pointers somewhere in your ROM. This table will be a table of pointers to possible mulitchoice boxes in your ROM. Each pointer in that table will point to a location of another table. The second table will have pointers to 0xFF terminated strings which will appear in your multichoice box. Visually this is what it should look like: Spoiler:
Once you've configured the above tables, take a look at the routine in the spoilers. Code:
Once that's done compile and insert the routine into free word-aligned space! Spoiler:
Now navigate to 080CB94C and insert the following byte changes: Code:
Usage: So this is a hack of special 0x158. I've essentially fixed the hard coded table read, and removed limitters as well as recoded the size readings to read of a variable instead. So the script usage of this implementation is quite simple, yet there are some complications which arise along the way. I'll talk about those complications later and first describe usage! Code:
Code:
Some usage requirements: - 0x8004 = 0. Keep it like this for now until I explain it more a later day. You can play with it too if you want, but it will likely cause a game crash. - The menu does not close unless the "B" button is pressed inplace of an option, OR the last option is selected. FR counters this by having an "EXIT" option as the last option of the multichoice box, and any scripts which use the multichoice box are looped as well. I have a fix for this: Code:
|
Quote:
|
Quote:
What about for setting its x and y alignment? For an example, I would like to have the scrolling multichoice box on the center (or right). Just like the nature of multichoice boxes that can be aligned. |
I want to ask for something. Would it be possible to create a routine that doesn't changes the current music when changing maps?
For expample, I start at Pallet Town with its lovely music, I activate that routine and when I move to Route 1 or enter Oak's Research Centre, it keeps playing the music, although there is specific music for each map I've mentioned. |
Quote:
ROM:08003CE4 |
Music Overriding upon warpQuote:
How to insert: Compile the following routine into free space: Spoiler:
Then insert the following byte changes to 0x807198C: Code:
Usage: Have flag 0x404 set and variable 0x8000 to be the music ID you'd want to play. Only works upon warp. |
Better to post it here :
Here is a very simple routine that makes moves having 0 accuracy never miss. I found that more convenient than set the "always hit flag" in the battle scripts. It is for Emerald : Spoiler:
Also, I saw few people asking for having new "-ate" abilities, which is understandable, so I post them here too if you want to make your custom ones : Spoiler:
|
Quote:
Anyway, thanks a lot for the effort you are putting on this thread ;) |
I'm unsure of the correct place to bring this up, but is there anybody researching expanding the move tutor yet (move reminder in later gens)? The problem is, if your Pokemon has a moveset with more than 20 moves, they won't all show up in the move tutor because that list can only show up to 20 moves. And expanded movesets with more than 20 moves are common with hacks that try to mimic later generations.
|
Quote:
Code:
Sadly it isn’t this simple. This subroutine (at 0x08043C84) is apparently writing the moves to an address contained at the offset 0x0203AAB4 + 0xE8. If anyone is familiar with with what’s going on there and if there is space to add moves (a halfword at a time) that would be great. If it isn’t possible to add more moves there without corruption, it may be necessary to use malloc and change all references to that address. As a side note, I had also wanted to rewrite the relearner to reteach egg moves. I didn’t even know there was a limit of twenty until you brought it up. Edit: I went a level up, and word 0x0203AAB4 is just a temporary pointer to a malloc of size 0xA6C called at 0x080E47A6. It is necessary to understand each area used in that block, or at the very least how their size and offset relates to the maximum number of moves that can be listed. Following from the malloc call to the bl to 0x080E50CC, here’s what I have so far on the block: Spoiler:
|
2 Attachment(s)
I have something for you all. A number input box for Fire Red. Image in spoiler
Spoiler:
This box allows the player to insert numbers in a hack, allowing for many new features such as a banking system, password protected doors and the like. Included in the zip is the compiled code and the source. The source, however must be modified to be compiled in a normal compiler. It's included more as a study material to see how it was implemented. The "number box.out" file contains the compiled code, ready to use. All you need to do is insert the code at a free location, edit the pointer at code + 0x164 to (pointer to code + 0x0179) and then call it with the callASM command followed by a waitstate. You also need to be in a locked state, so use lockall or lock before callASM, and release/releaseall at the end of the script. To change the location of where the box is located change X at code+2 and Y at code+4 and to change the width of the box change the byte at code+6. |
Quote:
Looking forward to combination lock like riddles :D ~SBird Edit: Okay screw me, I just found the "number_box.tmb" and did not consider it being a code file... thanks again for the project :) |
Quote:
1. I changed the pointer you've mentioned. 2. write a script like Code:
Please point out my mistake, thanks. |
Quote:
|
Quote:
|
Another request (A real one this time I promise) : It is quite a neusance for (most) cases that you have to switch the number lets say from 0 to 456786 - For combination locks, codes, and generally stuff that requires LARGE numbers it would be way easier if you could edit digit by digit. Probably you could consider this. :)
~SBird |
Quote:
Another thing is that could you make a detailed note about your functions? I know that it's a bit not realistic, but i really don't know many things in the source code. Thank you very much in advance! |
Hello, since the EXP. Gain canceller had been effin'ly implemented, it's good to have MONEY gain and reduce canceller so that we can make a Battle frontier-like event.
Request |
Quote:
|
Quote:
Quote:
|
| All times are GMT -8. The time now is 8:46 AM. |
![]()
© 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.