What I found remarkable about this trick is, IMHO, how convoluted it is. This is something that seems substantially more complicated than the "minus world" in SMB or Konami's UUDDLRLRBA+Start code (latter was intentionally coded). There are many requirements that must be done in a specific order:
1. Must have Megaton bomb from first idol room
2. Must have exactly 62 bombs
3. Shoot/kill a Lurcher (spider)...
4. ...with the normal weapon only
5. ...while facing downward (final shot that kills the Lurcher must be done while facing down)
6. After, must press Select to go into the Inventory screen...
7. ...and move the cursor to Energy Tank item (far left, 2nd from top) -- but NOT use it yet
8. ...then on controller 2 press and hold Up+Left
9. ...then on controller 1 press A twice (will attempt to use the Energy Tank)
The level select and walk-over-anything tricks are only possible after doing the above. I'll also note that, if my memory serves me right, you don't need an Energy Tank for it to work.
rainwarrior felt that this is most likely a bug that manifests itself in such a way where a leftover debug mode feature is enabled (and I agree that it very much feels like a development/debug mode feature), but that he feels it's certainly possible that someone may have come across this particular trick/bug in the course of gameplay and/or game testing. The Twitter thread (be sure to click on View more replies): https://twitter.com/koitsu2009/status/7 ... 4592673792
That's where I disagree: to me, the odds of someone stumbling upon this specific series of events by happenstance seem astronomical. But even if someone did, they'd still have to work out *exactly* how to reproduce it for a Nintendo Power submission/publication. If someone was to find another way (possibly easier), I'd believe it -- but that isn't what got published. It's just so incredibly specific; the step that gets me the most is that the Lurcher must be killed while facing downwards.
I feel it's more likely that Nintendo either got the trick from Hudson Soft directly, or that it was published in something like Famitsu or some other Famicom enthusiast mag (possibly as a result of the programmer or devteam leaking it?) and essentially the tip/trick got "brought overseas".
While normally I love disassembling and digging into innards of classic games, this is one that seems really convoluted and likely painful given how many different things are involved -- lots to track. RoboWarrior and Bomber King are both 128KByte mapper 2 (UNROM, i.e. PRG-ROM + CHR-RAM).
Please note up front this isn't a "debate" thread (i.e. "who is right/wrong, rainwarrior or I?"), but rather just something to pontificate on. Have you see more convoluted codes that involve several aspects of a game (i.e. not just pad/button sequences)? What are your thoughts?
On the other hand, this kind of convoluted set of steps to reproduce a bug is fairly typical for game bug reports.
The tester plays for a while, and then something unexpected happens. The first thing they do is they write down everything they did up to that point, and try to do it again. If they can do it again following the steps they could remember, then they start whittling it down. Do it again but omit some steps and see if it still works. Repeat until you get rid of any steps that seem unnecessary. Eventually you might pare it down to a few critical events, but very often the steps still look pretty wild and organic. Usually as a programmer when I find the bug, I can say "oh, all you really had to do was 1 2 3, not that 50 step thing", just nobody had ever tried doing that particular sequence before. (At that point it usually doesn't matter anymore either, cause once it's understood it gets fixed and forgotten.)
Anyhow, it's pretty natural for an obscure bug to be found with a very long and strange ritual attached to triggering it. This is simply the best way discovered so far. This doesn't have to be the one true sequence that triggers it. If it's really a bug there's probably a lot of ways to trigger it. If you debugged it I bet you could find a much simpler way to do it. You've got much better tools to look at this than even the developers had at the time (if you're interested).
Koitsu's comment that set me off was just that "it had to be from the devs". Maybe it could have been, but I wouldn't find it beyond the pale for a regular user to find it by accident. When you get hundreds of thousands of people playing a game, they try a lot of stuff you would never expect. Stuff you wouldn't think anybody would do.
http://www5f.biglobe.ne.jp/~famicom/Ura ... erKing.htm
From the way these read, it sounds like you actually do need 1 Energy Tank (because the trick requires that your energy be at maximum when Up+Left is pressed/detected on Controller 2). I can't determine from the Japanese if a Megaton bomb is actually needed or not (it would make doing the trick easier since the area would be clear of trees thus encountering a Lurcher would be more likely).
Oh, and I did find some English web pages talking about this trick too, but they all tend to follow the same procedure as what was in Nintendo Power. It's funny that I found more in Japanese than I did in English.
I may sometime take a stab at reverse engineering this just to see if I can work out what the criteria really are.
I'd kinda presumed that you could just have it held, but if not I'd be swayed to agree no end user would come up with that.
The rest of the steps, though, look like natural things that someone might do while playing, to me. I read it more like a diary of something strange that happened, rather than a deliberate set of instructions.
Code: Select all
__c6b0: lda $0528 ; $c6b0: ad 28 05 cmp #$05 ; $c6b3: c9 05 bne __c6e1 ; $c6b5: d0 2a lda $01b9 ; $c6b7: ad b9 01 beq __c6e1 ; $c6ba: f0 25 lda $0f ; $c6bc: a5 0f cmp #$0a ; $c6be: c9 0a bne __c6e1 ; $c6c0: d0 1f lda $01c6 ; $c6c2: ad c6 01 cmp #$ff ; $c6c5: c9 ff bne __c6e1 ; $c6c7: d0 18 lda $01c7 ; $c6c9: ad c7 01 cmp #$0f ; $c6cc: c9 0f bne __c6e1 ; $c6ce: d0 11 lda $78 ; $c6d0: a5 78 cmp #$02 ; $c6d2: c9 02 bne __c6e1 ; $c6d4: d0 0b lda $4c ; $c6d6: a5 4c cmp #$3e ; $c6d8: c9 3e bne __c6e1 ; $c6da: d0 05 lda #$01 ; $c6dc: a9 01 sta $01ed ; $c6de: 8d ed 01 __c6e1: rts ; $c6e1: 60
$000e = Controller 1 input; $80=A, $40=B, $20=Select, $10=Start, $08=up, $04=down, $02=left, $01=right
$000f = Controller 2 input (see above)
$0011 = Bitwise NOT of $000e (probably used as a mask somewhere)
$004c = Current bomb count
$0078 = Currently-facing player direction; $03=up, $02=down, $01=left, $00=right
$01b9 = Unknown (see below)
$01c6 = Energy metre (8-tick); $ff=full, $7f=1 missing, $3f=2 missing, $1f=3 missing, $0f=4 missing, $07=5 missing, etc.
$01c7 = "Life pods" (tanks next to the left of the energy metre); $0f=4, $07=3, $03=2, $01=1
$01ed = Debug mode (unlimited items); $01 or higher=enabled, $00=disabled
$0528 = Last enemy killed; $08=Amoeba (not sure of type), $05=Lurcher, $04=Triangle-like enemy (unsure of name), $03=Mecha-bird, $02=Grunt, $01=Skraug
I should note that $0528 refers to the last enemy killed by bombs or gun; unsure about other methods (there are several).
Controller input is actually stored in a couple places at once depending on what "context" you're in (main game vs. inventory menu vs. demonstration mode), but I didn't denote all the locations (there are a couple).
I haven't dug deep enough to figure out what $01b9 is yet. It starts out as $00, but after "some degree of time" (even if you just start the game and don't touch anything) it becomes $01. Forcing it to a particular value ($00 or $01) doesn't have any effect on the inventory or anything else that's immediately obvious to me. I couldn't find any direct references to $01b9 in the rest of the PRG bank, so I'd need to debug it in real-time.
Only two places that write to $01ed: the code run out of the RESET vector (setting $01ed=$00), and the above routine.
There are several subroutines that read $01ed. I found the main one ($c37e) which is what calls jsr $c6b0, but also handles checking the controller 1 check for Select+Up+Left (for Level Select). Another one is $cbde which handles the controller 1 input check for Select+B (walk over all terrain). Those two routines require $01ed to be non-zero for the tricks to take effect.
Routines I haven't analysed, but I bet they have something to do with collision detection (gut feeling):
$dda5 (something's special about $99 (ends up in X) and $4d,x)
$e087 (skips a check against $9b and $4c, if debug is enabled)
$e128 (decrements $4c, but only if debug is *disabled*)
$e845 (tinkers with $70 and $99, if debug is enabled)
I did not find any code that would toggle or disable debug mode -- once it's on, it's on.
Anyway, my analysis obviously isn't fully definitive, but given the $c6b0 routine above, I would say the nuances/checks/etc. are deliberate. Meaning, I lean towards "yes, this really *is* what you have to do to enable debug mode". But at least you don't need a megaton bomb, from the look of the code... :-)
I did a similar hunt for unknown conditions in the GG game The Berlin Wall recently. The instruction manual says you have to "satisfy some conditions" to get the good ending, but no site on the internet had any cheats/tips as to what those conditions were.
So, after running the Z80 debugger:
myself wrote:You need to open 5 doors throughout the game in order to get the good ending. The first two doors open automatically after you defeat all enemies in 1-5 and 2-3. The final three have some secret conditions that nobody in the history of the internet seemed to know.
So, those conditions:
Door #3: The door will appear on stage 3-1 if the thousands digit of your score is EVEN.
Door #4: on 4-3, you need to have fallen down (off a ledge, etc.) 15+ times before the last enemy is destroyed.
Door #5: on 5-2, you need to have dug exactly 7 holes by the end of the stage. This last one is the tricky one, as you'll have to plan how to drop enemies onto others below to keep the digging count low. Filling in a hole does not decrease the "holes dug" counter.
If you meet all these conditions, then you'll go to the end of Stage 5, fight all the bosses again, and finally get the good ending.