Jump to content

Pokemon XG: NeXt Gen


Recommended Posts

Hey Stars. I'm almost at Citadark isle and while watching Jetplit's playthrough I think he mentioned something about giving end game shadow pokemon moves that are more effective against other shadow pokemon. Idk how much this could potentially break the game, but I support this notion! I think it would be more fun if you could do end game and not be able to just wall everything with high level shadows. Admittedly, if this was done it would basically mean you MUST grind to be able to keep up.

Keep up the great work! <3

Link to comment
Share on other sites

I still have the Report though, showing Carvanha as "Snag Failed."

For one thing, the Realgam Tower seems to have some strange bug in the room that causes the screen (at least on the emulator) to go widescreen, as in the screen just shortens in height for some undisclosed reason. It's when I go down the steps and walk around. Cause menus or boxes to pop up, and boom it's okay again for that brief moment. Even while going through, say, your Pokemon screen.

Best I can do is that I think the game was tricked into thinking she was in a single battle and you were in a double battle, since it shifts back to single if that side has no more Pokemon to send out (the mon jumps to the middle of their field).

There's also a weird bug in that no matter who else I target for something like Clefairy's Heal Pulse, it never affected anyone but itself. Target the enemy? Clefairy regained health. Guessing that's lumped in there with all the "engine is incapable of replicating" stuff.

...and literally just now, while grinding my mons a little, a Forretress used Thunder Wave on my Volt Absorbing Jolteon and somehow got through to paralyze it. That's like...literally-just-happened territory. :P

And also off the top of my head, Wobbuffet should not be allowed to use Protect! :P

That's pretty much it though on my petty niggles. I hate sounding negative when I still like it, but y'know...constructive. :)

1. If the report says that carvanha had it's snag failed and not that sneasel was failed then that probably means it worked fine. If you reach the point where miror b. starts appearing then it will probably show up :)

2. I haven't experienced that bug myself but it could be to do with the settings you're using in the emulator? I probably wouldn't be able to do anything about that though. If you try loading up your save in vanilla :XD: you could see if it happens in that as well or if it's particular to XG.

3. Yeah I've seen that bug many times. It's a very situational one though. If one of the shadow pokemon uses a move like shadow burst or shadow smash twice so it's had 2 rounds of stat drops, the AI opts to switch that pokemon out. However, if you snag that pokemon on the turn it was supposed to switch out and the trainer had 3 pokemon at that point then they won't send out the third. This is because the game had already selected the 3rd pokemon to switch in on that shadow pokemon's turn. So when you snag the pokemon the AI doesn't think there are any available pokemon to switch in and since the shadow pokemon was snagged it never gets a turn for the pokemon to be switched in. As a result the pokemon is unable to switch in on that turn and must wait for the other pokemon to be defeated for the next switch-in cue.

It's a bug in the game's original programming but since that situation never came up in the original (trainers never switched out shadow pokemon) they probably never even considered it. I haven't done anything about it because it's so situational and not game breaking but since I've been hearing it's happened to a lot of people now so maybe I'll change some things around.

4. Yes, you are correct on that. Heal pulse didn't work as I thought it would in the gen III engine. I've taken it out of later versions as a result.

5. I just checked on bulbapedia and it turns out that volt absorb only activated on damaging moves in gen III. Status moves only activated it as of gen IV.

6. Thank you, that will be removed in the next version :)

Hey Stars. I'm almost at Citadark isle and while watching Jetplit's playthrough I think he mentioned something about giving end game shadow pokemon moves that are more effective against other shadow pokemon. Idk how much this could potentially break the game, but I support this notion! I think it would be more fun if you could do end game and not be able to just wall everything with high level shadows. Admittedly, if this was done it would basically mean you MUST grind to be able to keep up.

Keep up the great work! <3

I think I was actually in that stream. I remember responding to that comment but I'll repeat it here. In the recent versions, there is a new shadow move called "shadow bully" which is a shadow equivalent of seismic toss. Since the damage is set to the user's level it does consistent damage, even to other shadow pokemon. I think it works quite well actually although I don't know for sure if the AI is good enough to choose it against other shadow pokemon.

It still doesn't do that much damage though so I don't know if it's enough. I was considering making shadow moves neutral on shadow pokemon if I could find the code responsible. Or if I found the code for sonic boom's 20 damage, I could up the value to something like 100 and use that on a shadow move.

Link to comment
Share on other sites

I am currently trying to find the ASM routine that loads in model data to maybe find out how it uses the pointers, I already know where it loads it into memory, it loads the complete file if I'm correct , but I can't get the memory breaks in the debugfast version to work.

I tried both Dolphin 3 and 4 and neither seems to break when it edits a memory adress at which I set a breakpoint ( yes, I did set it to read/write).

Do you know of this issue and any way to fix it ?

*EDIT: I tried getting a texture from a move file and I'm wondering whether this texture is usually this squeezed or I did something wrong :Link ( This is from the megahorn file)

these battle effect textures all seem to be somewhat squeezed, ithink I'm doing something wrong but I don't know what.

*EDIT: Nevermind, I solved the second one This looks a lot better

Edited by Made_s
Link to comment
Share on other sites

I am currently trying to find the ASM routine that loads in model data to maybe find out how it uses the pointers, I already know where it loads it into memory, it loads the complete file if I'm correct , but I can't get the memory breaks in the debugfast version to work.

I tried both Dolphin 3 and 4 and neither seems to break when it edits a memory adress at which I set a breakpoint ( yes, I did set it to read/write).

Do you know of this issue and any way to fix it ?

*EDIT: I tried getting a texture from a move file and I'm wondering whether this texture is usually this squeezed or I did something wrong :Link ( This is from the megahorn file)

these battle effect textures all seem to be somewhat squeezed, ithink I'm doing something wrong but I don't know what.

*EDIT: Nevermind, I solved the second one This looks a lot better

I don't have any clue where that routine could be located, sorry :(. I've never been able to get memory break points to work either. I tried compiling it myself and downloading a precompiled .exe. Maybe dolphin 5?

Pretty cool that you go textures from the moves!

Link to comment
Share on other sites

Those textures (at least the ones I found) are just I8 textures (greyscale), the game uses black as the alpha channel, they're easy to find manually, but I have no idea how I'd find them in a program since I didn't find any pointers pointing to them and some didn't have a header that I could find, there also seem to be different formats for these effect files.

Does Dolphin dump move effects? And if yes, does it dump them as greyscale?

(Since they are greyscale I couldn't help but try it with This , so at least that works fine )

*EDIT: The files can contain different texture formats, it's easy to tell from the headers.

*EDIT: Some of the files store their textures in a section called GPT1, which I somewhat documented Here .

This should be enough info for me to automate files with this structure, the sections I couldn't figure out yet are only a problem if there are textures that have different values at those positions.

*EDIT: So I found out that files can contain multiple GPT1 sections, probably to match them to different things, as they're mostly used in files that also contain model or animation data.

I was also right about the first value of the texture header, it's the number of tetures and the offset at the end is that one texture in case of it being 0x01, if it's for example 0x0B, then there will be 11 offsets and the row of 0xFF works as a filler like in the texture list. This is likely done to reduce the amount of redundant headers, since the textures of one texture header all use the same format and dimensions.

Also if the row in either the texture list or a texture header is filled completely there are no 0xFF s.

The textures that aren't contained in these GPT1 sections seem to be handled in a similar way to the textures in model files.

I'll post a program that extracts these textures into a format that the wimgt tool can use once I get my Java edit of the LZSS script to work.

Edited by Made_s
Link to comment
Share on other sites

So, the extractor part is finished, it extracts any texture in GPT1 sections it can find in an FSYS file (you don't have to decompress it before) and saves them as .tpl files. The filenames are in the format [Name of original file]_[GTP1 section]_[Texture header]_[Texture]_[Format].tpl .

The filename and format are just for your information, the others will be used to put it back in in the reinserting program I'm writing, meaning that you should probably keep the name when converting.

Here's the Link.

Of course, this is all just an option, I don't really see what you'd need to modify move textures for, but if you want you have the option.

Link to comment
Share on other sites

So, the extractor part is finished, it extracts any texture in GPT1 sections it can find in an FSYS file (you don't have to decompress it before) and saves them as .tpl files. The filenames are in the format [Name of original file]_[GTP1 section]_[Texture header]_[Texture]_[Format].tpl .

The filename and format are just for your information, the others will be used to put it back in in the reinserting program I'm writing, meaning that you should probably keep the name when converting.

Here's the Link.

Of course, this is all just an option, I don't really see what you'd need to modify move textures for, but if you want you have the option.

This looks clean :)

One question though. Which programs are good for editing tpls?

Link to comment
Share on other sites

(You can ignore the following for the EDIT)

Like I said, the wimgt tool uses .tpl files and converts them to .png. It's run in command prompt.

If you don't remember, you can find it Here .

If you want to automate it for converting things automatically (You'll need to use wimgt for the model textures too (you don't need to, but it's the fastest way to do it that I know of)), the source code is Here , the relevant part mainly Here .

The command is: wimgt dec [imagename].tpl --dest [destinationimagename].png

The command for converting back into the respective format:

wimgt enc [imagename].png --dest [destinationimagename].tpl --transform tpl.[format]

(format is just the formatname in lower case letters) This is why I kept the format name in the filename, so you don't have to look into the file to find it out.

*EDIT: I found a better way, I found This .bat that uses the wimgt tool and let's you convert multiple files at once ( when you open the .bat it tells you how to use it) without needing to bother with acommand prompt. It works both from and to .png . This needs a small modification in my program though , the format has to be given as a number, this fix will be included with the inserter.

Edited by Made_s
Link to comment
Share on other sites

So now I finally beat the game. Overall I liked it and enjoyed most of this ROMhack, but funny enough I actually preferred your unfinished Colosseum hack compared to this one, and it really has to do with the late game portion. In ways, unless the game is extremely tedious, I like to 100% my games or get as close as possible to doing so. The shadow pokemon, there is a very nice and diverse selection but with them hitting ever increasingly harder, the game puts you in a form of a metaphorical corner with the high levels of the shadow pokemon and the high base power of the shadow pokemons moves. When trying to capture them the first go around, unless you are extremely overleveled or have a good amount of your team as shadow pokemon, they will most likely beat you down before you can even capture them. It doesn't help that towards the end of the game, you are capturing legendary after legendary who have very low capture rates, sometimes even multiple legendaries in one battle which means you need to stock up on healing items, which is hard because there is no quick way of actually obtaining lots of money in a short time frame, even with the usage of the amulet coin. So in the end, with the sheer number of legendaries, it can get pretty tedious. This wasn't such a big deal in your unfinished Colosseum hack because every trainer with a shadow pokemon only had one shadow pokemon max, where after OBNS, most trainers will have two and most bosses will have 3 or 4 shadow pokemon so in a completionists eyes, it can be detrimental to ones enjoyment of the game.

Overall, something needs to be done about the legendaries, whether it's revamping their shadow movesets, increasing their capture rate or even just lessening the amount of shadow pokemon one needs to capture in future updates or whatever. In the Vanilla, one could easily playthrough the game with whoever pokemon they desired, but in the ROMhack, you're in ways forced to use specific pokemon or roll around with 2-4 shadows in your team due to the massive power creep as the game goes on, at least for people who want to capture all the shadows. My complains don't really apply for the people who just want their team of six and then KO all over shadow pokemon. I still liked the game and still enjoyed it, but unless this ROMhack sees massive changes in later updates, it's a ROMhack I can't see myself replaying in the future, unlike Masoleum in which I plan on going back to within 2 years timeframe. Maybe I was expecting too much from this. I understand this is the only one of it's kind and it's very impressive you were even able to accomplish this as if it wasn't for you, we'd never would have had a ROMhack of the gamecube games in the first place so I applaud you for that.

But, uh, thank you, anyway for what you did.

Link to comment
Share on other sites

*EDIT: I found a better way, I found This .bat that uses the wimgt tool and let's you convert multiple files at once ( when you open the .bat it tells you how to use it) without needing to bother with acommand prompt. It works both from and to .png . This needs a small modification in my program though , the format has to be given as a number, this fix will be included with the inserter.

That sounds extremely useful. Nice find!
So now I finally beat the game. Overall I liked it and enjoyed most of this ROMhack, but funny enough I actually preferred your unfinished Colosseum hack compared to this one, and it really has to do with the late game portion. In ways, unless the game is extremely tedious, I like to 100% my games or get as close as possible to doing so. The shadow pokemon, there is a very nice and diverse selection but with them hitting ever increasingly harder, the game puts you in a form of a metaphorical corner with the high levels of the shadow pokemon and the high base power of the shadow pokemons moves. When trying to capture them the first go around, unless you are extremely overleveled or have a good amount of your team as shadow pokemon, they will most likely beat you down before you can even capture them. It doesn't help that towards the end of the game, you are capturing legendary after legendary who have very low capture rates, sometimes even multiple legendaries in one battle which means you need to stock up on healing items, which is hard because there is no quick way of actually obtaining lots of money in a short time frame, even with the usage of the amulet coin. So in the end, with the sheer number of legendaries, it can get pretty tedious. This wasn't such a big deal in your unfinished Colosseum hack because every trainer with a shadow pokemon only had one shadow pokemon max, where after OBNS, most trainers will have two and most bosses will have 3 or 4 shadow pokemon so in a completionists eyes, it can be detrimental to ones enjoyment of the game.

Overall, something needs to be done about the legendaries, whether it's revamping their shadow movesets, increasing their capture rate or even just lessening the amount of shadow pokemon one needs to capture in future updates or whatever. In the Vanilla, one could easily playthrough the game with whoever pokemon they desired, but in the ROMhack, you're in ways forced to use specific pokemon or roll around with 2-4 shadows in your team due to the massive power creep as the game goes on, at least for people who want to capture all the shadows. My complains don't really apply for the people who just want their team of six and then KO all over shadow pokemon. I still liked the game and still enjoyed it, but unless this ROMhack sees massive changes in later updates, it's a ROMhack I can't see myself replaying in the future, unlike Masoleum in which I plan on going back to within 2 years timeframe. Maybe I was expecting too much from this. I understand this is the only one of it's kind and it's very impressive you were even able to accomplish this as if it wasn't for you, we'd never would have had a ROMhack of the gamecube games in the first place so I applaud you for that.

But, uh, thank you, anyway for what you did.

Interestingly enough, most people have said that XG was too easy! The aim was to make it more challenging but how hard it is really depends on your play style. I've watched many playthroughs of XG (and :XD: too) and played through many times myself.

As you mentioned, probably the best way to play XD/XG is to have 1-2 shadow pokemon in your party since they completely wall opposing shadow pokemon. It's precisely because of how easy they are to wall that they've been made monstrously strong in XG.

I also saw a stream by PinkOnion where he made light work of the game with prankster sleep powder on jumpluff. Paired with a fakeout user it was unstoppable! Shadow jirachi is also really good for the end game shadows.

It is possible to go through the game without grinding at all if you use the lucky egg and exp share carefully and don't fill your team too quickly but :XD: has Mt.battle in it just for grinding. The starting levels of Mt.Battle are increased so it's really easy to get back on the level curve if you fall behind. There are also colosseum battles and the duel square.

Another thing to note is that, as with the original :XD:, a lot of the shadow pokemon have increased catch rates so while a lot of the legendaries might look intimidating because you know their real catch rates, they are actually far easier to catch than you'd think.

Of course, I know the game inside out by now so I know all the little tricks to the game. I'm not sure I agree on a few points like having no way of making easy money. I also disagree that you have to use specific pokemon. I put a lot of effort in to make each pokemon as useful as possible and I've seen all kinds of pokemon in all kinds of playthroughs. In Jetsplit's playthrough his team was constantly changing throughout.

I've watched PinkOnion tear through XG 3 times in a row so it's refreshing to see that it does have an increased difficulty after all.

I'm sorry if it wasn't to your liking but hack tools are coming soon so if you ever do come back to XG feel free to tweak the game to your liking :)

Link to comment
Share on other sites

Ok, I finished the Inserter program and it should now be working.

The fixed Extractor is Here .

The Inserter is Here .

I wrote up a (unfortunately) rather long tutorial on how to use them for someone in the group which shouy ex how they're used well enough (though you can be more free with it as it will tell you about any problems as usual):

To Extract Textures ( You'll have to do this to insert anything, you can only insert edited versions of the extracted files as the replaced textures must retain their dimensions and texture type) :

Use the MoveTextureExtractor jar , enter the name of the .fsys file and click Extract Textures.

This should extract all contained textures.

(Please have the .fsys file,the textures and both programs in the same folder)

Please don't modify the filenames of the textures (they're in the .tpl format )

Then use the conversion program by selecting any texture you want to convert and dragging it onto the .bat ( you can do this with multiple ones at a time)

Then just edit the resulting .png images. (I think they're all greyscale so using color probably won't do anything and youshouldn't do it)

Then delete the old unconverted texture versions of the files you edited and drag the .png's onto the .bat.

This will create new texture files of the images.

Put those resulting textures back into the folder with the jars.

Then open the MoveEffectInserter jar and drag and drop all textures you want to insert at a time into the top box.

Enter the filename of the original .fsys and click Insert File(s).

If it doesn't give you any errors they should now be inserted

This took me quite a while longer than what I expected but I really wanted to get the Drag and Drop feature to work because you seemed to like the clean design of the Extractor ( I was also sick of entering file names for every single thing I do )

I might make all these texture things into one thing later just so I don't have to spam you with posts with little jars every time I find something new.

Maybe this could be used to make your attack animation replacements look better ?

I'll continue research into model files, I'll tell you if I find something useful/significant.

Edited by Made_s
  • Like 1
Link to comment
Share on other sites

Well, like I said, I didn't hate the game. I don't ever beat games I don't like, and I beat this one, so I found at the very least enjoyment out of it. I was just expressing my opinions though the eyes of a collector/completionist. But I guess I am also a bit salty from spending 2 hours trying (and failing) to capture Troy's Kyogre, to spend 1 and 1/2 hours to grind up enough money to replace the 80 ultra balls, 30 timer balls, 15 net balls and 25 leftover greatballs that I all used on Troy's battle, just to spend another 2 hours capturing Des' Groudon and Mewtwo.

But I'm also very unlucky in Pokemon in general. With my luck I could swear Hypnosis was actually 40% accuracy

Link to comment
Share on other sites

  • 2 weeks later...

I've just finished this hack, and it was pretty darn good, great job.

I want to do a new playthrough, with "improvements" of my own, so i want to ask you 2 questions:

1. How do you edit the abilities/base stats of a Pokemon?

2. Any way to edit the Shadow Pokemon you can get?

Link to comment
Share on other sites

I've just finished this hack, and it was pretty darn good, great job.

I want to do a new playthrough, with "improvements" of my own, so i want to ask you 2 questions:

1. How do you edit the abilities/base stats of a Pokemon?

2. Any way to edit the Shadow Pokemon you can get?

Here's my tutorial: -hacking-tutorial-part-1-File-decompression-recompression'>Pokemon colo/xd hacking tutorial

However, it's rather long tedious. I am currently working on hack tools though. Should be a few weeks.

Link to comment
Share on other sites

Here's my tutorial: -hacking-tutorial-part-1-File-decompression-recompression'>Pokemon colo/xd hacking tutorial

However, it's rather long tedious. I am currently working on hack tools though. Should be a few weeks.

Thanks for your reply, i've read your guide, but i must say i have absolutely no knowledge in hex, so it will be kinda difficult.

I am however, definitely looking forward to your hacking tools.

Link to comment
Share on other sites

  • 2 weeks later...

I'm still working on documenting the whole model file format ( the most of it is the HAL DAT format but some top level structures that are specific for :XD: and the animation data are undocumented) but since I already know enough to write the model texture extractor/inserter you wanted I did just that.

Extractor : Link

Inserter: Link

They work pretty much the same as the ones for move textures, with the change that you need to specify the offset of the main data ( not the start of the data) so 0xE80 for normal model files, not 0xE60 ( you need to enter them in decimal, so 0xE80 would be 3712) .

Also the list of files you are about to process is always reset when you drop files into the window, so you have to drag all the files you want to process at once.

There are some files that (for some reason I don't know yet) have a GPT1 section ( the one I was talking about in the move files) before the model data, for now you'll just have to put the Offset to the actual model data, I'll probably put out a fix once I know what to do with that.

(My guess is that these are particles that are present on the model since I found this in Articuno's file, which probably has some kind of ice particles on it. Do you know whether it does?)

You have the option between merging or throwing out one of the currently most similar colors until the palette fits in the case that a palette is too big, the merging process might produce weird colors you don't want in the textures, but this is just a kind of last resort since converting textures with the .bat usually already decreases the palette by quite a bit and gives you enough freedom for modifications. Most textures don't use palettes anyway. I'll probably fix the merging thing when I have the time.

The Program should work with Maps, Battle models and Overworld models.

If there are any Problems/Errors with this, please tell me about them and I'll try to help.

*EDIT: made the programs more user friendly

Edited by Made_s
  • Like 1
Link to comment
Share on other sites

  • 2 weeks later...
I'm still working on documenting the whole model file format ( the most of it is the HAL DAT format but some top level structures that are specific for :XD: and the animation data are undocumented) but since I already know enough to write the model texture extractor/inserter you wanted I did just that.

 

Is the Battle Revolution model/animation format the same? Would importing models (of the gen 4 Pokemon) from there be possible?

Link to comment
Share on other sites

I'm not sure, I know how most of the :XD: format works now but I'd have to look into the Battle revolution format to find out how similar they are, I know they don't have the same structure but if they're not too different I could probably import models from there with a bit of data shifting.(PBR might also use shaders for textures/surfaces which might make the imported models look very different in that aspect)

The biggest problem is the animation data, I still don't know how it works in :XD:.

Then there are particles contained in model files. I could just leave them out but models like Charizard would probably look weird.

It's very possible to do it, but there are things that need to be done/found out first.

Edited by Made_s
Link to comment
Share on other sites

1. If the report says that carvanha had it's snag failed and not that sneasel was failed then that probably means it worked fine. If you reach the point where miror b. starts appearing then it will probably show up :)

2. I haven't experienced that bug myself but it could be to do with the settings you're using in the emulator? I probably wouldn't be able to do anything about that though. If you try loading up your save in vanilla :XD: you could see if it happens in that as well or if it's particular to XG.

3. Yeah I've seen that bug many times. It's a very situational one though. If one of the shadow pokemon uses a move like shadow burst or shadow smash twice so it's had 2 rounds of stat drops, the AI opts to switch that pokemon out. However, if you snag that pokemon on the turn it was supposed to switch out and the trainer had 3 pokemon at that point then they won't send out the third. This is because the game had already selected the 3rd pokemon to switch in on that shadow pokemon's turn. So when you snag the pokemon the AI doesn't think there are any available pokemon to switch in and since the shadow pokemon was snagged it never gets a turn for the pokemon to be switched in. As a result the pokemon is unable to switch in on that turn and must wait for the other pokemon to be defeated for the next switch-in cue.

It's a bug in the game's original programming but since that situation never came up in the original (trainers never switched out shadow pokemon) they probably never even considered it. I haven't done anything about it because it's so situational and not game breaking but since I've been hearing it's happened to a lot of people now so maybe I'll change some things around.

4. Yes, you are correct on that. Heal pulse didn't work as I thought it would in the gen III engine. I've taken it out of later versions as a result.

5. I just checked on bulbapedia and it turns out that volt absorb only activated on damaging moves in gen III. Status moves only activated it as of gen IV.

6. Thank you, that will be removed in the next version :)

Hi again, Stars. I just finished the game (at least the main story), and now that I've finally finished it, I decided to do a non-stream quick run-through of the game. I did not realize (since I didn't save at the right time, or I overwrote that save from being so salty at the time) that Commander Ray had TWO Shadow mons, one a Sneasel and the other a Carvanha.

That Carvanha you said I would find with Mirror B eventually? NEVER showed up again. For the entirety of the playthrough. Only ever got the Sneasel. But sweet holy CHRIST I must've been crazy or something, or the game just glitched up for that fight. But this time, I CAUGHT the damn thing, so I can finally do this game proper.

Sorry for such a random update on the subject, but I FINALLY finished this thing and had an epic ending. Thanks again for making this, and here's hoping 0.9.8 is even better this time.

Link to comment
Share on other sites

  • 2 weeks later...

And another thing that kinda just popped up on my game.

Recently I've been using this save-checker my friend recommended to me (he was using it himself to raise all his XG mons perfectly with perfect IVs and EVs), and during this second playthrough I figured why not do that myself. So I've been doing it, and all of a sudden, my Ludicolo's turned into...I think it's a Bad Egg. I can't use her in battle, she doesn't gain experience from Exp. Share, and I can't get rid of Surf. I thought it was an issue with the wrong layouts for EVs, but they're still all right. It had an "egg" indication checked, but I unchecked it and put the file back in. Still Bad Egg. To anyone who would know and still reads this, how would I fix such a thing? I don't want to break the game with this, I just wanted an easier time...

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...