Posts for HHS


1 2 3 4 5
14 15
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
HHS wrote:
The NPC must be moving east if the player is north of the NPC, otherwise west.
Correction: The NPC must be moving south or east if the player is north of the NPC, otherwise north.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
To address some of the points in that thread: About the status bar color issue, both the text window and the status bars use the same palette index, but the game switches the palette as necessary. The status bar may flash blue if some processing took too long, so that the game was unable to load the orange palette in time. This is also why the window becomes orange if it is left on screen when the game thinks it is not, as the game then stops switching the palette. I don't think enemy level numbers are ever displayed on the screen, are they? Hit Up indeed does not work right unless you are tangled (and neither does Hit Down). When tangled, it works fine, and it gives you a boost or reduction of 1/4 after the initial reduction by 1/16 because of the tangle. The critical rate is halved by gloves, swords, axes and spears. The function that multiplies your weapon experience with 99 and divides by the maximum weapon experience is used to determine what to display in the menu. The boss random seed is determined by the file checksum, not the save counter (although the save counter is included in the checksum). Character behaviour (except for bosses) is given here: http://www.mediafire.com/view/s971u01cs1gh5eq/somacn.txt And the game script is here: http://www.mediafire.com/view/l328ub6gu17t8i6/somscpt.txt This has some information about rooms: http://www.mediafire.com/view/6ga1vidqcoc8coz/somroom.txt The "Scripts" lines list the arrival script followed by scripts invoked by stepping on triggers. The "Ent" lines list paths to a room by path number, starting location, exit type, and the direction walked when entering. For BG1 and BG2 we have a list of room parts to load (part index, x, y). Then, a list of characters follows. This gives the x, y, floor number, direction, type, script, trigger type and whether the character can be pushed. Trigger types are: - None: The character can't be interacted with. - Near: Trigger when player is within 24 pixels. - Face: Trigger when player is within 8 pixels and facing the character. - BothFace: Trigger when player is within 8 pixels and both are facing each other. - Talk8: Can be talked to within 8 pixels. - Talk28: Can be talked to within 28 pixels. - FaceTalk: Can be talked to within 28 pixels when both are facing each other. Near, Face and BothFace are bugged in that if multiple players trigger these at the same time, the game jumps to C1:D017, but they forgot to set the accumulator to 8 bits. This code does the following when interpreted with wrong flag settings:
lda Characters.XSpeed,x
beq loc_C1D042
eor $06
bpl loc_C1D042
lda $02
and #$980
ora ($1d,x)
and #$9de0
and #$24e0
cop #$10
…
loc_C1D042:
lda Characters.YSpeed,x
beq loc_C1D06D
eor $07
bpl loc_C1D06D
lda $02
and #$980
cop #$1d
…
loc_C1D06D:
lda Characters.XSpeed,y
beq loc_C1D07E
eor $06
bmi loc_C1D07E
lda #$1901
and #$99e0
and #$b9e0
ora [$e0] ; continue into C1D081

loc_C1D07E:
lda Characters.YSpeed,y

loc_C1D081:
beq locret_C1D08F
eor $07
bmi locret_C1D08F
lda #$1902
and #$99e0
and #$60e0 ; continue into C1D090

locret_C1D08F: rts

loc_C1D090:
lda Characters.XSpeed,x
beq loc_C1D0B7
eor $06
bpl loc_C1D0B7
eor $06
and #$980
ora ($99,x)
dec a
cpx #$3a9d
cpx #$84a9
ora Characters.PushDirection,x
sta Characters.PushDirection,x
lda #$1904
and #$99e0
and #$80e0
ora (EnableBG2),y
asl $e0 ; continue into C1D0BA

loc_C1D0B7:
lda Character.XSpeed,y

loc_C1D0BA:
beq loc_C1D0C8
eor $06
bmi loc_C1D0C8
lda #$1901
and #$99e0
and #$bde0
ora [$e0] ; continue into C1D0CB

loc_C1D0C8:
lda Characters.YSpeed,x

loc_C1D0CB:
beq loc_C1D0EF
eor $07
bpl loc_C1D0EF
eor $07
and #$980
ora ($99,x)
tsc
cpx #$389d
cpx #$88a9
ora Characters.PushDirection,x
sta Characters.PushDirection,x
lda #$1908
and #$99e0
and #$80e0
ora (EnableBG2),y
ora [$e0] ; continue into C1D0F2

loc_C1D0EF:
lda Characters.YSpeed,y

loc_C1D0F2:
beq loc_C1D100
eor $07
bmi loc_C1D100
lda #$1902
ora Characters.PushDirection,y
sta Characters.PushDirection,y
loc_C1D100:
rep #$20
txa
sta Characters.Pusher,y
rts
If we could just reach the TSC, we might be able to jump to a controlled address. For this to happen, the player must be standing still. The NPC must be moving east if the player is north of the NPC, otherwise west. The word at the long address at $e0 must be between $0001 and $7fff. Finally, an interrupt must happen after C1D081 but before C1D0C9, which changes this word so that it becomes negative. So it's questionable whether one will be able to pull this off at all. If we get to one of the COP instructions, we end up executing a SBC nnnnnn, x instruction and continuing from $7e0003. At this point, we have: $03: seems to always be ff - sbc $nn00aa, x $04: 0a - asl $05: 00 - brk $06: 00 - brk (player on right) or 80 - bra (player on left) $07: 00 - brk (player below) or 80 - bra (player above) $08: horizontal distance $09: vertical distance $0A: horizontal center distance $0B: vertical center distance $0C: varies $0D: varies $0E-$0F: script number and activation mode I still don't know why the money window glitch happened. Somehow, it entered the dialogue option selection state. This can only happen when executing command 5A or 5B, or when closing a window, as far as I can tell. One can then easily jump to any byte within 512 bytes of the last option command, which was the save prompt in script 0050. For some reason, it then sometimes continues presenting a choice, allowing for further jumps. That is how he managed to jump to the Neko dialogue.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
In that case, he would simply have continued from where he left off. I have no idea what caused this. Perhaps something he did in the menu or during a previous dialogue?
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
If it helps, I have made a dump of all the levels in Tiled TMX format, and of the programming for all the objects. http://www.mediafire.com/download/86uc672vz993p38/lvdata.zip
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
Yes, when you load a game, the boss RNG is initialized to one of 55 known states, depending on the file's checksum. So, everything which can be saved in a file matters.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
I'd say that the number of games that run on SQL, allows the player to inject SQL, contains code to filter out certain SQL statements, and display "You - SQL" in the credits is quite low. And even if all the details posted in this thread are completely made up, the same arguments apply to any game that is found to have an intentional backdoor if such a backdoor is used in a TAS.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
That's basically correct (except that it is not called a stack). If the boomerang grabs a powerup, and the powerup disappears (for example, by taking it without touching the boomerang), and another powerup is then loaded into the same index on the same frame, the boomerang will be none the wiser and will continue to hold the new powerup.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
You can find out by reading them. Since you have not stated anything about your business plan other than "I want to release source code", there is no way for anyone to advise you. What exactly is the requirement that necessitates granting an Open Source license? I can see none. If you are unsure of what you want and why, then just release the source code. In the event that someone wants to do something with it later, you can work out the conditions with them when the time comes.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
Even if it is not a game mechanic, there is no question that it is intentional, even just as an easter egg. The fact that it has been publicly announced, and that there is "validation" code involved, proves that it's a deliberate feature. Therefore, it can be compared to using a cheat code that presents a debug menu. If accessing a debug menu through a cheat eventually led to ACE, it might make for an interesting Youtube demonstration, but it shouldn't be considered a legitimate world record in any category.
Ha! Gotcha! "If you can't, it's not arbitrary enough." But, it's still arbitrary! Not enough, maybe, for something. But still, you can write whatever you want, but something won't run. Same thing in any language even in asm, you can write some bad opcodes, and they won't work. You can write some bad code in Javascript, and in certain conditions, it will stop. (exception/error occured).
Obviously, code that is incapable of controlling the underlying platform in any way whatsoever is not what the ACE term was intended for. This code will have no visible effect other than modifying a database, which only indirectly affects what is displayed on the screen through the normal operation of the game engine.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
For a "game" that incorporates the use of any kind of language as a deliberate in-game mechanic, ACE is not a meaningful category if used to denote the use of such a feature. The ACE category should be reserved for the situation where an algorithm that is input by the user is executed or interpreted by a Turing-equivalent machine in contradiction with the intentions and expectations of the software author. Preferably, the code that is being executed should be machine code. I also think that any game that is deliberately designed specifically to blur the rules used in judging TASes would most likely be considered a bad game choice for TASing.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
I also found two bugs: - When you pick up a weapon refill and the current weapon is nearly full, and the remaining units are distributed to weapons with a higher index than the current one, one unit will be lost. - If you pick up a weapon refill and the current weapon is not full, and you select the X-buster at the same time, a subtank will appear in the 4th slot. However, you can't get the hadoken using this false subtank.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
No problem. Just some clarifications: By resetting the starting location, I mean that after you die, you'll start at the beginning of the level instead of at the last checkpoint. The $700804 check is triggered every time you fall and will increment a counter. After it hits $80, jumps will become increasingly smaller, but only for even values of the counter. It stops at $FF, and from there on all your jumps are normal again (I assume that this is unintentional). There are really only two types of tests. In some places it checks for mirroring, and in other places it checks if battery RAM is present (which Mega Man X obviously doesn't have). The reason for all these checks isn't that a copier might fail only some of the tests, but to increase the chances that a pirate will neglect to find and patch them all. There are also other places where it will verify that these instructions are intact, and enable the funky behaviour immediately if not. ZSNES will detect version 1.1 of the game, and prevent these checks from triggering, but it does not do so for version 1.0. Edit: Seems that some of this was actually discovered before, and ironically, posted on another "the cutting room floor": http://jul.rustedlogic.net/thread.php?pid=433506
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
That's just the game's copy protection. It tries to detect if the game is running on a copier. Some emulators fail this check. Try using another emulator. Here is some of the stuff it does: - When starting a level, if a random byte in bank $00 is not mirrored at bank $40, you lose all your subtanks and upgrades. - If the game sees that $700505 acts as RAM, after you get hurt 128 times, the game will start messing with your input. Also, your charged buster shots, should you manage to fire them, will not move. - When you pick up a power up or go through the boss door, the starting location is reset to the beginning of the level if a random byte in bank $00 is not mirrored at bank $40. - When an enemy drops an extra life, the intro stage will be uncleared if $00804e isn't mirrored at $40804e. - If $701000 acts as RAM, after 128 explosions, you'll die when a bullet is repelled by an enemy. The intro stage will be uncleared when shooting while dashing. Powerups will disappear quickly. - If $700804 acts as RAM, after you jump 128 times, every other jump you make will be really tiny, for 127 more jumps. Climbing walls will hurt you. Shooting while on the ground will reset the starting location to the beginning of the level. You will not be able to wear the Ride Armor. The miniboss in Spark Mandrill's stage will have twice as much health. - If $700800 acts as RAM, some worms will be impossible to kill. The miniboss in Spark Mandrill's stage will shoot sparks more often.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
Secret of Mana will fail to zero a bunch of variables if you do a soft reset during the title screen.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
This area is used for communication between ARM7 and ARM9, for example, to report the touch screen coordinates. The status of the X and Y buttons, which for some reason they decided to connect only to the ARM7, is also stored here. There are only a handful of different ARM7 program versions used by official games, so the layout of this area is generally the same.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
Warp wrote:
I still don't get it.
For the fractional part, we can map terminating numbers like this, by taking the first bit and XORing it with the rest: 0 -> 00000000… 0.125 -> 01000000… 0.25 -> 10000000… 0.375 -> 11000000… 0.5 -> 11111111… 0.625 -> 10111111… 0.75 -> 01111111… 0.875 -> 00111111… Whereas nonterminating numbers are written normally: 0.2 -> 00110011… 0.4 -> 01100110… 0.6 -> 10011001… 0.8 -> 11001100…
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
Warp wrote:
I don't understand how that would work. Wouldn't the result simply be the binary representation of another real number?
He's talking about mapping strings that end in 1's and strings that end in 0's to different disjoint intervals, I think. Which I did a few posts up. But you also need to invert the bits in one of the cases, or you'll end up with two of each integer and no half-integers.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
In the above scheme, that is taken care of. All terminating representations are assumed to end with 0's. If after deinterleaving you get a string that ends with 1's, it simply maps to a different part of the unit interval which I have divided into 3 (for 00's, 01's and 10's). On the other hand, mapping from reals to infinite substrings and then interleaving does not work, since the resulting string might then end in 1's. Oh, I see what you're getting at.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
A bijection between reals and complex numbers is easy. Discard the real part's sign and take the floor of the real and imaginary parts, then discard the sign of the imaginary part's floor and interleave the bits. If the real part is nonzero, append a sign bit for the imaginary part. Then, if both the real and complex parts are nonterminating when written in binary, interleave the fractional bits as well. Otherwise, if one part terminates and the other does not, take the first bit of the part that terminates. If it is 1, invert the remaining bits, otherwise, do not invert them. Then, interleave them with the part that does not terminate. Otherwise, both parts terminate. Then, multiply the real part by 3 and keep the imaginary part as it is. If the resulting integer part is 1, invert the fractional bits, and if it is 2, invert the fractional bits of the imaginary part. Then, interleave the two numbers as usual. Finally, flip the sign if the real part was negative, or if the real part was zero and the imaginary part was negative. Edit: Oh crap, forgot the signs. Fixed now.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
Here's something really simple that I came up with yesterday after thinking about it, but I was too tired to post: An infinite string of 1's represents the number 0. Otherwise, it starts with some number of 1's followed by a 0, then a sign bit which is applied at the very end. As many bits as there were 1's at the start then encode an integer, with an implied 1 prepended. Then, consider what follows as the fractional part: - if it terminates in an infinite string of 0's, we shift it right 1 place and subtract it from the integer - if it terminates in an infinite string of 1's, we shift it right 1 place and add it to the integer, and subtract 1 - otherwise, we subtract it from the integer as is Finally, apply the sign bit.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
Tub wrote:
Is there an actual, intuitive bijection between the set of reals and the power set of the integers?
Yes. One way to uniquely represent a real would be to construct a bit string starting with some number of 1's followed by a 0. If there were no 1's, the integer portion is 0. Otherwise, as many bits as there were 1's follow, with the first being a sign bit and the others constituting the integer portion, with an implied 1 at the beginning. Subsequently, the fractional bits follow. If the number terminates, the first fractional bit is omitted, a 0 is appended at the end and finally the first fractional bit is repeated an infinite number of times. Edit: I think I spoke too soon. This does not account for the case when there is just an infinite string of 1's for the fractional part.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
It really boils down to whether you are executing instructions whose contents are under the player's control or not. Neither implies the other.
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
Dyshonest wrote:
His example specifically implied that the instructions are to be read and executed, NOT specifically read. My counter example specifically stated that minor errors, like a typo, are generally not going to stop someone from being able to execute the read instructions. (a "minor" memory corruption, if you will) Reading the instructions is pointless if it has no way to execute them.
Ugh. In that case, I have a book recommendation for you: http://www.amazon.com/The-Little-Book-Kill-Yourself/dp/1938753089. Are you able to read the front cover and then tell us what it says without actually doing it? (Note that I take no responsibility for what might happen if you insist on sticking to your definition of reading.) We have no way to determine the title of the book unless you actually execute it, right? Or, if you receive a statement from your bank informing you of your current balance, and your ten thousand dollars were somehow changed to ten billion dollars, we would have no way of noticing this change from watching your reaction, right?
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
Dyshonest wrote:
The way you described it: "Page 55 reads: Turn the dail to have running water." A lot of people have been found in studies to actually read typos as the world they're an error of, and oftentimes do not notice that there WAS an error. The way it happens: "Page 55 reads: Turn the elegant to have running water."
What are you on about? He gave you a perfectly clear example of the difference between reading and doing something. So, are you really claiming that if I ask you to read something from a book aloud for me, or if I ask you to read something from a book and then do exactly what the book says, that's technically the same thing?
HHS
Experienced Forum User, Published Author, Active player (282)
Joined: 10/8/2006
Posts: 356
A lot of games execute RAM as part of normal operation. For example, interrupt vectors might point to a jump instruction in RAM. Games on systems that don't use cartridges will necessary be loaded into RAM, and will probably load different overlays at various times because the entire program does not fit in memory at once. Detecting writes that modify code and dealing with it is much faster than not recompiling at all. Detecting ACE might not always be trivial, but it is trivial to define it. An ACE run must execute arbitrary CPU instructions that are input by the player. I don't see how "code execution" could possibly be subject to such enormous misinterpretation.
1 2 3 4 5
14 15