(Link to AcmlmWiki) Offline: thank ||bass
Register | Login
Views: 13,040,846
Main | Memberlist | Active users | Calendar | Chat | Online users
Ranks | FAQ | ACS | Stats | Color Chart | Search | Photo album
03-29-24 09:15 AM
0 users currently in World Affairs/Debate.
Acmlm's Board - I3 Archive - World Affairs/Debate - Continuing a debate from Pokémon Hacking
  
User name:
Password:
Reply:
 
Options: - -
Quik-Attach:
Preview for more options

Max size 1.00 MB, types: png, gif, jpg, txt, zip, rar, tar, gz, 7z, ace, mp3, ogg, mid, ips, bz2, lzh, psd

UserPost
Tauwasser
Posts: 35/46
I won't even go into detail here. However, I'll tell you, you never will encounter an event that points to your "second set of scripting codes" (they're not scripts btw, but you wouldn't give a fuck). It's simply not possible to have an event point directly to text at all. And it wouldn't make sense either, cause all of your "scripting codes" cannot do nearly as much as the real set is capable of.

I think, I actually explained well enough in the header in the tutorial itself.


Scripts are used in Pokémon games to make the interaction with persons, items and special events possible. This compendium relates to gold and silver! It will explain the structure of each single scripting code. These codes are found in form of bytes in the rom and this is what is called a script.
To find scripts, refer to the event structure and the script header to find documentation about script pointers.



That's what my codes are. The are used in every single interaction with a people event (ok, except for trainers, balls, and some other crap which is explained in the tutorial section referred to in the text). You cannot do what you're saying. It's simply impossible. Maybe you just encounters scripts, that first thing they do, call to another script... That'd explain the 00's at the beginning.

As for the rest, I think I don't need to explain for yet the fifth time, that the routines described were all hacked long ago. I simply don't remember and never put up with writing them down. It can actually be done in some hours when you really know what you wanna accomplish.

Ok, forget about the signing part. That was indeed crap, now that I actually looked at it. Somehow I thought there were less characters for text and it would fit in 0x7F tiles. Whatever, I didn't hack the games for quite some time now actually :-/

So, you're used to writing long documents? How come? Your longest (the OOT one) has 33,177 characters and 7,083 word. My compendium has 62,167 characters and 13,139 words (English language version). No doubt yours is long. However, writing two documents (about the size of my documentation of asm calls actually) and one longer one doesn't make you "used to it". Granted, I don't want to badmouth your work. It's some real nice work, actually.


DMA? Are you sure you have any idea what you're talking about? DMA is of no use in this scenario, unless you were to decompress the graphics to RAM and then use DMA to copy them to VRAM. Since the screen is off during map loading, VRAM is freely accessible, so you can avoid this massive waste of RAM and just decompress directly into VRAM.


And that's exactly the point. I wanted to make it fancy, as I already said. You do know, that with map connections the tileset doesn't reload (that's why route houses are used all over the place). I wanted it to decompress the tileset to ram first, then dma it in there. That way, it might not have been noticably slower than the regulat ones, plus places with different tilesets could be connected. However, that was much too much effort back then (when I didn't have as much experience). So that's what I'm saying and that's why I dropped it. Mainly, yes, it would be ram exhaustive. Nonetheless, the effect would be good


Actually, it does. For some reason, you don't write the right palettes there to begin with but directly to screen.


Your code. Doesn't. Write. The right palettes/attributes. There. (<-- being C3A0 + CCD9, the locations talked about earlier). That is, why there is a routine that corrects the palettes. However, this particular routine writes the wrong attributes (the ones from last screen) to there. I don't see why it would make sense to write last screen's attributes there when you're always at the current screen. You took for granted that the same screen would always be at 9C00 instead of some other screen.
That's all I'm saying. I won't even bother from now on to argue about that.


So if I'm understanding your poor explanation correctly, it sounds like your hack simply lets someone set all 8 bits of the tile attributes, which would let them use VRAM bank 1, and changes something related to how tiles are loaded to VRAM.


Nope, it only accesses the lower 4 bits of the attribute byte. That's numbers from 00 to 0F. I explained it earlier (when you were trying to change my words around). The routine at 2:4000 is responsible for this. It reads 4 bits, but only ever sets three (original design). I changed it so it reads 4 bits and sets 4 bits, too. 3 of these being palette attributes and the 4th being the vram attribute.


It's taken this long just for you to explain why the information in your script document is inconsistent with everything else


Just to reiterate here a bit, it took this long and still you don't see how only your information is inconsistent with everything else so far. That's what bothers me.


Who cares? I have MP3s of the music too. It has nothing to do with any of this.


It's actually part of the compendium and is referenced with every music code there. However, you wouldn't have noticed: rolleyes:


Like I said before, you work with a different version of the game, you aren't willing to share your work, and when you do you fail to explain it nearly enough. Hence there's really no reason for me to listen to anything you have to say.


I have well-explained that it applies to the German, English and Japanese version even (of course, I didn't release a tutorial in Japanese...). As a matter of fact, I want to see "your version" of the rom working just with scriptpointers pointing to in-text-codes without major readjustment and losing every last bit of advantage the script engine has. Thank you.

cYa,

Tauwasser
Thexare
Posts: 960/1104
Originally posted by Dan
It's more like an argument, where one side is attempting to character assassinate the other.

You didn't know? They're politicians in training.
Ziff
Posts: 1272/1800
Originally posted by Dan
(no one does, by the way)



I do.
Dan
Posts: 212/219
Having read this thread, it's easy to tell why Tauwasser is a wee bit upset. You've basically come along and said he's made all his scripting stuff up. Or in other words, he's a big fat liar. Which actually isn't the case.

If you actually took the time to follow his mini-tutorial, right in this very thread, you'd actually see that his findings (and document) check out. You shouldn't be so stubborn, and accept the fact that you don't know everything. (no one does, by the way)

Even though this thread is one of the most interesting threads I've seen on this messageboard in a long time, I don't even know why it exists. It could have been done in private messages, and it is not a 'world affair' or even a 'debate'. It's more like an argument, where one side is attempting to character assassinate the other.
HyperHacker
Posts: 3911/5072
What in the world are you even talking about anymore?

Originally posted by Tauwasser
Originally posted by HyperHacker
Originally posted by Tauwasser
hacked the palette-routine at 2:4000 to numbers higher than 7.
The GBC doesn't have palettes higher than #7. Unless you mean being able to choose from more than morning/day/night/black, which has nothing at all to do with anyhthing we've discussed.


Actually, I never said anything about a palette #8 to #F, I just said it would accept higher numbers. Because, as you might know, attributes from 08 to 0F for a Tile set it to VRAM1. That's what I'm talking about.

Then why didn't you explain it this way to begin with? I think 90% of the time the problem is simply that you haven't explained well enough what you're saying.


I don't know WHY you never ever noticed the broader set of scripting codes, but it's all good, they're there.

Well it's just that I've done the exact same process with other sprites, plus writing a map editor from scratch, and the script pointer led directly to the "second set" every time, usually directly to a 00 Print Text code. Your document is the only one I've yet seen that mentions this other set at all, and it's never come up in any of my work. When I would open that document I'd see a list of codes that doesn't match any other documents nor my own personal experience, and thus logically assume it's simply wrong like the hundreds of other poorly-translated documents which pretty much just toss random numbers into a file. There's no mention save for one small paragraph near the bottom of a second set of codes, nor any information as to how the game tells them apart. Again, you haven't explained nearly well enough.


Originally posted by HyperHacker
There shouldn't have been any reason to hack VRAM copy routines or worry about VBlank time. You need only have it change to bank 1 before decompressing and change the destination address, and the game will happily decompress 256 tiles into VRAM without any timing issues. I dunno what the heck you did, but it certainly seems to be a strange way of doing it.



Nah, I worried too much back in the day, because writing it directly to ram is somewhat awkward, when you can use dma. However, I couldn't come up with something better than that without breaking the whole game :-/ or at least the period between mapreloads looking crappy. So yeah, I decided to leave as is and implemented what you said earlier.

DMA? Are you sure you have any idea what you're talking about? DMA is of no use in this scenario, unless you were to decompress the graphics to RAM and then use DMA to copy them to VRAM. Since the screen is off during map loading, VRAM is freely accessible, so you can avoid this massive waste of RAM and just decompress directly into VRAM.


Originally posted by Hyperhacker
I see what you mean, but your solution doesn't make a lot of sense. Why copy from the current screen to the current screen?


Actually, it does. For some reason, you don't write the right palettes there to begin with but directly to screen. It's, however, not my code and I only had a glance and can tell you only this, so be the cool hacker you claim to be and fix it yourself, I just wanted to help you out.

I know how my code works. I don't, however, have any clue WTF you're saying.


Originally posted by HyperHacker
Sure, that'd be a nice way to do it - if the Game Boy used 9-bit memory.


It would even be greater to just use the 7th bit # >= 0x80 --> VRAM1 instead of 0

Sure, if you don't want to be able to display text at all, seeing how text is tiles 80-FF. Even if you hacked up some solution for this, you're still working with 256 tile numbers and thus haven't increased your amount of tile space at all. You've simply moved half the tiles to another bank.


Originally posted by HyperHacker
So mine does everything your does, plus the GBC-only screen that ensures people don't get stuck on an old GB when they play for a few hours and suddenly walk into a large tileset. How, then, is yours better?


I didn't have to rewrite all the routines like you did. Basically, I changed only the loading routine and the palette setting routine for the tiles, and the block limit (optional), and that's it.

So if I'm understanding your poor explanation correctly, it sounds like your hack simply lets someone set all 8 bits of the tile attributes, which would let them use VRAM bank 1, and changes something related to how tiles are loaded to VRAM. An interesting concept, but not the same as what mine does, so you can't really say one is better or worse than the other.


You're gonna have major problems once in a while with other screens too, I bet you.

I've tested this quite extensively and not yet seen any such problems aside from in the Pokégear. If one should arise I'm sure it'd be fixed the same way, or in the worst case, by backing up the video buffer to RAM.


Actually, as far as I remember, there is a check somewhere for attribute #7 to hide sprites and they wouldn't get hidden under just attribute #F, that's why I did that extra and 7 somewhere in that routine. It wasn't a persisten problem in every screen though, just sometimes it would occurr. I don't know. I already told you, it's long long ago, so I don't remember properly what I did especially why.

Once again, please explain in detail what you're talking about because I can't tell what you're saying at all. You talk about fixing "it" in "that routine" to prevent sprites from hiding/not hiding "somewhere". I've yet to see sprite hiding problems with my hack.


Of course, you can always check out my code and see that 1st, it's not yours, 2nd, how it does stuff.

No I can't, because you haven't posted it. I'm not going to dig through a patch for a completely different version of the game just to see how you did something I've already done.


Oh yeah, mine is better because it's actually used, too.

More people use Windows than Linux, does that mean Windows is the best OS?


Midnight Hack isn't just some "add-a-map"-hack. It's a completely new hack. You might even enjoy the new intro I did

Yipee. My patch is also being used in at least two hacks currently in the works, and my hack also has a new intro. The image has been on my website for ages; right now it's just simple placeholder text but it's a hacked intro nonetheless, and the final version should be quite a bit more impressive.


Also, as you might see on that page, I'm a member of that hacking group and I did it and you can take my word for it. Please don't start that silly argument. I mean, I could also just claim you found these asm hacks and the patch on the streets of wherever you live and just put em online under your name. However, I didn't doubt you, did I? I expect the same thing from you, too. Remember how somebody is not guilty until guilt is proven and not vice versa ?

Fair enough, although I do think Photoshopping a screenshot to impress someone is a bit more likely than finding a fully working but never released ASM hack with source code just laying on the sidewalk.


Originally posted by HyperHacker
Nor are most of my notes, though I've been slowly compiling them into one nice document. That never stopped me from looking up some info when someone asked about it though. Unless your notes are so bad even you can't understand them anymore, you should be quite able to take the two minutes necessary to look up an address or something.


I never said I couldn't get you a specific information (as long as I have it compiled in there). However, I said I wouldn't give them out with candy for Halloween. It's simply that too many people are gonna translate it with babelfish and then tell me I wrote crap. It's funny how many people think babelfish is the authority in translating documents and postings.

You don't seem to have understood at all. I'm talking about when someone asks, for example, "hey does anyone know where the routine is that loads tiles to VRAM" and you respond with "go find it urself" instead of taking 2 minutes to look it up and say "yeah it's at xxxx". People ripping off entire documents has just about nothing to do with refusing to take the time to look up one small piece of information for someone.


Originally posted by HyperHacker
If they're so crappy, everyone's just going to put down the copycat for releasing crappy documents anyway.


You sure would think so, wouldn't you? However, quite the opposite happens for some ununderstandable reason.

Funny how none of these sites come up in the first few Google results for "pokemon script hacking".


I actually stopped caring a long time ago about these as they didn't answer my emails. It's funny as is, but people seem to appreciate crappy translations by author unknown publicized by noob_idiot1337yeahbaby than the real thing.

Maybe because that's all there was for so long, and when you finally did translate it, you barely publicized it?


Ever since I posted that document which was translated to my fullest ability and command of the English language, you started stating how it was wrong, made up, and basically crap for some other fucking version of the same game.

Indeed, I thought it was wrong because, like I said before, you made no attempt to explain why the information within was completely different than that of my own experience and all the other documents. I offered possible suggestions as to why it might be wrong, ranging from being entirely made up to being for another version of the game (IE the German version) since it doesn't actually say which version it applies to.


It's like you didn't have any idea at all just to how hard it is to write 42 pages trying to be consistent in style and explanation.

No, because what would I know about writing long documents?


I even ripped all of the music out of there (with help of some friends) as mp3 of the first 9 or 10 seconds).

Who cares? I have MP3s of the music too. It has nothing to do with any of this.


The latter because I have zero knowledge of music, though I completely deciphered the music routine in technical terms (which doesn't help people knowing how to create music, as he and I use different terms and crap and the engine behaves oddly, too, because me and him, we couldn't map what the engine does to the changes in music...) However, he composed some one-channel songs of Evanescence

And have you posted this information anywhere? If not, why should I care?


Anyways, I hate how you people don't wanna learn and try if "that dude" is right or not.

Funny, I hate how "you people" don't wanna teach and tell "that dude" if he's right or not.


No, you just dismiss it by saying "I never encountered these. They must be wrong, you must be stupid putting 08 in a script and not crashing.

Well I never did encounter them and you never attempted to explain until now why they were listed in the first place. I never said you were stupid, I simply said there's no way you could have actually put 08 in a script thinking it does an if-zero check and not had the game crash, since 08 actually executes ASM code following it.


It may be two versions, but really, what you did was lying to us SOB".

Again, not what I said at all.


I mean, c'mon, it was all directly in front of you and you didn't bother of fearing to be publicly proved wrong. That's how it seems to me and that's really unfair, too.

WTF? Did you just forget how to speak English here? I can't tell what the hell you're trying to say anymore. I know you're capable of much better grammar than this. Are you just trying to confuse me?


I think you really need to learn how to better explain what you say, because a lot of the things you say simply don't make any sense until you post a more detailed explanation later. It should be easy to see why I'd assume you're lying and/or faking when you post screenshots of a hack, then try to explain how it works only to have your explanation make no sense at all. (DMA for decompression? Flagging tiles' VRAM banks in the buffer at C3A0 for no good reason? It really makes it sound like you have no idea what you're talking about.) It's taken this long just for you to explain why the information in your script document is inconsistent with everything else, and you still haven't explained why or how some events point to one set of codes and some point to the other set. It seems the only way to get any information out of you is to accuse you of being wrong and/or lying.

I don't care to compete with you but I certainly don't want to work with you either. If you want to stop being an elitist and start helping people for once maybe that can change, but otherwise I'd be quite content just ignoring you entirely. Perhaps I should have from the beginning. Like I said before, you work with a different version of the game, you aren't willing to share your work, and when you do you fail to explain it nearly enough. Hence there's really no reason for me to listen to anything you have to say.

You should know I've been slowly developing a large-scale hack of this game and an editor to go with it for years. That means I've been reverse-engineering whatever I need to accomplish what I want, and documenting my findings as I go. That means until the hack and editor are complete, all of my documentation can only be considered a work in progress. Of course it's going to have some errors and missing pieces when it's not finished. Neither of these things have yet reached the point where I've needed to edit scripts, so I've only done basic research into them; of course it's quite feasible that I might not encounter a second set of codes. It's a bit silly to ridicule a work in progress, don't you think?
Tauwasser
Posts: 34/46
So, you want to work with me than against me, right? Then stop denying that I'm right Maybe you should get to know your rom better, also.
So, actually,

Originally posted by HyperHacker
Originally posted by Tauwasser
hacked the palette-routine at 2:4000 to numbers higher than 7.
The GBC doesn't have palettes higher than #7. Unless you mean being able to choose from more than morning/day/night/black, which has nothing at all to do with anyhthing we've discussed.


Actually, I never said anything about a palette #8 to #F, I just said it would accept higher numbers. Because, as you might know, attributes from 08 to 0F for a Tile set it to VRAM1. That's what I'm talking about.

Originally posted by Hyperhacker
Yes, those are the codes I was talking about. Your information looks correct there. I've hacked peoples' scripts before though, and not once seen this second set you describe here. The script pointers all point directly to the script commands I mentioned (00=print text, etc).


You are wrong. And I'm gonna show you. Just because I like you. So, first off, I have the English version rom of Pokmn Gold here. But I'm gonna D/L one instead and tell you it's CRC-32 and MD5, just for you to be sure. MD5: A6924CE1F9AD2228E1C6580779B23878 CRC-32: 6BDE3C3E
So, my rom is 0671 - Pokemon Gold.gbc dumped by Oldskool. So, where to begin.... Well, right. You hopefully know about mapheaders and the like. Off we are to 0x940ED. That's the map bank pointer table for your information. Every pointer stands for a map-bank and points to the first mapheader in the map bank. The list is FF-terminated.

There are bytes 2141 there, so let's go to our first mapheader for map 1.1 at 94121.

2506036D5B1B090101

So. It's out first mapheader. It's a PokéCenter. Tileset 06. Permissionbyte 03. 2nd mapheader @ 25:5B6D. Location on world map is 0x1B. Music is 09. Time of day is 01, morning. Fishing byte is 01, a random set, because you obviously can't fish in a PokéCenter.

So, let's examine the 2nd mapheader @ 95B6D:

0004052BE842510040C54000

Border block is 00, a black block. Dimensions are 04x05, height times width. Blockdata/mapdata is at 2B:42E8. Scriptheader (see my doc for information) is at 51:4000. Events are at 51:40C5. Connections are none, hence 00.

Let's go to the event data. at 1440C5:


0000 Bytes with no use, just filler bytes (I checked the asm)
03 # of warps, 03
070301010E Warp #0
070401010E Warp #1
0700011401 Warp #2
00 no triggers, 00
00 no signposts either, 00
04 # of people events, 04
3705070600FFFF00000240FFFF people event #0
3B080C0501FFFF00000540FFFF people event #1
3A07060600FFFFA0000840FFFF people event #2
29050B0600FFFF00000B40FFFF people event #3



These are all generic People events, they all have only 3 byte codes in place. However, we're gonna play. Let's go to the first people event's script codes @ 51:4002 (see my doc), since all other scripts for other people follow that one.

@ 144002

0C0000 Script for people event #0
0C2D00 Script for people event #1
510E40 Script for people event #2
516740 Script for people event #3

You can check with my doc now.

So, the first one starts a pokécenter-dialog. That's the woman behind the counter. It's terminated after it finishes without a special code.

The second one is a happiness counseling dialog. It'll tell you something like "PKMN#1 is very happy" or so.

The other two actually refer to text within this rombank.

Two textcodes, one for text @ 51:400E and one @ 51:4067. This is, where your known codes happen. Both texts start off with 00Textextextextex and end with 57 (which will terminate the whole text process and not let any other codes take place. feel free to put a 50 for the first occurence of 57 and watch people event #2 say his text and event #3's text as well (of course, it'll screw up )

So. I said I'm gonna have phun. So basically, I'll tell you what to do. Either you do it, or you don't.

Set the scriptpointers for events #1 to #3 to 0x2812. That will make them not lose it, once we're done with the scripts and you enter that map.

So, that's event #0 left for us to play with. Let's make it a give-pokémon script instead of that oldfashioned pokécenter talk

So off we go. I'll make it so you can only get the pokémon once or else, it will be the PokéCenter lady talk.

311A00 - check whether pokémon was already given.
080B40 - If it wasn't already given, goto code for giving
0C0000 - PokéCenter dialog
331A00 - Set bit no so it won't be given twice.
47 - load font and start textbox, the code afterwards is gonna output something
2DFB050000 - Give a Pkmn Celbi at lvl 05 without item and with your own trainer ID
49 - rewrite sprite moving tiles to ram, we don't want ABCD's walking about.
90 - end script

Notice, how I used the bit no that s given by Elm once you got a pokémon, so it won't work unless you cheat your way there without a pokémon or have a handy cheat menu incorporated or manually edit the ram the bit is held.

Now for the test







And there it is. I don't know WHY you never ever noticed the broader set of scripting codes, but it's all good, they're there. Without em, it just wouldn't work

So, hopefully now, you stop your talking about how two different versions and crap don'T make it alike blablah.

Originally posted by HyperHacker
Could you not have posted the URL anyway, or some Google keywords that might find a copy?


As I stated, I really just did remember that we had a beta out, when I wrote this post. I actually found it while looking for a d/l link for zeromap. And I was obviously wrong, it isn't compatible with the english version... I somehow must have forgot that... Anyways, since somebody else approached me about it via PM here, I'll probably come up with something that will work for english roms too. However, I need to talk to the author and he's busy.(You don't spread hacked versions of your friend's mapeditor... imho)

Originally posted by HyperHacker
There shouldn't have been any reason to hack VRAM copy routines or worry about VBlank time. You need only have it change to bank 1 before decompressing and change the destination address, and the game will happily decompress 256 tiles into VRAM without any timing issues. I dunno what the heck you did, but it certainly seems to be a strange way of doing it.



Nah, I worried too much back in the day, because writing it directly to ram is somewhat awkward, when you can use dma. However, I couldn't come up with something better than that without breaking the whole game :-/ or at least the period between mapreloads looking crappy. So yeah, I decided to leave as is and implemented what you said earlier.

Originally posted by Hyperhacker
I see what you mean, but your solution doesn't make a lot of sense. Why copy from the current screen to the current screen?


Actually, it does. For some reason, you don't write the right palettes there to begin with but directly to screen. It's, however, not my code and I only had a glance and can tell you only this, so be the cool hacker you claim to be and fix it yourself, I just wanted to help you out.

Originally posted by HyperHacker
Sure, that'd be a nice way to do it - if the Game Boy used 9-bit memory.


It would even be greater to just use the 7th bit # >= 0x80 --> VRAM1 instead of 0

Originally posted by HyperHacker
So mine does everything your does, plus the GBC-only screen that ensures people don't get stuck on an old GB when they play for a few hours and suddenly walk into a large tileset. How, then, is yours better?


I didn't have to rewrite all the routines like you did. Basically, I changed only the loading routine and the palette setting routine for the tiles, and the block limit (optional), and that's it. You're gonna have major problems once in a while with other screens too, I bet you. Actually, as far as I remember, there is a check somewhere for attribute #7 to hide sprites and they wouldn't get hidden under just attribute #F, that's why I did that extra and 7 somewhere in that routine. It wasn't a persisten problem in every screen though, just sometimes it would occurr. I don't know. I already told you, it's long long ago, so I don't remember properly what I did especially why.

Of course, you can always check out my code and see that 1st, it's not yours, 2nd, how it does stuff.

Oh yeah, mine is better because it's actually used, too. Midnight Hack isn't just some "add-a-map"-hack. It's a completely new hack. You might even enjoy the new intro I did Just D/L it and have fun and patch it to a German rom. If you didn't see the link, it's up above and later in the text it just tells you where to get it from on that site. Here you go. "Pokémon-Hacking" / "Downloads" / "Pokémon Hacks" / "Midnight Hack". Check it out, see for yourself and stop bitching (we're in the bitching forums, remember ?)
Also, as you might see on that page, I'm a member of that hacking group and I did it and you can take my word for it. Please don't start that silly argument. I mean, I could also just claim you found these asm hacks and the patch on the streets of wherever you live and just put em online under your name. However, I didn't doubt you, did I? I expect the same thing from you, too. Remember how somebody is not guilty until guilt is proven and not vice versa ?

Originally posted by HyperHacker
Nor are most of my notes, though I've been slowly compiling them into one nice document. That never stopped me from looking up some info when someone asked about it though. Unless your notes are so bad even you can't understand them anymore, you should be quite able to take the two minutes necessary to look up an address or something.


I never said I couldn't get you a specific information (as long as I have it compiled in there). However, I said I wouldn't give them out with candy for Halloween. It's simply that too many people are gonna translate it with babelfish and then tell me I wrote crap. It's funny how many people think babelfish is the authority in translating documents and postings.

Originally posted by HyperHacker
If they're so crappy, everyone's just going to put down the copycat for releasing crappy documents anyway.


You sure would think so, wouldn't you? However, quite the opposite happens for some ununderstandable reason. I actually stopped caring a long time ago about these as they didn't answer my emails. It's funny as is, but people seem to appreciate crappy translations by author unknown publicized by noob_idiot1337yeahbaby than the real thing.
Ever since I posted that document which was translated to my fullest ability and command of the English language, you started stating how it was wrong, made up, and basically crap for some other fucking version of the same game. It's like you didn't have any idea at all just to how hard it is to write 42 pages trying to be consistent in style and explanation. Then translating all of that crap into English, looking up every offset mentioned and every direct quote in there, then maintaining it in both languages? I even ripped all of the music out of there (with help of some friends) as mp3 of the first 9 or 10 seconds). The latter because I have zero knowledge of music, though I completely deciphered the music routine in technical terms (which doesn't help people knowing how to create music, as he and I use different terms and crap and the engine behaves oddly, too, because me and him, we couldn't map what the engine does to the changes in music...) However, he composed some one-channel songs of Evanescence

Anyways, I hate how you people don't wanna learn and try if "that dude" is right or not. No, you just dismiss it by saying "I never encountered these. They must be wrong, you must be stupid putting 08 in a script and not crashing. It may be two versions, but really, what you did was lying to us SOB".
I mean, c'mon, it was all directly in front of you and you didn't bother of fearing to be publicly proved wrong. That's how it seems to me and that's really unfair, too.

Now, don't get me even started.

cYa,

Tauwasser
HyperHacker
Posts: 3796/5072
Originally posted by Tauwasser
Indeed I do care. As to my precious work, you don't seem to get what I'm talking about, for one. Maybe to translate it as "scripting code" didn't clear things enough, whatever. The things you mentioned there, are in fact, in there.

I'm talking about the codes that get executed, for instance, when you talk to a person, when you get a Pokémon etc. You talk about codes used in text. Regardless, it's all in there:

[snip]

These, I translated as in-text-codes, because they can be executed, once the text interpreter is started via any of the large range of commands, like, for instance the widely used 4C scripting code. It comes in nicer formatting in the .doc resp. .html too

You might just understand something wrong about the scripting doc, however, it should be clear that I didn't pull that 41-page-document out of my ass.

Yes, those are the codes I was talking about. Your information looks correct there. I've hacked peoples' scripts before though, and not once seen this second set you describe here. The script pointers all point directly to the script commands I mentioned (00=print text, etc).


The "translated Goldmap" is up for d/l and has been up for d/l a long time. However, when I made that posting, the site got hacked and went down. But now it's up and running again, here you go sir : http://magicstone.de/rhw/ Since it's all in bad German, I'll tell you to go to "Pokémon-Hacking" / "Downloads" / "Pokémon Gold/Silber-Tools" and then finally, click on "Zeromap".

Could you not have posted the URL anyway, or some Google keywords that might find a copy?


On another hand, you could also have noted, that it doesn't look anything like Goldmap at all... Especially since I showed off the connection-feature (the orange blocks the mouse is hoovering over) which Goldmap never had and never will have as fas as I'm concerned.

Just because it looks a bit different than Goldmap doesn't mean it couldn't be a modified Goldmap screenshot. In any case, the last time I used Zeromap it was a buggy Goldmap clone that didn't really do anything useful. If it works for the English versions, why were later versions never posted here? It's a bit silly to go about adding support for English versions and never tell any English people about it when you speak English. And if it doesn't support them, then why should I care about it at all?


Well, how I did the 2 tileset-thing. First off, I can't draw for the sake of my life. If my life depended on my drawing skills, I would die instantly

Hey, we have something in common.


hacked the palette-routine at 2:4000 to numbers higher than 7.

The GBC doesn't have palettes higher than #7. Unless you mean being able to choose from more than morning/day/night/black, which has nothing at all to do with anyhthing we've discussed.


I hacked the routine at 0:2xxx thatl oads the tileset to vram (that's why you actually see some tiles before the second part of the tileset. The internal buffer is not big enough to handle decompressing tilesets and putting them into vram during periods of time with screen on (it's used for pkmn pics, so it can only be guaranteed to work for 31 tiles, tilesets are bigger though).

There shouldn't have been any reason to hack VRAM copy routines or worry about VBlank time. You need only have it change to bank 1 before decompressing and change the destination address, and the game will happily decompress 256 tiles into VRAM without any timing issues. I dunno what the heck you did, but it certainly seems to be a strange way of doing it.


Then, I did some hacking on how the palettes are chosen, so sprites won't go into "hidden state" when these tiles are there.

The palette has nothing to do with hiding sprites; they're hidden when standing on 8x8 tiles that are used for text. This is why my hack still has them disappear on tile 0x7F.


Then I did some other funky stuff to support additional palettes that could change and different animation routines. I hacked it so it would read the two unused bytes from the tileset header to have custom palettes/animations/ whatever Oh yeah, I expanded the first of the two map headers to 12 bytes instead of 9, too, but that's besides the point since these bytes just do extra stuff for roof tops and crap.

This has nothing to do with adding tiles.


Just keep calm. That's why it screws up.

I don't think the number of bugs in bgb is tied to my anger level. Quite the opposite in fact.


It is not supposed to redraw the palettes of the older screen. Upon exit of the pokégear, the older screen is the pokegear, hence it screws up. Instead, you would want to draw the color for the current screen, whose attributes happen to always be where I said.

I see what you mean, but your solution doesn't make a lot of sense. Why copy from the current screen to the current screen? The real solution would be to just not copy at all when the Pokégear is closed, but then how do you tell if it was that or some other menu? I mean I can think of one way, but I want to hear your idea, since you've supposedly done this before.


The last thing was unclear though, error on my part. I was thinking about signing the tiledata in the backup screen at 0xC3A0 to decide what vram tile to use. It's probably the best method, although I don't employ it myself.

Sure, that'd be a nice way to do it - if the Game Boy used 9-bit memory. Unless you want to make a second table elsewhere, which means finding 360 bytes of free RAM (good luck) and hacking just about every graphical routine in the ROM.


My code, however doesn't put some kind of warning screen into the rom, it just doesn't work on a regular gb...

So mine does everything your does, plus the GBC-only screen that ensures people don't get stuck on an old GB when they play for a few hours and suddenly walk into a large tileset. How, then, is yours better?


Something that could be fixed if I had the gfx and time to do it, which I don't and which was planned to be added upon finalization of the hack (which is far far from now, if ever).

If you look at my hack, you'll see how I do it, and it should be a pretty obvious way to go, especially for someone who's worked on this so much: use the scripting engine. My warning screen is just a call to a font-loading routine and a script routine, and a script to print some text. Maybe 15 minutes worth of work including finding the correct font load routine, and no graphics needed.


Actually, I just remembered while typing this, we had a beta release, so I can actually share everything with you. I'm gonna look it up.
K, found it. Goto that funky German site I know you already bookmarked again, "Pokémon-Hacking" / "Downloads" / "Pokémon Hacks" / "Midnight Hack" The zip either contains a .ips or a .exe for a German Rom from the good set (abundant everywhere in the web). Patch it, be merry. It's actually pretty cool, though it's short.

A patch? That shows that somebody did these things someday. Like I said, you still haven't released any revelant information that proves you did it and you didn't just use my patch to do it. Also, proving these things have been done and sharing how they were done are two very different things.


Still, however, I don't share too much info on things. Especially, because it's not complete and not documented well enough for everybody to understand. Plus, it's in German... like you cared.

Nor are most of my notes, though I've been slowly compiling them into one nice document. That never stopped me from looking up some info when someone asked about it though. Unless your notes are so bad even you can't understand them anymore, you should be quite able to take the two minutes necessary to look up an address or something.


Oh yeah, you're like never online in AIM, or else I would've talked to you that way (and I tried)... However, for some reason or another I thought the pm-system was out of order due to bandwidth constraints for acmlm... Seems you proved me wrong there

Like I said in the PM and my custom title, I don't have a stable Internet connection (else I'd have replied to this sooner). I'm just leeching off a neighbour's wifi for now. I don't want to bother running AIM because the frequent disconnections and massive lag would make it nearly impossible to actually have a conversation with someone.


In regards to your previous post, you don't release your info because people take credit for poor translations of it? Where's the sense in that? If they're so crappy, everyone's just going to put down the copycat for releasing crappy documents anyway. If some website has miscredited a document you released in public, you should be able to get a few people to back up your claims that you wrote it. Or better yet, screw that site. If you're making and releasing good things, people are more likely to come to your site than one that's probably obviously full of bad documents like that. No matter what you make, someone will rip it off. You just need to learn to deal with it.


In any case, it all pretty much boils down to one statement: We're hacking two different versions of the game, or from a completely technical standpoint, two different games using the same engine. Thus it makes no sense for you to compare our work, or say your German version hacks make my English version hacks pointless. In the case of the original thread; you could have just noted that you made such a hack for the German version and maybe commented on the implementation or linked to yours for German hackers to use. That wouldn't have been an issue and I'm sure some other German people would have appreciated seeing a link to an identical hack for their version. The problem comes when you start with the whole "my hack's better than yours" routine when your hack isn't even for the same version of the game. You're comparing apples and oranges and just asking to be flamed.
Now if we were talking about the same version, or information that's the same for both, then it'd make sense for you to link to your documentation (though the attitude still isn't necessary). This happens often in ROM hacking; I can't guess how many different RAM addresses in Super Mario World have been discovered by 4 different people, only to have someone point out a document that already lists it. Though even when this does happen, I have yet to see someone get put down for posting information that someone else posted before them. To put someone down when your information wasn't previously released or is for another version makes even less sense.

What really bugs me is when you finally did post information (which shouldn't take two threads worth of arguing to do), it didn't make a whole lot of sense, and not because of translation issues. For example, you described how you hacked palette code to make sprites not disappear, but this makes no real sense as sprites disappearing isn't related to palettes. This leads me to believe either you're not explaining things fully, in which case a lot of the information is useless anyway, or you're just making it up.

You seem to want to go to whatever lengths possible to show that you're better than me. I must say I'm rather flattered that I set the standard you compare yourself to, but I must reiterate - who cares? We do different work and it's usually pretty good. If someone wants a Playstation they buy it from Sony; why should they care whether Sony or Sharp make better stereos when they're not buying a stereo? Same idea. I'd much rather work with you than against you; I don't understand why you see this as such a problem. Why spend time reinventing the wheel when my wheel already works and you could spend this time working on something new? Just as I can use your script information to code my map editor's script-related functions, and if you wanted to hack the game's intro you could base it off of my GBC-only screen. When you release your work you save other people time, which gives them more time to make something you might use. Plagarists and copycats are generally quickly caught or unpopular to begin with. There's really no reason not to release your work.
Tauwasser
Posts: 33/46
Well you see... Mine does not, once babelfished. As it so happenned, my older scripting doc was released "German-only", which means, I didn't make an English version as nobody asked...not that I strictily enforced not to translate it.
Soon, some documents kept popping up, that were authored by a certain Condensation Water (babelfished Tauwasser, wrong nevertheless...).
Of course, it was also ©®ŘĹ ans whatnot by some idiot babelfishing user trying to impress people... Of course, the work was scrutinized and all wrong as certain words could not be translated by that poor babelfish thing.
So I emailed about three of these sites, kindly asking to take the documents down and instead use my new one. And that's it. One of these three even emailed me back. However, "as it came to pass", the site had to undergo certain maintenance and was moving and whatever and as soon as it was back up and running again, "my" doc was still there.
Another mail and nothing happenned and I soon came to realize that people are scum certain webmasters don't care about their contents.
And that's why I don't release my notes. It's not even completed in German, and much stuff is just randomly written down, because I had to deal only with code 0x10 and 0x33 of a routine that has about 0xFF possible codes.
I translated the Scripting Compendium in order to avoid people using babelfish and then trying to figure out why there would be "People-Events geh'ing in that Weg" or so.

cYa,

Tauwasser
MathOnNapkins
Posts: 877/1106
Work that anyone does has a certain style to it. You would recognize it the moment somebody plagiarized you. I wouldn't worry too much about getting "ripped off" by people simply stealing offsets and other descriptions. I've found people posting my work before without credit, and I pestered them about it. Some things, however, just take too much effort to make everyone do it all over again on their own.
Tauwasser
Posts: 32/46
Indeed I do care. As to my precious work, you don't seem to get what I'm talking about, for one. Maybe to translate it as "scripting code" didn't clear things enough, whatever. The things you mentioned there, are in fact, in there.

I'm talking about the codes that get executed, for instance, when you talk to a person, when you get a Pokémon etc. You talk about codes used in text. Regardless, it's all in there:


In-Text codes: Top
--------------

Always when a script points to a text, it begins with a code. After any code can be any code again.

00 = Write text. Structure: [00][Text][0x50 (ends code)]

01 = Write text from ram. Structure: [01][Ram address (2byte)]
For valid ram addresses see Glossary. This enables use of variable text strings.

02 = Write number from ram. Structure: [02][Ram address (2byte)][Byte]

Byte:

Bit5:Bit6:Bit7
1: 1: 1 = PokéDollar| Don’t write zeros
0: 1: 1 = Don’t write zeros
0: 0: 1 = Spaces instead of zeros
0: 0: 0 = Write zeros
0: 1: 0 = Write zeros
1: 0: 0 = PokéDollar
1: 1: 0 = PokéDollar
1: 0: 1 = Spaces instead of zeros| PokéDollar

Number of figures = Byte AND 0x1F *2
No Hex --> Dec Conversion

03 = Define new ram address to write to. Structure: [03][Ram address (2byte)]

04 = Write a box. Structure: [04][Ram address (2byte)][Y][X]

05 = New ram address to write to become 2. line of a text box. Structure: [05]

06 = Wait for key down + show arrows. Structure: [06]

07 = New ram address to write to become 2. line of a text box Textbox + show arrows. Structure: [07]

08 = After the code an ASM script starts. Structure: [08][Script]

09 = Write number from rom/ram in decimal. Structure: [09][Ram address/Pointer (2byte)][Byte]

Byte:

Is split: 1. 4 bits = Number of bytes to load. 0 = 3, 1 = 1, 2 = 2
2. 4 bits = Number of figures of displayed number
0 = Don’t care
1 = Don’t care
>=2 = Number

0A = Interpret Data stream. Structure: [0A]

0B = Play sound 0x0000. Structure: [0B]

0C = Interpret Data stream. Structure: [0C][Number of codes to interpret]

For every interpretation there is a“…“ written

0D = Wait for key down display arrow. Structure: [0D]

0E = Play sound 0x0009. Structure: [0E]

0F = Play sound 0x0001. Structure: [0F]

10 = Play sound 0x0002. Structure: [10]

11 = Play sound 0x000A. Structure: [11]

12 = Play sound 0x002D. Structure: [12]

13 = Play sound 0x002C. Structure: [13]

14 = Display MEMORY. Structure: [14][Byte]

Byte:

00 = MEMORY1 01 = MEMORY2 02 = MEMORY
04 = TEMPMEMORY2 05 = TEMPMEMORY1

15 = Write current day. Structure: [15]

16 = 3byte pointer to new text follows. Structure: [16][2byte pointer][bank]



These, I translated as in-text-codes, because they can be executed, once the text interpreter is started via any of the large range of commands, like, for instance the widely used 4C scripting code. It comes in nicer formatting in the .doc resp. .html too

You might just understand something wrong about the scripting doc, however, it should be clear that I didn't pull that 41-page-document out of my ass.

The "translated Goldmap" is up for d/l and has been up for d/l a long time. However, when I made that posting, the site got hacked and went down. But now it's up and running again, here you go sir : http://magicstone.de/rhw/ Since it's all in bad German, I'll tell you to go to "Pokémon-Hacking" / "Downloads" / "Pokémon Gold/Silber-Tools" and then finally, click on "Zeromap".
On another hand, you could also have noted, that it doesn't look anything like Goldmap at all... Especially since I showed off the connection-feature (the orange blocks the mouse is hoovering over) which Goldmap never had and never will have as fas as I'm concerned.

As far as I'm concerned, the matter should be resolved. You were thinking about the wrong kind of scripting code, or my reference to these codes is just unclear. Whatever it is, I'm open to suggestions, especially when the actual translation is concerned.

Well, how I did the 2 tileset-thing. First off, I can't draw for the sake of my life. If my life depended on my drawing skills, I would die instantly The tileset was made for said custom German hack by a friend of mine who happens to help hacking it. Secondly, I hacked the routines, that limited the number of blocks usable from 0x7F to 0xFF like you did, hacked the palette-routine at 2:4000 to numbers higher than 7. I hacked the routine at 0:2xxx thatl oads the tileset to vram (that's why you actually see some tiles before the second part of the tileset. The internal buffer is not big enough to handle decompressing tilesets and putting them into vram during periods of time with screen on (it's used for pkmn pics, so it can only be guaranteed to work for 31 tiles, tilesets are bigger though). Then, I did some hacking on how the palettes are chosen, so sprites won't go into "hidden state" when these tiles are there. Then I did some other funky stuff to support additional palettes that could change and different animation routines. I hacked it so it would read the two unused bytes from the tileset header to have custom palettes/animations/ whatever Oh yeah, I expanded the first of the two map headers to 12 bytes instead of 9, too, but that's besides the point since these bytes just do extra stuff for roof tops and crap.

I almost don't remember how I did this, since it's long ago. However, I know that I looked at some stuff in crystal that was usable, since it had already support for double-sized tilesets. However, not much turned up to be useful besides the tile--> pal arrangement code afair.


This is another good example of you clearly having no idea what you're talking about. The routine at 04:7E03 restores tile attributes as clearly indicated in the comment. Reading 0x9800 won't work as that holds the current screen, whereas I need the previous screen. Reading FFD8 or C3A0 is completely useless because this is where the game stores the tilemap, not the tile attributes. I know what the problem is (the Pokégear overwrites the previous screen buffer) and probably how to fix it (copy the buffer elsewhere before overwriting it), I just haven't got around to it since I have no good GB debugger (No$ stopped running and bgb's interface is AAAAARRRRGGGGGHHH).


Just keep calm. That's why it screws up. It is not supposed to redraw the palettes of the older screen. Upon exit of the pokégear, the older screen is the pokegear, hence it screws up. Instead, you would want to draw the color for the current screen, whose attributes happen to always be where I said. The last thing was unclear though, error on my part. I was thinking about signing the tiledata in the backup screen at 0xC3A0 to decide what vram tile to use. It's probably the best method, although I don't employ it myself.
My code, however doesn't put some kind of warning screen into the rom, it just doesn't work on a regular gb... Something that could be fixed if I had the gfx and time to do it, which I don't and which was planned to be added upon finalization of the hack (which is far far from now, if ever). Actually, I just remembered while typing this, we had a beta release, so I can actually share everything with you. I'm gonna look it up.
K, found it. Goto that funky German site I know you already bookmarked again, "Pokémon-Hacking" / "Downloads" / "Pokémon Hacks" / "Midnight Hack" The zip either contains a .ips or a .exe for a German Rom from the good set (abundant everywhere in the web). Patch it, be merry. It's actually pretty cool, though it's short.

Yeah so, I hope I proved my point, really... If I forgot anything, please feel free to ask.Oh yeah, it does say "tuna sandwich", it's a way to encrypt the actual addresses, so nobody steals my work. Still, however, I don't share too much info on things. Especially, because it's not complete and not documented well enough for everybody to understand. Plus, it's in German... like you cared.

Oh, and yes, I did check with the English version for my scripting tutorial and they are all the same. Some differences in the doc and actual game might result in translation differences between the German and English version of the game, since I didn't bother to check upon every text that I quoted. However, I tried my utmost to be accurate when it was needed (like the 0Cxxxx-codes, that sometimes quote strings).

Oh yeah, you're like never online in AIM, or else I would've talked to you that way (and I tried)... However, for some reason or another I thought the pm-system was out of order due to bandwidth constraints for acmlm... Seems you proved me wrong there

cYa,

Tauwasser
HyperHacker
Posts: 3793/5072
Hopefully wrapping up this argument which is probably better off here.

OK, so let's see... you posted a picture of a hack using VRAM bank 1. That doesn't really prove anything. Have a picture of me standing next to an animé character, or a screenshot of the not-really-upcoming Dukes of Hazzard Meets Inuyasha movie. If you don't post any information as to how the hack was done, then there's no way to prove that you didn't just Photoshop a screenshot, graphic-hack another game, or even just use my patch.
Of course, even if you did make such a hack, it appears to be for the German version. What does that have to do with me making the same for the English version?

Your so-called map editor looks like a screenshot of a Goldmap translation, poorly resized. Even if this is real, a screenshot doesn't prove that it's "better and faster" than mine. Heck, you said everything so I guess that means we also need to compare functionality and speed of your Mario Kart 64 editor, your desktop status display and wallpaper switching system, your customized Playstation, etc. In any case, I don't really care if another program or hack is better than mine (especially when nobody has access to it). Mine do the job, I enjoyed making them, people probably enjoy using them, that's all that matters. If you want to release yours, then great. That gives people a choice, and if yours really is better, then it should quickly become more popular.

By script debugger, I mean a simple ASM hack that logs what scripts are being executed from where and when. It's quite easy to do using No$'s debug messages.


My doc of the game's internal routines... I don't share that.

Precisely the problem. Again, your screenshot lacks any real information. For all I know it could say "tuna sandwich" under those blocks.

Your scripting document, I've had for a while now. While it nicely summarizes what script codes exist, the actual information as to which code is which is all wrong. This leads me to believe one of 4 things:
1) This information was only tested with the German version, and the US version uses different script codes (or only tested with Gold and Silver uses different codes), which means you fail for not specifying what version you've documented or testing on other versions before saying it applies to them.
2) You've done something very wrong and haven't tested your findings at all.
3) All of this information is gathered by looking at script codes and guessing what they do. I learned ages ago that this is not the way to go, because you rarely get it right.
4) One of us has a beta version of the ROM which is exactly the same as the final except for having different script codes. I kinda doubt this.

For example, you've listed code 0x16 as being Add Variable when really it calls a subroutine. 00 and 01 are listed as "pointer code", which I can guess means subroutine call, when in fact 00 prints text from the pointer currently in the BC register and 01 prints text from a 2-byte pointer following the comand. 08... I don't know how you can possibly have put 08 in a script thinking it performs an if-zero check and not had the game crash.


Secondly, I looked into your patch and found what was causing the bug for you!

It's at 4:7E10. You revert the palettes to the ones from the backup-screen instead of the one used. You can change that in two or more ways:

- change it to read hl from 0x9800, it's probably always the accurate screen.
- change it to read hl from 0xFFD8/D9, that's the register that tells the game where to draw the tiles to
- or, preferrably the most accurate, change it to read from 0xC3A0, as that is always the right screen

This is another good example of you clearly having no idea what you're talking about. The routine at 04:7E03 restores tile attributes as clearly indicated in the comment. Reading 0x9800 won't work as that holds the current screen, whereas I need the previous screen. Reading FFD8 or C3A0 is completely useless because this is where the game stores the tilemap, not the tile attributes. I know what the problem is (the Pokégear overwrites the previous screen buffer) and probably how to fix it (copy the buffer elsewhere before overwriting it), I just haven't got around to it since I have no good GB debugger (No$ stopped running and bgb's interface is AAAAARRRRGGGGGHHH).


It's not like I don't like HyperHacker or stuff, just a little competition here

This is another big part of the problem. Competition between ROM hackers doesn't help anyone unless it drives them to keep trying to outdo eachother, and I really don't care about trying to outdo the stuff you claim to have done but can't even prove.


I'm really quite sick of these big arguments every single time I post in a Pokémon thread, so let's just cut this one short right here. If you want to actually help people and prove you've done more than cut and paste a few screenshots and throw some random numbers into a document, feel free to post your programs and information for once. On the other hand, if you just want to stop into every Pokémon hacking thread and say "oh I already made that hack 2 years before the game came out, not that it matters because I'm not giving it out lololol", then you have no place in the forum.

Yoro summarized exactly what the problem has been and still is today: Nearly the entire community is composed of elitists who don't share and idiots who don't care to learn. (Being German has nothing to do with it, there's just a lot of German Pokémon hackers. ) Those who do want to learn are either driven away by the lack of anyone willing to teach, or labelled idiots because they don't learn anything because nobody's giving them any information to learn. The solution is simple: Get rid of the elitists and find people who actually care to share like Kawa. From there, the newbies will practically sort themselves into people that learn and become a valued member of the community, and people that don't and become banned.


Oh and I notice you still haven't mentioned why that bank switch hack sucked. C'mon, anyone who's hacked the game 1/4 as much as I have or as much as you claim to have should be able to explain precisely what the problem was with that hack.
Acmlm's Board - I3 Archive - World Affairs/Debate - Continuing a debate from Pokémon Hacking


ABII

Acmlmboard 1.92.999, 9/17/2006
©2000-2006 Acmlm, Emuz, Blades, Xkeeper

Page rendered in 0.014 seconds; used 479.33 kB (max 583.08 kB)