Note:
- My English skill is not enough to make a complete description. If you can read Japanese, I recommend you reading my blog post.
- I don't know whether this run syncs on real console. But I believe you can use the same strategy as this run uses.
Essentials
- Emulator used: FCEUX 2.1.5
- Aims for fastest time
- Corrupts memory
- Uses a game restart sequence
- Genre: RPG
About the game
Double Moon Densetsu is a role-playing game derived from a play-by-mail game hosted on a Japanese game magazine, "Marukatsu famicom". Your goal is to beat Samoylenko, who kidnapped your sister 15 years ago. You can choose your job from Fighter, Paladin, Magical Fighter. In battles, you can "aim" at weak points of enemies.
Run overview
This run skips most events with "item-repository glitch". I will describe this glitch later. You can execute this glitch only on guilds, so you have to arrive at the towns that has guilds in the first place.
I choose Paladin as my job, because its special skill "Holy Light" is very powerful.
I go to the Cave of Fire to let the Ice Queen remove ice walls. In the cave my childhood friend Rowena joins, but I kill her on purpose because she talks for about 280 frames on the first boss battle if she is alive. I beat some enemies, and get Dagger and Short Sword to increase my firepower. I beat the first boss and escape with a glitch. The Ice Queen removes ice walls.
I beat a Lizardman and get Scimitar to increase firepower (and I convert it into money later).
I arrive at Saicon, and the princess Liona joins. I go to the Cave of Saicon to beat the turtle monster and get Map of Mountain from the king. I beat monsters and escape with a glitch. On Saicon, a minstrel Jenius joins. He has a special skill to confuse any enemies. And I buy many items needed to execute item-repository glitch. Finally, I get Map of Mountain.
I use Map of Mountain to open a way. In a mountain house, I get some items from chests. It is needed to execute item-repository glitch.
I arrive at Galganda, and this town has a guild. So I execute item-repository glitch to alter the position of the ship and to overwrite event flags. When the glitch have been executed, the ship is moved and I can sail to the final dungeon.
In the final dungeon, I fight against Samoylenko and Dark Dragon. At the moment they are extremely tough, but Jenius can confuse them. So I can beat them letting them attack themselves with critical attacks.
Note: There are some chutes on the first floor in the final dungeon. That's why I do not go straight to the stairs.
Tricks
First, I put some memory addresses:
$63FE | The item count in item-repository |
$63FF-$642E | Items in item-repository |
$642F-$6436 | Chest flags |
$6437 | Always 0 (probably) |
$6438 | Ship position y |
$6439 | Ship position x |
$643A-$643C | Town bookmark |
$6477-$647A | Character id |
Item-repository glitch
On guilds, you can put items up to 48. But this item-repository has two bugs:
- When 48 items are put, you can take the 49th empty item. If you do it, memory $63FE-$64FD is "rotated".
- When the item count is greater than 48, you can put extra items. If you do it, you can overwrite memory out of range.
Taking the 49th empty item
You can do this by simply taking the last item on 7th page. But you can do it only if $642F is nonzero. In other words, you have to open some chest in advance. If you take the 49th empty item, you cannot get any item, but the memory $63FE-$64FD is "rotated". The details are as follows:
- The value of $63FE is (the previous value of $63FF) - 1.
- The value of $63FF-$642D is the previous value of the next address.
- The value of $642E is unchanged.
- The value of $642F-$64FC is the previous value of the next address.
- The value of $64FD is the previous value of $63FE.
Let's see an example. Initially, you have already put 48 items. The memory is as follows:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
63F0: .. .. .. .. .. .. .. .. - .. .. .. .. .. .. 30 3F
6400: 40 41 42 43 44 45 46 47 - 48 49 4A 4B 4C 4D 4E 4F
6410: 50 51 52 53 54 55 56 57 - 58 59 5A 5B 5C 5D 5E 5F
6420: 60 61 62 63 64 65 66 67 - 68 69 6A 6B 6C 6D 6E 01
6430: 02 03 00 00 00 00 00 00 - BE EF 11 12 13 00 .. ..
...
6470: .. .. .. .. .. .. .. 00 - 01 02 03 00 00 00 00 00
6480: 00 00 A0 86 01 00 .. .. - .. .. .. .. .. .. .. ..
...
64F0: .. .. .. .. .. .. .. .. - .. .. .. .. .. .. .. ..
If you take the 49th empty item, the memory changes as follows:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
63F0: .. .. .. .. .. .. .. .. - .. .. .. .. .. .. 3E 40
6400: 41 42 43 44 45 46 47 48 - 49 4A 4B 4C 4D 4E 4F 50
6410: 51 52 53 54 55 56 57 58 - 59 5A 5B 5C 5D 5E 5F 60
6420: 61 62 63 64 65 66 67 68 - 69 6A 6B 6C 6D 6E 6E 02
6430: 03 00 00 00 00 00 00 BE - EF 11 12 13 00 .. .. ..
...
6470: .. .. .. .. .. .. .. 01 - 02 03 00 00 00 00 00 00
6480: 00 A0 86 01 00 .. .. .. - .. .. .. .. .. .. .. ..
...
64F0: .. .. .. .. .. .. .. .. - .. .. .. .. .. 30 .. ..
You can do this multiple times, But some conditions are needed:
- The value of $63FE must be greater than or equal to 0x2B (to open 7th page).
- The value of $642F must be nonzero.
As you can see, $642F- (chest flags) is "consumed" every time you take the 49th empty item. So you have to open some chests in advance.
You cannot put any item when $63FE (item count) is 48. But if $63FE is greater than 48, you can put extra items. Usually $63FE is not greater than 48, but you can manipulate this by taking 49th empty item.
When you put an extra item, the item-id is written to the address 0x63FF + (item-count), and item count is incremented. This is basically the same as you put items normally.
Saving/loading with illegal character id
You cannot manipulate event flags directly with item-repository glitch. But you can manipulate character id with item-repository glitch. And you can manipulate event flags indirectly by saving/loading with illegal character id.
For each character id, the address is asssigned and the character data is saved to/loaded from the address. But if the character id is illegal, the program refers out of the address table, and the character data is saved to/loaded from illegal address. Here is the table:
You can "save" the character data to event flags with character id 0x70 of savedata 2, and you can "load" the character data from items in item-repository with character id 0x5D of savedata 2. So, you can manipulate event flags properly as follows:
- Put items to item-repository properly.
- Change character id to 0x5D, save, and load.
- Change character id to 0x70, and save.
Escaping from dungeons
When the screen is switched, you can go through walls. So you can use this as shortcut to escape from dungeons.
Run detail
Manipulating ship and event flags
I need the event flags as follows:
Flag | Address | bit | Corresponding address in item-repository |
---|
The final dungeon appeared | $05DA | bit1 | $6415 |
Got the ship Artemis | $05E3 | bit6 | $641E |
NOT beated Samoylenko (zero) | $05E5 | bit3 | $6420 |
Eliminated Princess Moon | $05E5 | bit1 | $6420 |
First of all, I put a Healing Herb (0x3C), and a Spellbook of Dispell (0x7C). And I put 48 items considering event flags. Memory is as follows:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
63F0: .. .. .. .. .. .. .. .. - .. .. .. .. .. .. 30 3C
6400: 7C 3E 3F 3F 3F 3F 3F 3F - 3F 3F 05 3F 3F 3F 3F 3F
6410: 24 05 3F 3F 3F 3F 3F 3F - 3F 3F 3F 3F 3F 3F 3F 3F
6420: 55 3F 03 21 74 3A 2D 3F - 3F 3F 3F 24 05 67 77 40
6430: 12 03 00 00 00 00 00 00 - 7B AD 0D 00 00 .. .. ..
...
6470: .. .. .. .. .. .. .. 00 - 03 04 01 00 00 .. .. ..
I take the 49th empty item:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
63F0: .. .. .. .. .. .. .. .. - .. .. .. .. .. .. 3B 7C
6400: 3E 3F 3F 3F 3F 3F 3F 3F - 3F 05 3F 3F 3F 3F 3F 24
6410: 05 3F 3F 3F 3F 3F 3F 3F - 3F 3F 3F 3F 3F 3F 3F 55
6420: 3F 03 21 74 3A 2D 3F 3F - 3F 3F 24 05 67 77 77 12
6430: 03 00 00 00 00 00 00 7B - AD 0D 00 00 00 .. .. ..
...
6470: .. .. .. .. .. .. .. 03 - 04 01 00 00 .. .. .. ..
Now the item-count is 0x3B, so you can overwrite $643A, $643B, ... (town bookmark) by putting some items. I put a Spellbook of Healing (0x91) as ship position y, and I put a Spellbook of Outflame (0x71) as ship position x (but I modify the ship position x later):
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
63F0: .. .. .. .. .. .. .. .. - .. .. .. .. .. .. 3D 7C
6400: 3E 3F 3F 3F 3F 3F 3F 3F - 3F 05 3F 3F 3F 3F 3F 24
6410: 05 3F 3F 3F 3F 3F 3F 3F - 3F 3F 3F 3F 3F 3F 3F 55
6420: 3F 03 21 74 3A 2D 3F 3F - 3F 3F 24 05 67 77 77 12
6430: 03 00 00 00 00 00 00 7B - AD 0D 91 71 00 .. .. ..
...
6470: .. .. .. .. .. .. .. 03 - 04 01 00 00 .. .. .. ..
I take the 49th empty item again:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
63F0: .. .. .. .. .. .. .. .. - .. .. .. .. .. .. 7B 3E
6400: 3F 3F 3F 3F 3F 3F 3F 3F - 05 3F 3F 3F 3F 3F 24 05
6410: 3F 3F 3F 3F 3F 3F 3F 3F - 3F 3F 3F 3F 3F 3F 55 3F
6420: 03 21 74 3A 2D 3F 3F 3F - 3F 24 05 67 77 77 77 03
6430: 00 00 00 00 00 00 7B AD - 0D 91 71 00 00 .. .. ..
...
6470: .. .. .. .. .. .. .. 04 - 01 00 00 .. .. .. .. ..
Now the item-count is 0x7B, so you can overwrite $647A (character id of 4th), ... by putting some items. I put a Source of Magic (0x5D) as the character id of 4th:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
63F0: .. .. .. .. .. .. .. .. - .. .. .. .. .. .. 7C 3E
6400: 3F 3F 3F 3F 3F 3F 3F 3F - 05 3F 3F 3F 3F 3F 24 05
6410: 3F 3F 3F 3F 3F 3F 3F 3F - 3F 3F 3F 3F 3F 3F 55 3F
6420: 03 21 74 3A 2D 3F 3F 3F - 3F 24 05 67 77 77 77 03
6430: 00 00 00 00 00 00 7B AD - 0D 91 71 00 00 .. .. ..
...
6470: .. .. .. .. .. .. .. 04 - 01 00 5D .. .. .. .. ..
Now I save and load from savedata 2 to load the character data of 0x5D. And I modify the ship position x at the same time. When the savedata is loaded. the program adds the current town and the first town to the town bookmark. So bit0 and bit3 of $643A is enabled, and the ship position x is modified to 0x79 from 0x71:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
63F0: .. .. .. .. .. .. .. .. - .. .. .. .. .. .. 7C 3E
6400: 3F 3F 3F 3F 3F 3F 3F 3F - 05 3F 3F 3F 3F 3F 24 05
6410: 3F 3F 3F 3F 3F 3F 3F 3F - 3F 3F 3F 3F 3F 3F 55 3F
6420: 03 21 74 3A 2D 3F 3F 3F - 3F 24 05 67 77 77 77 03
6430: 00 00 00 00 00 00 7B AD - 0D 91 79 00 00 .. .. ..
...
6470: .. .. .. .. .. .. .. 04 - 01 00 5D .. .. .. .. ..
I put a Spellbook of Outcold (0x70). The item-count is 0x7C, so $647B becomes 0x70:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
63F0: .. .. .. .. .. .. .. .. - .. .. .. .. .. .. 7D 3E
6400: 3F 3F 3F 3F 3F 3F 3F 3F - 05 3F 3F 3F 3F 3F 24 05
6410: 3F 3F 3F 3F 3F 3F 3F 3F - 3F 3F 3F 3F 3F 3F 55 3F
6420: 03 21 74 3A 2D 3F 3F 3F - 3F 24 05 67 77 77 77 03
6430: 00 00 00 00 00 00 7B AD - 0D 91 79 00 00 .. .. ..
...
6470: .. .. .. .. .. .. .. 04 - 01 00 5D 70 .. .. .. ..
I take the 49th empty item again. The ship position is moved to valid address, and the character id of 4th becomes 0x70:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
63F0: .. .. .. .. .. .. .. .. - .. .. .. .. .. .. 3D 3F
6400: 3F 3F 3F 3F 3F 3F 3F 05 - 3F 3F 3F 3F 3F 24 05 3F
6410: 3F 3F 3F 3F 3F 3F 3F 3F - 3F 3F 3F 3F 3F 55 3F 03
6420: 21 74 3A 2D 3F 3F 3F 3F - 24 05 67 77 77 77 77 00
6430: 00 00 00 00 00 7B AD 0D - 91 79 00 00 00 .. .. ..
...
6470: .. .. .. .. .. .. .. 01 - 00 5D 70 .. .. .. .. ..
Now I can "save" the character data of 4th to event flags. And I can sail to the final dungeon with the ship.
Luck manipulation
In this game, the random number is not so drastically changed for a short time. So you might need to go back hundreds of frame to change the destiny.
Reference
Baxter: A well-made TAS and positive audience response; accepting.