Forum Replies Created
-
AuthorPosts
-
MeteorStrike
ParticipantHey, it looks like you don't need my help anymore, which is great because I can't really help on this. I got tons and tons of other crap I need to do. I shouldn't even be doing any game hacking, but I still do some from time to time because I get bored to heck with all this other crap. Besides, it looks like you got much more experience with the kind of thing you want to do now than I do anyways.
On that note, I started hacking Super Mario RPG recently. I've spent like 3 days on it and OMFG I hate that game's programmers now. Half the freaking code of the game doesn't even execute on the CPU! (OK maybe that's not a game-programmer complaint, but still…)
As far as I understand it, there is this chip called the SA1 which (apparently) executes code parallel to the CPU. (Multi-threaded programming FTW!) Which makes sense that they would do that because by the looks of it, if all the code had to execute on the CPU, it would be freaking slow as hell!
So what's the problem? Well, the code that (seems to) execute on the chip (and therefore doesn't execute on the CPU) means that it will not break on any breakpoints you add on the debugger! The only way to actually SEE that code is to do a freaking trace, and then ctrl+F what you THINK you are looking for, and then using the ROM Hex Editor to alter the code if you want to test changes. What a pain in the @$$!
Luckily, now that I discovered how to use the trace, I finally started finding stuff! My first victim to find was a code so that Mario's Super Jump doesn't stop, even if the user doesn't hit the Jump button at the right time. So you can just select Super Jump and let Mario jump all 100 times. XD. (He stops at 100 because the game has hard-coded a max of 100 jumps.)
Check it out, it's code: C2D26200. Note that this is a raw code and not Game Genie encoded, but you can enter it on the emulator. (Actually, it looks like all the timed-attacks, including regular physical attacks, use this same code to determine the timing of the key pressed, which is pretty neat!)
Now on to find a no-random-battles code. (which I couldn't find before because it's also code that executes on that damn chip!)
Anyways, I'll be back later…
EDIT: By the way, is sonic.penguin Ludmeister then?
MeteorStrike
ParticipantMaybe a captcha requirement for registration wouldn't be so bad… It doesn't even have to be a smart or real captcha. It could be something like: "Type in the 7th word in this sentence right here" And of course "7th" can be like ( randomNumber mod SentenceLength ) and that alone would mean only a 1 in SentenceLength chance that a bot would successfully create an account. SentenceLength can then be like… a loooong message… Heck, like this post right here! :p
MeteorStrike
ParticipantI like my way better: Edit the post to make it sound ridiculous, humiliate the spammer, make their product sound like a joke that's going to make your peepee fall off, and leave it there for all to see and poke fun of… Of course, for legal purposes, I can neither confirm nor deny that I have ever done that to any of the posted spam messages… I'm thinking that there are simply a lot of people lately spamming what they know to be a crappy product already. :)
MeteorStrike
ParticipantYou don't even need to do that. You can just use bits instead:
Code:const int UNIT_COUNT = 80; // How many?
byte genders [(UNIT_COUNT + 7) / 8]; // Probably like 10 bytes depending on unit countIf ( ( genders[unit_id / 8] & ( 1 << ( unit_id & 7 ) ) ) == 1 )
// Male
Else
// FemaleBut since there are only 4 females, it's even more efficient to just have an array of 4 bytes instead of 10.
Forget about things "bothering you" due to crappy code. If that's how you're going to start thinking, then do NOT try to hack Uncharted Waters for the NES under any circumstances! You might go insane!
MeteorStrike
ParticipantYep, what they said. Most games use the small-to-big number system, whichever that one happens to be…
I remember the first time our assembly prof in college explained little endian vs big endian. I thought he had said "Little Indian, Big Indian" which made me think of some westerner sitcom where the "Big Indian" would be the chief, and the "Little Indian" the one always getting shot by the cowboys… And then I thought… "is that a politically-correct term to use in the world of programming? Oh well… I guess it's not as bad as declaring a friend class and having access to their private parts… friends with benefits, anyone?"
MeteorStrike
ParticipantAlso, sonic, here is the original message I sent to Midnight about the game music sometime last year. It should contain info on the music:
Put a breakpoint on execute at $BF5F. When you enter a new area, this is the code that will determine which music to load.
You will notice something like:
LDA $47
CMP #7F
BNE $BF69
LDA #20
BNE BF7B
…
The value of $47 is the "area type" and is calculated elsewhere. I wouldn't mess with it if I was you because this "area type" is used for a lot of other things. It's best to change the music here. It's basically something like:
If area type == 0x7F ( Villages ) use music 0x20. Else, look at the value of $49 and use that as an index into $BF7F to determine the music to load. If this is the world map though (X == 0 ) then check $6010 to see if we should load the "fancy" music. I'll let you explore the rest.
Use these game genie codes for testing:
TZNUNYYZ = World map has kick-ass boss music
IZNUNYYZ = World map has some other kick-ass boss music
The world map (index 0 of $BF7F) is at 0x03BF8F and has value of 0x27
MeteorStrike
ParticipantIs it just me, or is it kind of scary to think that MiDKnighT is old enough to have a child that's old enough to play Final Fantasy games, which is about as old as I feel, yet I'm older than MiDKnighT? Darn you young people with old kids making me feel older still!
MeteorStrike
ParticipantAs far as moving the pointers, that may or may not be possible, I am not sure. First off, you would need to change the pointers anywhere that references this list. So that could be tedious to find. Then, you need to make the new list reflect the old one in the pattern format. That shouldn't be too hard though, but it can lead to mistakes…
Lastly, the way it "works" as you say is actually quite complicated. I am not sure if adding more entries will work for sure because the function pointers just push more return addresses into the stack. (Long story) I didn't bother analyzing in excruciating detail how the stack unwinds, but you would definitely need to test it. I guess it -should- be able to unwind itself though because otherwise the existing code probably wouldn't work as it was written… Hmm never mind that part… the point is, it would take a lot of testing… I still think the easiest and cleanest solution is to just use gender-neutral titles.
As for the "better AI" that would take a lot of programming just to add the AI, not to mention testing the code. Inserting new code in an already-compiled app is not as easy as replacing old code.
As for the ROTK stuff, I have no idea what you mean about flood fill… I'll have to look at that some other time.
MeteorStrike
ParticipantTesting… testing…
MeteorStrike
ParticipantWow… what a piece of crap… every time I log on to my site, I hate that provider more and more… soon enough I'm just going to close the whole thing down… anyways…
Well I lost a lot of the motivation I had to write this, so let me just say that there is no simple or safe way to add more than 4 females to the game, if any. You can remove females or change a male with a female, etc but you will be restricted to 4. Think of it like Destiny of an Emperor where it keeps a list of all the characters you can put in storage, except that only 4 slots are available.
Here is a dump of the data if you want to mess with it. Note the "( Unit ID )" fields. The other stuff are indices to function pointers and no, you can't change those or you will wreck the game, and no, there is no more space to fit more units. Also, notice the pattern in the data sequence.
0xA040 = 7E4040 ( 02 ) =
0xA041 = 7E4041 ( A2 ) = Function Pointer Index
0xA042 = 7E4042 ( FF ) = ( )
0xA043 = 7E4043 ( FF ) = ( )
0xA044 = 7E4044 ( A0 ) = Function Pointer Index
0xA045 = 7E4045 ( FF ) = ( )
0xA046 = 7E4046 ( FF ) = ( )
0xA047 = 7E4047 ( 8B ) = Function Pointer Index
0xA048 = 7E4048 ( 22 ) = ( Unit ID )
0xA049 = 7E4049 ( C0 ) = Function Pointer Index
0xA04A = 7E404A ( D7 ) = Function Pointer Index
0xA04B = 7E404B ( 6C ) = ( New address if we match Unit ID )
0xA04C = 7E404C ( 40 ) = ( New address if we match Unit ID )
0xA04D = 7E404D ( A0 ) = Function Pointer Index
0xA04E = 7E404E ( FF ) = ( )
0xA04F = 7E404F ( FF ) = ( )
0xA050 = 7E4050 ( 8B ) = Function Pointer Index
0xA051 = 7E4051 ( 23 ) = ( Unit ID )
0xA052 = 7E4052 ( C0 ) = Function Pointer Index
0xA053 = 7E4053 ( D7 ) = Function Pointer Index
0xA054 = 7E4054 ( 6C ) = ( New address if we match Unit ID )
0xA055 = 7E4055 ( 40 ) = ( New address if we match Unit ID )
0xA056 = 7E4056 ( A0 ) = Function Pointer Index
0xA057 = 7E4057 ( FF ) = ( )
0xA058 = 7E4058 ( FF ) = ( )
0xA059 = 7E4059 ( 8B ) = Function Pointer Index
0xA05A = 7E405A ( 3D ) = ( Unit ID )
0xA05B = 7E405B ( C0 ) = Function Pointer Index
0xA05C = 7E405C ( D7 ) = Function Pointer Index
0xA05D = 7E405D ( 6C ) = ( New address if we match Unit ID )
0xA05E = 7E405E ( 40 ) = ( New address if we match Unit ID )
0xA05F = 7E405F ( A0 ) = Function Pointer Index
0xA060 = 7E4060 ( FF ) = ( )
0xA061 = 7E4061 ( FF ) = ( )
0xA062 = 7E4062 ( A0 ) = Function Pointer Index
0xA063 = 7E4063 ( 3E ) = ( Unit ID )
0xA064 = 7E4064 ( C0 ) = Function Pointer Index
0xA065 = 7E4065 ( D7 ) = Function Pointer Index
0xA066 = 7E4066 ( 6C ) = ( New address if we match Unit ID )
0xA067 = 7E4067 ( 40 ) = ( New address if we match Unit ID )
0xA068 = 7E4068 ( 40 ) = Function Pointer Index
0xA069 = 7E4069 ( D6 ) = Function Pointer Index
0xA06A = 7E406A ( 6D ) = ( New address if we did not match any Unit ID )
0xA06B = 7E406B ( 40 ) = ( New address if we did not match any Unit ID )
0xA06C = 7E406C ( 41 ) = Function Pointer Index if we matched
0xA06D = 7E406D ( CF ) = Function Pointer Index if we did not match
0xA06E = 7E406E ( 20 ) =
0xA06F = 7E406F ( 87 ) =
Also, here is a sample cheat code:
7E40633F = Gweyn is a Lord and Geran is the Lady
My recommendation if you want to have more than 4 females: Simply change the Titles to something gender-neutral, and use it for both genders. So instead of "Queen" or "King", say something like "Royal", instead of "Lady" or "Lord" say something like "Noble" etc. You're stuck with only 4 women, but feel free to experiment with the above-mentioned list if you'd like.
EDIT:
This link may or may not work…
http://meteorstrike.000space.com/other/KOEI_LOGIC.jpg
I was inspired by this game's bizarre and overly complicated game logic…
MeteorStrike
ParticipantHi Zhuge Liang. I got your e-mail. It looked like it was just a "hello" though… OK… well, hello to you too? :)
Anyways, Im back with the Gender stuff. I need to edit a pic first… BRB…
MeteorStrike
ParticipantHey, I'm back for a while. I can look into this, but after trying to play this game, I realized that I'm not really all that into it… so if you want help, (assuming this is still an issue) I will need the following:
1 – A save-game (SRM, not a state) of this game so I can load it at a point where there are some women taking off their top. Either that, or some other way I can verify their gender… after talking to MidNight about Phuket, Thailand, I just want to be sure… :p
2 – Instructions on how I can tell whether or not a character is female or not. I guess I must be gender-confused or something… either that, or I just want you to point to me exactly what it is that you want to show up "different". Is it an icon with a skirt vs pants? Is it the words "male" and "female" somewhere? Etc. Pretend I don't know what is a "video game" and that way I won't have to guess what it is you are looking for.
I'll be back later in the week…
MeteorStrike
ParticipantFuck yea! That's awesome LYS! :) By any chance, did my post help? :)
Anyway, IIRC, the code I saw contained a function for time zone. But regardless, I don't think time zone is a big issue. Honestly, just being able to tell the day / hour of the post is a huge improvement! I don't think time zone is a biggie, especially since the post still says things like "(1 HOUR AGO)" etc.
Also, is it just me, or has Dragon Atma officially gotten tired of talking in the 3rd person? Or maybe he finally got medication for it! Zing! (just kidding :p)
MeteorStrike
ParticipantYea I think the part where I have "EDIT EDIT" in the above messages might have the solution, assuming you are using the same version of the software I downloaded from bbpress to look at the source. Otherwise, if it's too much of a pain in the butt, don't worry too much. It would be nice, but not a board breaker either. :)
MeteorStrike
ParticipantAh, it looks like this might be a good time to bump this since LYS is back… tee hee…
-
AuthorPosts