Posts for jlun2

Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
This is probably answered somewhere, but since I can't find it: 1. Is it possible to trigger the secret stages in Bianca Village early, or does the trigger not exist until after the chapter it is unlocked? Same applies for Rico Harbour and Pianta Village (especially this one, given yoshi skip is done in the TAS) 2. Outside Gelato Beach fruit clip, Early Petey, and Pinna Park early secret world, there's no other significant timesavers possible? 3. Has anyone ever made TASes of 100 coins in this game? Edit: Yes https://twitter.com/zmdkrr/status/1177067967814586369 4. Is there any stage outside Delphino Plaza and Pinna Park that allows you to obtain 999 coins? Not TAS related, but curious. 5. Is there some place with most glitches of this game? I saw this on twitter for instance: https://twitter.com/zmdkrr/status/1177749548946509824, and can't find info on it. Do I just follow SMS TASer twitter accounts for glitches?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I'm trying to implement flags for the CPSR (CPU Status Register) in ARM. Does anyone know what's the best way to do that? Right now, I have 3 ideas: Plan 1
set_flags(CPSR, flag0, flag1, flag2, ..., flag31)
	if flag0 > 0 then 
	if flag0 > 0 then CPSR = bit.set(CPSR, 0) else CPSR = bit.clear(CPSR,31) end
	if flag1 > 0 then CPSR = bit.set(CPSR, 1) else CPSR = bit.clear(CPSR,31) end
	...
	if flag31 > 0 then CPSR = bit.set(CPSR, 31) else CPSR = bit.clear(CPSR,31) end
end
The in every function that changes the CPSR, just check if flag should be 0 or 1, and at the end write CPSR = set_flags(CPSR,N,Z,C,V,Q, ... ,E, A, I, F, T, M) where those letters correspond to the flags in https://www.keil.com/pack/doc/cmsis/Core_A/html/group__CMSIS__CPSR.html That's easy to check, but has tons of redundant arguments given most functions never touch all the flags at once. Plan 2
set_flags(CPSR, new_CPSR)
	CPSR = new_CPSR
	return CPSR
end
This is super short, but it makes it really easy to mess up setting up the new CPSR value, since it's now just 32 bit number = another 32 bit number with no way to control individual bits Plan 3
set_flags(CPSR, table_CPSR)
	for i = 0, 31 do
		if table_CPSR[i] = 1 then CPSR = bit.set(CPSR, i) else CPSR = bit.clear(CPSR, i) end
	end
end
table_CPSR can also be a number using bit.shifts; This would basically be like plan 1, but as either a table, or a number where you shift the bits. Unfortunately that's a for loop every function call that changes the CPSR, even if it's only a single flag changed. Anyone know a smarter way to set flags, while also making sure the flags are correct?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I'm not sure if there's a table of monster IDs and area IDs along with where each monster appears. Apparently for the NPCs Doxy Queen, Emerald Firecrab and Dark Goblin.
The issue is that we don't actually know where they spawn and we need to see if we can find them in the game somewhere otherwise the full 100% for the game isn't possible.
So if anyone knows anything about them, please post. Edit: Found the address for Folio Bruti; it's in System Bus, and addresses are 0xCE4B to 0xCE56. Each bit is a flag for if the npc has been checked before. By sitting them to all 0xFF, I managed to get a picture of the above NPCs:
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Why is having 0 (or "fewest") rerecords a badge of honor now? Should I manually start changing all my TAS rerecord count to 1 before submitting? Is this a trend I should be expecting?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Thanks very much! If I wanted 64 bit multiplication for implementing UMULL (The lower 32 bits of the 64 bit result are written to RdLo, the upper 32 bits of the result are written to RdHi.), I can still use your approach right? Just for the upper 32 bits don't use %, and right shift reslow/reshigh at the end? Edit: Going to do the 32 bit multiplication by hand to see how this works.
Language: lua

--[[ 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1111 A 4,294,967,295 x 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 0101 1010 1010 1010 B 4,294,924,970 1111 1111 1111 1111 0101 1010 1010 1001 0000 0000 0000 0000 1010 0101 0101 0110 Res -181,793,080,695,466 RdHi should be 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 0101 1010 1010 1001 Lower 32 bits, and thus Answer and RdLo should be 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1010 0101 0101 0110 Answer 42,326 --------------------------------------------------------------------------------- Break B to 2 parts 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 B1 Upper 16 65,535 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0101 1010 1010 1010 B2 Lower 16 23,210 A x B1 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1111 A 4,294,967,295 x 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 B1 65,535 0000 0000 0000 0000 1111 1111 1111 1110 1111 1111 1111 1111 0000 0000 0000 0001 C1 281,470,681,677,825 Do bits 16 to 31 in C1 corresponds to bits 48 to 63 in "Answer"? That is: RdHi_1 = C1 Mod 4,294,967,296 shift right 16 0000 0000 0000 0000 1111 1111 1111 1110 1111 1111 1111 1111 0000 0000 0000 0001 C1 281,470,681,677,825 Mod 4,294,967,296 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 0000 0000 0000 0001 4,294,901,761 Shift 16 right 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 RdHi_1 Mod 4,294,967,296 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 0000 0000 0000 0001 4,294,901,761 Shift left 16 times 0000 0000 0000 0000 1111 1111 1111 1111 0000 0000 0000 0001 0000 0000 0000 0000 Mod 4,294,967,296 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 0000 0000 0000 0000 C1 65,536 A x B2 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1111 A 4,294,967,295 x 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0101 1010 1010 1010 B2 23,210 0000 0000 0000 0000 0101 1010 1010 1001 1111 1111 1111 1111 1010 0101 0101 0110 C2 99,686,190,916,950 Do bits 32 to 47 in C2 corresponds to bits 32 to 47 in "Answer"? That is: RdHi_2 = C2 shift right 32 0000 0000 0000 0000 0101 1010 1010 1001 1111 1111 1111 1111 1010 0101 0101 0110 C2 99,686,190,916,950 Shift right 32 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0101 1010 1010 1001 RdHi_2 23,209 Combining C1 + C2 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 0000 0000 0000 0000 C1 281,470,681,808,896 + 0000 0000 0000 0000 0101 1010 1010 1001 1111 1111 1111 1111 1010 0101 0101 0110 C2 99,686,190,916,950 0000 0000 0000 0000 0101 1010 1010 1010 0000 0000 0000 0000 1010 0101 0101 0110 D 381,156,872,725,846 D Mod 4,294,967,296 gives RdLo (lower 32 bits) RdHi_1 x 65,536 + RdHi_2 gives RdHi (upper 32 bits) ]]-- function MUL(A,B) --The lower 32 bits of the 64 bit result are written to RdLo, the upper 32 bits of the result are written to RdHi. local reslow = A * (B%0x10000) -- A multiplied with lower 16 bits of B local reshigh = A * (math.floor(B/0x10000)%0x10000) -- A multiplied with higher 16 bits of B (shifted down) local RdHi = math.floor(reshigh)/0x10000 --Shift right RdHi = RdHi * 0x10000 --Shift left RdHi = RdHi + math.floor(reslow/0x10000) reshigh = reshigh%0x10000 -- only 16 bits can matter here if result is 32 bits local RdLo = (reshigh*0x10000 + reslow)%0x100000000 -- recombine and cut off to 32 bits return RdHi, RdLo end
Is this correct on bits 16 to 31 and bits 32 to 47 comment?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
From the ARM Manual:
MUL (Multiply) multiplies two signed or unsigned 32-bit values. The least significant 32 bits of the result are written to the destination register.
This is my attempt to implement that in BizHawk's lua: Download MUL.lua
Language: lua

function MUL(A,B) local result = A * B local temp = result local result = 0 for i = 0,31 do result = (temp%2 == 1) and result+2^i or result temp = math.floor(temp/2) --can't use bit shift due to being 64 bit end return result end
Since the bitwise library in Lua for BizHawk is 32 bit, I cannot use bit.band(result,0xFFFFFFFF00000000). Is this the best way to extract the lower 32 bits from the result of a multiply without using bit library, or can it be done better?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
https://www.youtube.com/watch?v=SbW31AkTRzo
The “Mane 6” characters fans fell in love with in MY LITTLE PONY: FRIENDSHIP IS MAGIC are back with all-new character design inspired by chibi-style animation. The MY LITTLE PONY: PONY LIFE series launches next year with all-new content premiering on Discovery Family and Discovery Family GO and short form content on the MY LITTLE PONY YouTube channel. MY LITTLE PONY: PONY LIFE features the same voice actors who made the Mane 6 famous in MY LITTLE PONY: FRIENDSHIP IS MAGIC. The new look for the franchise kicks off this winter with an exciting product line featuring toys designed to Reveal the Magic of Friendship with the comical characters and mysterious potions that are featured in the animated series. The new line dials up the magic experiences more than ever before with magical potion surprise, magic growing hair, magic color reveal hair, and more! Each product can reveal even more magic with a special potion bottle to unbox in every package. Amazon will be the first to debut select new products on November 13. Additional MY LITTLE PONY: PONY LIFE product will start hitting shelves at select retailers in December – just in time for the holidays. Toys “R” Us will be the exclusive destination for the MY LITTLE PONY Magic Potion line in Canada in 2020. “We are thrilled to reveal a new, magical chapter for the MY LITTLE PONY franchise – and it’s funnier, sweeter and warmer than ever!” says Samantha Lomow, President, Hasbro Entertainment Brands. “Our magical MY LITTLE PONY makeover is inspired by our fans who are looking for more ways to experience their favorite characters from the MY LITTLE PONY world. We are also bringing the magic to life with all new ways to play so our fans can experience the magic through engaging new products. We hope fans of all ages will enjoy exploring a fun new side of friendship and all the new story magic MY LITTLE PONY: PONY LIFE has to offer as we gear up for the launch of the all new MY LITTLE PONY movie from Paramount on September 24, 2021.” The new MY LITTLE PONY: PONY LIFE show looks at the funny side of friendship. The new center of the world is Sugarcube Corner – just like going to a friend’s house after school, this is our ponies’ home away from home. Here, Pinkie Pie serves up frosted cupcakes to the best customers in the world— her friends! PONY LIFE episodes feature hilarious, “SLICE OF LIFE” stories that modern kids can relate to. The series is LOADED with magic, including a mysterious source of potions that Pinkie keeps hidden behind the bakery counter and breaks out when the need arises.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Since the RNG mentioned is the LCG, I think this post may help: Post #394464
In practice, them using LCG very often means you're going to have an incredibly easy time figuring out the algorithm. Most of the time, you don't even need to disassemble those. For LCG, the formula for advancing through seeds is (oldSeed*x+y)%z. (Will keep calling each iteration "seed", even though that might not be technically correct) Most of the time, the %z part is just dropping the highest bits and will occur naturally in older systems. F.e., z would be 65536 for 16bit values. 1) Find the address they store the last seed at 2) Find a way to advance this seed by exactly one iteration. 3) Set this address to 0, advance once. (0*x+y)%z will give you y. 4) Set this address to 1, advance once. (1*x+y)%z will either give you x+y or (x+y)%z (They might also use XOR) And you're usually just about done at this point. When analyzing the RNG of older games, I usually first try this procedure. Only if it fails, I'll disassemble. It can often save you lots of time. (If you already have a disassembler open, it might still be faster to just disassemble though) 5) For each random event, they'll usually take either a portion of the last seed or the seed they have just advanced to (they'll either advance the seed before or after getting the actual random number they'll use), and take that portion % the number of possible outcomes for the random event in question. By "portion", I mean any number of consecutive bits of the seed. You should be able to work things out from there. Maybe without disassembling again. (Though disassembling would generally save time with this step) Please go easy on me when pointing out everything that's wrong with this post. I know straight-up disassembling is actually the proper way, and I don't recommend anyone should follow my advice.
In case anyone wonders how does one come up with X,Y, mod Z in the lua script. If it doesn't work, it's probably some other generator, and you might need to just code the instructions shown in the disassembler directly. Edit: And sometimes, it can be a slightly different form: Post #394484
AWDS: (x+1)(4x+1) % 2^30
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
1. I believe 0x1928 IWRAM is the RNG. A trace log of how it updates:
0802C58D:  00008820  LDRH    r0, [r4]                  r0:00000000 r1:02036F9C r2:0201B4A0 r3:02003B10 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C58C r16:6000003F
0802C58F:  00008008  STRH    r0, [r1]                  r0:00004B51 r1:02036F9C r2:0201B4A0 r3:02003B10 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C58E r16:6000003F
0802C591:  00004B0A  LDR     r3, [PC, #40]             r0:00004B51 r1:02036F9C r2:0201B4A0 r3:02003B10 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C590 r16:6000003F
0802C593:  00002000  MOV     r0, #0                    r0:00004B51 r1:02036F9C r2:0201B4A0 r3:02036FA0 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C592 r16:6000003F
0802C595:  00005E0A  LDRSH   r2, [r1, r0]              r0:00000000 r1:02036F9C r2:0201B4A0 r3:02036FA0 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C594 r16:6000003F

0802C597:  00000050  LSL     r0, r2, #1                r0:00000000 r1:02036F9C r2:00004B51 r3:02036FA0 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C596 r16:6000003F
0802C599:  00001880  ADD     r0, r0, r2                r0:000096A2 r1:02036F9C r2:00004B51 r3:02036FA0 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C598 r16:6000003F
0802C59B:  00008018  STRH    r0, [r3]                  r0:0000E1F3 r1:02036F9C r2:00004B51 r3:02036FA0 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C59A r16:6000003F
0802C59D:  0000785A  LDRB    r2, [r3, #1]              r0:0000E1F3 r1:02036F9C r2:00004B51 r3:02036FA0 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C59C r16:6000003F
0802C59F:  0000780B  LDRB    r3, [r1]                  r0:0000E1F3 r1:02036F9C r2:000000E1 r3:02036FA0 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C59E r16:6000003F
0802C5A1:  000018D0  ADD     r0, r2, r3                r0:0000E1F3 r1:02036F9C r2:000000E1 r3:00000051 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C5A0 r16:6000003F
0802C5A3:  00007008  STRB    r0, [r1]                  r0:00000132 r1:02036F9C r2:000000E1 r3:00000051 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C5A2 r16:6000003F
0802C5A5:  0000704A  STRB    r2, [r1, #1]              r0:00000132 r1:02036F9C r2:000000E1 r3:00000051 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C5A4 r16:6000003F
0802C5A7:  00008808  LDRH    r0, [r1]                  r0:00000132 r1:02036F9C r2:000000E1 r3:00000051 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C5A6 r16:6000003F
0802C5A9:  00008020  STRH    r0, [r4]                  r0:0000E132 r1:02036F9C r2:000000E1 r3:00000051 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C5A8 r16:6000003F
0802C5AB:  00007808  LDRB    r0, [r1]                  r0:0000E132 r1:02036F9C r2:000000E1 r3:00000051 r4:03001928 r5:02007CA0 r6:030043D0 r7:0000000A r8:00000000 r9:00000000 r10:00000000 r11:00000000 r12:02000800 r13:03007C80 r14:080103A3 r15:0802C5AA r16:6000003F
Which after messing around, I believe the corresponding lua code would be: Download rng.lua
Language: lua

function next_rng(value) local temp1 = bit.rshift(3 * value,8) --value + lshift value by 1 is value + 2*value = 3 * value! local temp2 = bit.band(value, 0xFF) local result = bit.band(temp1 + temp2, 0xFF) + (temp1 * 256) return bit.band(result, 0xFFFF) end
Or a simplified version: Download rng.lua
Language: lua

function next_rng(value) local x = bit.rshift(3 * value,8) --This is floor(3*value/256) local r = bit.band(x + value, 0xFF) + (x * 256) --bit.band same as mod 256 return bit.band(r, 0xFFFF) --Same as mod 65536 end
On reset, this seems to start at 0xD37 (3383 in decimal), loaded from 0x0015FD4 in ROM. This gives different values for 43,534 calls, before looping back to 0xD37. Pretty sure it's RNG since freezing it gives consistent results for things like hits. So now it's possible to make a giant table of 43,534 entries to determine where in the loop is the RNG right now so far, and potentially how much needed to wait to get a better RNG. 2. I believe each entity in battle has their own address determining criticals. For NPCs at least, it seems to be the address base + 0xA0, where base is 0x01CD20, 0x01CE8C, 0x01CFF8 in EWRAM. Need to check if it's the same offset for team members. Setting it to 4 makes hits critical for the corresponding NPC's attack. 3. I think I found addresses relating to battle state. While I used Combined WRAM, it's probably all EWRAM: 0x01CCC4 - something? 0 - Nothing; turn occurs then you do nothing, and get to select stuff again 1 - The state right before you attack 2 - Same as 1? 3 - Dealing damage 4 - Defeat; makes enemy Xp yield add to total 5 - Attack yourself 6 - Enemy flees 7 - ? 0x0196AF 0 - No idea, but freezing to 0 makes you remain in fight, even if 0 opponents 1 - You lose 2 - You win 3 - You lose 4 - transit to XP screen? 5 - You lose (probably different than above; need to check with bosses) 6 - You win 17 - Last several bosses defeats you (you dont respawn; battle just ends) Also I think battle interfaces are nearby 0x019690 0 - Battle start! (Set it to 0 to reload battle with new NPC) 1 - Battle (select items, attack, etc) 2 - State before attack 3 - Attacking 4 - State before going back to 1 5 - Enemy defeated or you ran away 6 - No idea, disables menus 7 - XP screen 8 - Recruit (Set this to auto recruit; fantastic! Works on bosses too) 9 - Transits to overworld; counts as defeat bosses; (only works if not in menu) 10 -Disables menu use 11 - This changes friendliness; probably from using items on them 12, 13, 14 - ? 15 - Displays something about enemy?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Some elaboration on the first 5 recruits: NPCs - Recruit item they drop -> Recruits which? Penguin (20) -> Fish (23) -> Penguin Dog (31) -> Meat horn (31) -> Dog, Fire Scorpion (49) Caveperson (26) -> Painkiller (52) -> Spinner Worm (27) -> Vegetable (22) -> Worm, Caveperson Thief (32) -> Gold bar (25) -> Thief Spinner (39) -> "Throat Lozenge" (32) -> Ice lady Ice lady (33) -> Tech: Heal (2) -> Yeti (24) So we have these choices: 1. Recruit penguin (ID 20) Last appearance, F4, Lv 7, 32 XP. Possible without food 2. Recruit dog (ID 31) Last appearance, F3, Lv 6, 18 XP. Possible without food 3. Recruit Caveperson (ID 26) Last appearance, F6, Lv 12, 155 XP 4. Recruit Worm (ID 27), Last appearance F3, Lv 6, 19 XP 5. Recruit Spinner (ID 39) Last appearance F6, Lv 12 156 XP 6. Recruit Ice lady (ID 33), Last appearance F6, Lv 7, 30 XP 7. Recruit Yeti (ID 24), Last appearance F6, Lv 10, 60 XP Notes: * The thief (32) is not listed, since you need 1000 gold on hand to even be allowed a chance to recruit. It last appears on F6, level 12, drops 165 XP. * Technically, their "evolved" (grown?) forms appear later, but they can only be talked to when at their first stage, hence the "last appearance". Their levels also rise rather quickly so it's recommended to KO for item drops for recruit on the first floor. * Making it foggy also reduces the amount of steps needed per encounter to 11. * The penguin recruited in the tutorial dungeon doesn't count towards the 5 needed. * Eggs also don't count towards the 5. * Evolving doesn't count towards the 5. Based on these restrictions, I got the following plan: F1: KO 1 Dog, 1 Worm F2: Open chest for star fragment (ID 17) to escape later F3: Recruit 1 Dog, 1 Penguin (last time solo here) any level 5 or 6 works. F4: KO Caveperson (first time available here) F5: ? F6: Recruit Caveperson, Spinner, Fire scorpion at highest level available; have them replace your current 3 team members. F7: Eggs start appearing here. Obtain 4 eggs (no space for more; can release everything except soldier). Leave using star fragment. May need to check if possible to trigger that shady guy at the start to upgrade stats. Alternatively, manipulate gold medals (ID 33) to appear to play minigames to increase stats. Edit: * I think I I just managed to recruit the dog by having it appear with 54 friendship, but I'm not sure. * Don't think it's possible to recruit worm, even if it's at 50 friendship. Can't seem to find one with higher either. * Don't think it's possible to recruit fireball, even with 90+ friendship without requirement * Don't think it's possible to recruit fire scorpion (49) without requirement at 50 friendship * Don't think it's possible to recruit spinner (39) without requirement at 60 friendship. * IDs 26 (caveperson), 39 (Spinner), 49 (Fire scorpion) do not go solo all at once in F6. Ie. only 2 of them will be solo at once, and always 1 will be in a duo. Using F5 instead makes it to level 9-10 instead of 11-12. F5 at lvl 9-10 caveperson 30 attack spec 51 fire scorp 32 attack no spec spinner 26 attack spec 55 F6 at lvl 11-12 caveperson 33 atk has spec fire scorp 37 atk no spec spinner 31 attack has spec caveperson_2 34 attack 2 spec fire scorp 38 has 2 spec spinner_2 37 atack spec Recruiting caveperson most promising; only at F5 city to solo however. Solo fire scorp and spinner only appears in F6 water. Regarding the egg, here are the relevant stats and IDs of the monsters that go with the egg: F7 City ID 57, LV 13, 64 HP 23 Def ID 25, Lv 13, 76 HP 30 Def Water ID 40, Lv 13, 72 HP 31 Def ID 52, Lv 14, 73 HP 45 Def Snow ID 23, Lv 14, 95 HP 42 Def ID 44, Lv 14, 65 HP 28 Def Fire ID 57, LV 13, 64 HP 23 Def ID 25, Lv 13, 76 HP 30 Def These are the stats of the other monsters. I think Fire, City is best place to grind egg. ID 57 is the demon thief. Not sure how it is determined when it flees; doesn't seem to do so unless lower health, so might be worth just KOing them.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Now that the show is over, anyone excited for this: https://www.equestriadaily.com/2019/10/idw-my-little-pony-season-10-comic.html Also rip a certain filly. Edit: For anyone who's watched the finale and have a derpibooru account, vote here please: https://derpibooru.org/pony/cozy-glow-s-fate
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Found out where the NPC data is partially stored. Starting from 0x045A0FC in ROM, with length 0xCC per NPC, for 407 entries. This script dumps that info to a text file:
memory.usememorydomain("ROM")
local hex = bizstring.hex
local start = 0x045A0FC
local line = ""
local address = "0x"..hex(start)
file = io.open("this.txt","w")
io.output(file)
for i = 0,407 do
	line = "0x"..hex(start + (0xCC*i)).."\t"
    for j = 0, 0xCC do
        line = line..hex(memory.readbyte(start + (0xCC*i) + j)).." "
    end
    line = line.."\n"
	io.write(line)
end
io.close(file)
console.log("Done!")
Format is:
+0x1	ID
+0x4	0x01CD30 EWRAM?
+0x6	0x01CD32 EWRAM?
+0x8	Gold drop (2 bytes)
+0xA	XP drop(2 bytes)
+0xC	Attack
+0xE	Defence
+0x10	Speed
+0x12	intelligence
+0x14	HP
+0x18	TP
+0x1C	Level
+0x20	Item drop 1
+0x24	Item drop 2
+0xAC	Special 1
+0xAB	Special 2
+0xAD	Special 3
+0xAE	Special 4
+0xAF	Special 5
+0xC0	Charm
Note: Only Bosses appear to have non-zero values for stats. Normal enemies have stats scaled by their level, with some minor random variations. What techniques a monster has is either on the top regions, or located below 0x46E61C (ROM) for their evolved versions. For instance, even at level 20, it will show the first penguin ID at 0x461620, saying it has attack ID of 2. To find it's true special attack, you go to 0x46FD38, with monster ID of 30 (final form of Penguin at level 20) to see it has techniques 89, 90, 91, 92. Additionally, there are 186 different "Techniques" or special attacks in the game:
ID	Name	TName	TP
0			
1	ライトニング	Lightning	10
2	ヒール	Heal	5
3	ネンコロ	Sleep "Nenkoro"	4
4	パニクリ	Panic 	4
5	ポイズン	Poison	5
6	ファイアーボール	Fire Ball	9
7	アイススピアー	Ice Spear	8
8	ロックフォール	Rock Fall	25
9	マジギレ	Rage "Majikire"	0
10	サボる	Idle?	0
11	一撃	Strike	25
12	アシュラ斬り	Asura Slash	10
13	スライドアタック	Slide Attack	10
14	メテオストライク	Meteo Strike	40
15	ファイアーブレス	Fire Breath	9
16	アトミックブレス	Atomic Breath	20
17	ボム	Bomb	12
18	超スーパーボム	Super Super Bomb	37
19	スーパーボム	Super Bomb	22
20	スーパーノヴァ	Super Nova	15
21	ピースフルヒール	Peace Full Heal	8
22	刀投げ	Katana Throw	10
23	乱れチュウかみ	Disturbing Chew	40
24	乱れ火炎斬りかみ	Turbulent flame cutting	20
25	フロストニードル	Frost Needle	10
26	アイスタワー	Ice Tower	20
27	モウモク	Blind	4
28	アシッドシャワー	Acid Shower	5
29	サンセイウ	Acid Rain	10
30	メガライトニング	Mega Lightning	20
31	ギガライトニング	Giga Lightning	35
32	雷玉	Lightning Sphere	10
33	真·雷玉	True Lightning Sphere	20
34	極·雷玉	Extreme Lightning Sphere	35
35	エレキビーム	Electricity Beam	10
36	エレキフラッシュ	Electricity Slash	10
37	エレキストーム	Electricity Storm	15
38	アシッドレイン	Acid Rain	10
39	ヘルフレイム	Hell Flame	20
40	フレイムウォール	Flame Wall	35
41	クールストーム	Cool Storm	10
42	コールドストーム	Cold Storm	20
43	フリーズストーム	Freeze Storm	35
44	レーザー70度	Lazer 70 degrees?	12
45	レーザー100度	Lazer 100 degrees?	15
46	レーザー30度	Lazer 20 degrees?	5
47	きゅうそカミ	Desperate Bite (pokemon Flail?)	5
48	ゴッドフレイム	God Flame	5
49	フレイム	Flame	10
50	クリスタルビロウ	Crystal Blow	35
51	もうれつアタック	Fierce Attack	5
52	ユキメの歌	Snow Blindness Song	7
53	ヌスム	Steal	5
54	ドヨ~ン	"Silence" Dooyon	5
55	カマイタチ	"Parry" Kamaitachi (description says you block all attacks but get dizzy)	5
56	オオカミ少年	Wolf Boy "causes enemies to flee"	5
57	怒キの炎	Angry? Flame	0
58	怒キの毒ドリル	Angry Poison Drill	0
59	毒ドリル	Poison Drill	5
60	ドリル突 き	Drill Thrust	10
61	ダブルドリル	Double Drill	20
62	トリプルドリル	Tripple Drill	40
63	パニクリファイア	Panic Fire	5
64	火炎	Blaze	10
65	悪しき火炎	Evil Flame	20
66	乱れ火炎	Wild Flame	35
67	カマイタチ返し	Kamaitachi Return	10
68	風まかせ	Wind "Kazemakase"?	8
69	狂い風まかせ	Mad Wind?	18
70	乱れ風まかせ	Wild Wind?	35
71	ユウワク	Lure	10
72	ラブウィンク	Love Wink	10
73	ラブラブウィンク	Love Love Wink	20
74	乱れラブウィンク	Wild Love Wink	40
75	女王の光	Queen's Light	7
76	ジゴロジュバク	Gigolo's Curse? what?	10
77	オスソクザン	Male Slasher /  Male "sokuzan"?	8
78	2連オスソクザン	Male Slasher 2 / 2 Male "sokuzan"?	20
79	3連オスソクザン	Male Slasher 3 / 3 Male "sokuzan"?	40
80	ヒーリング	Healing	10
81	ヒステリークロー	Hysteria Claw	0
82	ダーククロー	Dark Claw	10
83	ダブルクロー	Double Claw	20
84	クレイジークロー	Crazy Claw	40
85	あま~いミツ	Sweet Nectar	5
86	ファンナンデス	I'm a fan	8
87	大ファンナンデス	I'm a great fan	18
88	フーリガン	Hooligan	33
89	ワイドヒール	Wide Heal	15
90	スライドアタック	Slide Attack	10
91	スピンアタック	Spin Attack	20
92	スピンクラッシュ	Spin Crush	35
93	イカク	Squid	5
94	毒牙	Poison Fang	10
95	狂牙	Crazy Fang	20
96	乱れ毒牙	Wild Poison Fang	40
97	ピースフルムード	Peaceful Mood	5
98	ヘルズミラー	Hell's Mirror	5
99	デス	Death	10
100	ゴートゥヘル	Go To Hell	25
101	ハーデス	Hades	40
102	かばう	Cover	5
103	気合斬り	Power Strike	8
104	深呼吸気合斬り	Breathing Power Strike	18
105	乱れ気合斬り	Wild Power Strike	35
106	強盗	Robber	12
107	ケツマクリ	Come Up From Behind?? Ketsumakuri	5
108	ヒラリ	Nimble "hirari"	18
109	サンダーフレア	Thunder Flare	35
110	刀投げ	Katana Throw	10
111	スジ斬り	Tendon Cut	20
112	真空斬り	Vacuum Cut	40
113	甘えんぼう	Lady Killer "Amaenbou" "someone that likes getting attention"	5
114	ダマス	Trick	3
115	タテガクレ	"Defense Up" Shield "something" Tate ga Kureesuki"	3
116	気合	Power	5
117	突 き	Thrust	10
118	乱れ突 き	Wild Thrust	40
119	シバレル	Bind	8
120	チョーシバレル	Super Bind	15
121	マジシバレル	Serious Bind	30
122	アヤカリ	Effect Share "Ayakari"	3
123	ピースフルヒール	Peaceful Heal	8
124	オーエン	Cheer	5
125	フレフレ	Cheer 2 "fure fure"	10
126	チュパガミ	Suck Bite "Chupa Gami"	0
127	チュパチュパガミ	Suck Suck Bite	0
128	ヌケガケ	"Preempt"?	5
129	クロスカウター	Cross Counter	5
130	カミカゼ	Kamikaze	10
131	スーパーカミカゼ	Super Kamikaze	20
132	カイテン	Suicide Bomb "Kaiten" blow yourself up and kill opponents	35
133	アクマノササヤキ	Akuma no Sasayaki aka Charm	8
134	シュラノギシキ	Shura Ritual "Shura no Gishiki"	8
135	アシュラヅキ	 (Ahura Strike x3) Turn Ashura?? 	20
136	アシュラレンゲキ	Ashura Rengeki (consecutive attacks?)	40
137	カッパの水	Kappa Water	5
138	カッパの酒	Kappa Sake	8
139	イッキ	Drink?	10
140	ホロ酔いレンゲキ	Tipsy Rengeki (consecutive attack?)	20
141	酔拳パの水	Drunken Fist Water	35
142	ムキムキ酒	Muscular Water	5
143	タフネス	Toughness	5
144	アップテンポ	Up Tempo	5
145	Wアップテンポ	W-Up Tempo	8
146	氷の拳	Ice Fist	10
147	空氷拳	Sky Ice Fist	20
148	乱氷拳	Wild Ice Fist	40
149	Wタフネス	W-Toughness	8
150	雷の拳	Lightning Fist	10
151	空雷拳	Sky Lightning Fist	20
152	乱雷拳	Wild Lightning Fist	40
153	Wムキムキ	W-Muscle	8
154	炎の拳	Flame Fist	10
155	空炎拳	Sky Flame Fist	20
156	乱炎拳	Wild Flame Fist	40
157	サボる	Idle?	5
158	トッシン	Rush	0
159	クレイジーホーン	Crazy Horn	10
160	メツブシタックル	Crush Tackle?  /"Metsubushi" Tackle	10
161	王者のにらみ	King's Glare	5
162	王者のうなり	King's Groan	10
163	ノドブエ	Windpipe	10
164	ウシノコクマイリ	Curse "its a ritual where you hammer nails into a doll"	8
165	天使のハネ	Angel Feather	5
166	天使のツバサ	Angel Wing	7
167	スタンライト	Stun Light	20
168	ヘタレ	Fart (fart attack reduce TP looks like)	10
169	スカシッペ	Silent Fart	6
170	メニシミルッペ	Burning Fart (fart smells bad and burns eyes. awesome name and description)	8
171	オナラアタック	Fart Attack	20
172	ホウヒ	Fart Attack	35
173	ドーヨ	Charm "Dooyo" "description is to possibly make a female your ally but if it fails you get hit"	8
174	ニセガネ	Counterfiet Money	5
175	ニセサツ	Counterfeit Money/Document (can ally enemy)	8
176	頭突 き	Headbutt	5
177	イカスミ	Squid Ink	10
178	アシマキ	Paralyze "Ashimaki"?	20
179	マキマキ	Paralyze All "Makimaki"	40
180	ドロン	Parry and Counter "Doron"	5
181	電気針	Electric Needle	8
182	リフレクト	Reflect	10
183	キュウケツ	BloodSuck	10
184	暗黒の呪い	Dark Curse	10
185	ヒトヤスミ	Sleep	10
186	お色気の術	Seduction	8
Thanks to theripper999 (CoolHandMike) for translating.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
For reference:
100% is defined by collecting everything in the pause menu. This includes: ● All 100 Star Pieces ● All 85 unique Badges ● All 124 Tattles ● All 57 Recipes ● All 42 unique Shine Sprites (duplications don't count) ● All 7 party members upgraded to Ultra Rank ● All 7 Crystal Stars ● All 8 Special Moves ● Superstar Rank at level 30 ● All 4 Paper Curses ● Ultra Boots and Ultra Hammer Completing the Trouble Center and reaching level 99 are not required because these achievements aren't tracked in the pause menu. Collecting all Important Items is not required as it is impossible to possess all of them at the same time.
Also, I never knew you could dupe shine sprites. Interesting. The bug mentioned on twitter for 48 recipes (https://twitter.com/Really_Tall/status/1175880275106177024) also deletes Strange Sack. Does anyone know if that's ever reobtainable?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Alyosha wrote:
@scrimpeh: Sure it's possible for input to have an impact when the screen is off, especially if IRQ's are on. The correct way to time runs is with cycle count. Gambatte also requires this, as TIKevin83 pointed out in a recent submission (just to a lesser extent.)
Not sure how feasible it is, but if so, can you please make a "Display cycle count" similar to "Display FPS" under view? Even if it ended up being the same cycle count, it messes up comparing runs unless the person knows to use "emu.totalexecutedcycles()" in lua beforehand. Edit: Does this also mean runs of GB games using GBHawk always have to have their times manually adjusted when submitted to here due to the site parser using frames as length?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Black Black ブラブラ (Black Black Baru Baru) is an obscure rougelike RPG by Capcom, released for the GBA. Quick Guide: 1. Talk to old man 2. Enter 1st dungeon stairs in building 3. Encounter penguin with friendship > 50 4. Talk to penguin . This should cause them to join you. 5. Leave dungeon 6. Talk to old man 7. Leave house 8. Enter building northeast of town 9. Leave building after cutscene 10. Enter 2nd dungeon south (or east, both entrances work) of town 11. Do the following in the dungeon: F1: KO 1 Dog, 1 Worm. Obtain Meat horn (肉のホネ, ID 31) and Vegetable (野菜, ID 22) as loot. F2: Open chest for star fragment (ID 17) to escape later F3: Recruit 1 Dog, 1 Penguin (last floor they appear solo here) any level 5 or 6 works. F4: KO Caveperson (first time available here). Obtain painkiller (いたみ止め, ID 52) as loot. F5: Recruit Caveperson at level 5 or 6; last floor they appear solo here. Use Vegetable to recruit. F6: Make sure it's water layout. Recruit Fire scorpion and Spinner monster using Meat horn and Painkiller respectively. F7: Get an egg encounter 4 times. Don't care what ID they end up; just sell them at farm for 1k gold 12. Use star fragment to quickly leave. 13. Sell all the eggs for 4000 gold 14. Upgrade farm to 10 spaces with 3000 coins 15. Leave building. 16. Enter the building with old man 17. Talk to old man 18. Leave building. 19. Head back to 2nd dungeon 20. Find those blue crystals on the way to 10th floor. Use them to advance the day to get farm upgraded. Be sure to also obtain more eggs! 21. On 10th floor, find a human wearing red and talk to them. 22. Defeat boss 1: 2 NPCs with 280/260 HP respectively 23. You'll get sent back to the old man. Leave building after dialogue 24. Sell back your eggs for more money 25. Enter building northwest of town 29. Talk to the receptionist. Pay fee of 3000 coins 30. Defeat boss 2: 3 NPCs with 180/230/260 HP respectively 31. You'll get sent back to the old man. Leave building after dialogue 32. Talk to the guard near the northwest building 33. Enter the dungeon to the west of the city 34. You cannot recruit anyone in this dungeon if you have "Class B" monsters from the 2nd dungeon. To obtain "Class A" monsters to start recruiting, head to F7. 35. Obtain an egg from an encounter. 37. On 10th floor, find a human wearing red and talk to them. 38. Defeat boss 3: 3 NPCs with 350/300/320 HP respectively 34. Talk to old man 35. Leave building. 36. Head back to 3rd dungeon. ???? 37. On 10th floor, find a human wearing red and talk to them. 38. Defeat boss 3: 3 NPCs with 350/300/320 HP respectively 39. You'll get sent back to the old man. Leave building after dialogue 40. Enter building northwest of town 41. Talk to the receptionist. 42. Defeat 4 bosses in row; they have the following HP Fight 1: 580/550 Fight 2: 470/380/300 Fight 3: 580/450/370 Fight 4: 1000/470 43. Head back to 3rd dungeon. Get to 11th floor 44. Open the closed door. 45. Defeat 2 bosses in row; they have the following HP Fight 1: 550/650 Fight 2: 3000 Credits roll! Thanks to the following from the TASVideos discord for helping me get through this game at least once: * theripper999 * xelivous * ALAKTORN * Anton Retro Jr. * Shinryuu * Toddlivia * ViGadeomes (Sorry for missing anyone!) There are 55 items in total: https://docs.google.com/spreadsheets/d/16byK5R4SmshlR3MgBA5LJ4rCT0ciohOaqf-a-FeAHsY/edit?usp=sharing
0	
1	回復の実S
2	回復の実L
3	いやしの実S
4	いやしの実L
5	気つけ薬
6	ハーブリーフ
7	マヒしっぷ
8	毒消し薬
9	万能薬
10	体力の実
11	康力の実
12	レベルの実
13	かしこさの実
14	スピードの実
15	タフの実
16	魅力の実
17	星のかけら
18	イチゴ
19	ブドウ
20	バナナ
21	ナシ
22	野菜
23	魚
24	肉
25	金ののベぼう
26	王冠
27	ゆびわ
28	カッパの水
29	カッパの皿
30	種
31	肉のホネ
32	のどアメ
33	ゴールドメダル
34	シルバーメダル
35	ブロンズメダル
36	福引券
37	ワラ
38	クギ
39	ビール
40	白ワイン
41	赤ワイン
42	星のオブジェ
43	遺伝力の実
44	なつきの実
45	土の実
46	キリデルトール
47	不思議な地図
48	けむりだま
49	聖なるお守り
50	オスモンの実
51	メスモンの実
52	いたみ止め
53	ラベンダー
54	活力の丸薬
55	なごみの丸薬
There are 71 monsters. Ids are in the 3rd spreadsheet. Each floor layout is determined by delaying before entering. The same applies for battle outcomes, but there's nothing to delay the attacks between characters (usually) until the turn ends. The names are filler right now: Fireball - no idea how to recruit; talking to it gives ボクがウソつきじゃないって 証明 してくれたら かんがえてあげるよ "I'm not a liar I ’ll think about it if you prove it." Fire mouse - no idea how to recruit; talking to it gives オトナの色気がでてから でなおしてくるでチュ! "After the adult ambition comes out, I'll come back with you!" Thief - giving gold bars/crown/ring (金ののベぼう/王冠/ゆびわ) increases friendship by 30/20/10 respectively, but wasn't able to convince them to join ビンボー人に用はねえょ Edit: You need over 1000 coins on hand (not in bank) to recruit them. Yeti - no idea how to recruit; talking to it gives ... Scorpion - no idea; they seem to need something to make them sleep, but not sure how 最近 ねぶそくで イライラするんだよね "I'm annoyed recently because of lack of sleep" Fire scorpion - no idea; they seem to need calcium, but not sure what item that is どうも 最近イライラするんだよね カルシウムが足りないのかな "I'm very frustrated recently. I wonder if I lack calcium" Edit: give meat horn (肉のホネ, item id 31) then talk to them Dog - give meat horn (肉のホネ, item id 31) then talk to them Penguin - give fish (魚, item id 23) then talk to them Spinning monster thing - give painkillers (いたみ止め, item id 52) then talk to them Worm? - give them vegetables (野菜, item id 22) then talk to them Oni? (wears caveperson garb) - give them vegetables (野菜, item id 22) then talk to them Ice princess? - give them throat lozenge (のどアメ, item id 32) then talk to them Fire mouse - Evolve the Oni at level 13, then use said Oni to talk to them Yeti - Recruit Ice princess, have them use their special on Yeti (Singing) Thief - Obtain 1000 coins in the dungeon, then give them gold bars/crown/ring and talk to them Electric water drop - Obtain an egg in the city layout, then hatch it. Species is determined right after you press "A" in the xp drop interface. If it's 55, the egg will be this npc. Eggs start to appear in battle on F7, F8, F9, F10. IF you KO the other NPCs during the fight, you auto recruit the egg. These can be sold to the farm for 1,000 gold. You cannot talk to npcs if there's another one in battle. You cannot talk to evolved npcs. Player stuff: IWRAM 0x10B2 Dungeon floor 0x1840 Base address for traps in dungeons 0x18C8 Game state 0x1970 Steps until next encounter 0x1974 total XP drop after battle, count down interface (2 bytes) 0x1928 RNG (2 bytes) 0x195B Fog (1 byte; 2 is foggy floor) 0x19A8 Music ID 0x19AC Area ID 0x44C4 Stair X 0x44C5 Stair Y EWRAM 0x003B70 Base address for player stats in battle 0x004B40 Base address for player stats in the farm 0x005FE0 Recruit name; Use struct below for the stats at recruit screen; useful for checking egg true id 0x006080 Money in dungeon (2 bytes) 0x006084 Money in outside (2 bytes) 0x00608D appears to be responsible for how many npcs to display in farm interface; also which offset to use 0x0060C4 Base address for items 0x006A34 Base address for photobook 0x01894C total XP drop after battle 0x018E48 ID of item to drop after battle 0x0196F2 Recruit flag (set to 1 and talk to NPC to recruit) 0x01984A Player X 0x01984E Player Y 0x01A590 How many recruits are in farm 0x01B4D0 Base address for chests in dungeons 0x01CD20 Base address for NPC stats There are 20 inventory spaces. 0x0060C4 is the base, and every +0x4 is another item. Stats struct: Base addresses are in EWRAM, mentioned above +0x0 name +0xA level +0xC XP drop on defeat; for team member eggs, that's how many days for it to hatch +0x12 Egg bool (Set to 0x80 to become an egg; 0 for hatched) +0x14 HP +0x18 TP +0x1C Special 1 +0x1D Special 2 +0x1E Special 3 +0x1F Special 4 +0x20 Special 5 +0x21 ID (for recruit; doesn't change sprite) +0x22 Class (0 is B, 1 is A) +0x23 (遣伝力) Note: +0x80 Max HP +0x84 Max TP +0x88 Attack (パワー) +0x8A Robustness (頑丈さ) +0x8C Speed (スピード) +0x8E IQ (かしこさ) +0x92 Friendliness (なつき度) +0x94 Charm (みりょく) +0x96 Type (top right icon; setting to 4 makes npc a gold color) +0x9A Personality (個性) The following is battle only: +0xA0 Hit was Critical (Set to 4 for true) +0xA6 Special attack selected id +0xF0 Item given +0xF8 Item drop 1 +0xFC Item drop 2 +0x105 Dialogue (what are they saying when you talk to them) +0x106 Gold drop amount +0x10A Friendship meter (for recruiting) For the stats, offsets +0x60 to 0x76 are the displayed values for stats. Eg. If 0x004BC0 is HP, then 0x004BA0 is the displayed HP value in the stats screen. Types are: 0 Electric 1 Water 2 Fire 3 Earth 4 Gold (Crown icon) Personality ID Name Translate 0 なし None 1 おんなずき Lustful? 2 ギャンブラー Gambler 3 すなお Docile 4 こうは Hardliner 5 ざんぎゃく Cruel 6 おくびょう Cowardly/Timid 7 にげごし "Ready to run away" 8 ネクラ "Dark"/Introverted? 9 たかびしゃ Domineering 10 くいしんぼ Glutton 11 やさしい Easy/Simple 12 きれやすい Sharp/Agile 13 さぼり Procrastinater 14 しゅせんど Miser 15 うそつき Liar/Dishonest 16 むくち Quite 17 どじ Clumy 18 ずるい Crafty/Sneaky Area: 0x19AC (IWRAM) 12 old man (at start, after beating rival 2) 20 farm outdoors 24 f11 3rd dg 92 bar 108 outside dg3 112 dg 128 stadium lobby 140 city 148 shop 208 farm indoors 220 outside dg2 236 stadium 244 old man Battle state: 0x019693 (EWRAM) Game state: 0x18C8 (IWRAM) 0 - beginning cutscene 1 - floor/room transition 2 - overworld (including dungeon/indoors) 3 - select menu 4 - dialogue 5 - battle 6 - map 7 - shop interface 8 - farmer interface 9 - Minigame 10 - Picture book 11 - Matchmaking minigame Trap IDs 7 traps possible at once. Address starts in 0x1840 IWRAM, acts like a stack (triggering a trap pops it off) 0 - Gas (TP decrease) 1 - Pit (go down 1 floor) 2 - spike (10 damage to all members) 3 - Poison spike (10 damage to all members + poison status to random) 4 - net (lose item) 5 - water geyser (??) 6 - mud geyser (??) 7 - ?? 8 onwards crashes Trap X,Y is +0x1 and +0x2 offset from the base. +0xC for the next trap. Photobook 0x006A34 (EWRAM) +0x0 is the bottom text entry, also if entry exists check (> 0 means exists, so show sprite). It's 1 if not shiny, 3 if shiny (golden) +0x1 is ID for name +0x2 is Class (0 for B, 1 for A) +0x3 is how many entries should be displayed in the current page +0x18 next entry My wch file for this:
SystemID GBA
44C4	b	u	0	IWRAM	stair x
44C5	b	u	0	IWRAM	stair y
1970	w	u	0	IWRAM	encounter timer
003B84	w	u	0	EWRAM	hp 1
003C16	b	u	0	EWRAM	item selected 1
003D6E	b	u	0	EWRAM	item selected 2
003EC6	b	u	0	EWRAM	item selected 3
004B40	d	h	0	EWRAM	Name
004B54	b	u	0	EWRAM	hp
004B58	b	u	0	EWRAM	tp
004B5C	b	u	0	EWRAM	
004BA8	w	u	0	EWRAM	Attack (display)
004BC8	w	u	0	EWRAM	Actual attack
006080	w	u	0	EWRAM	money
0060C4	b	s	0	EWRAM	item1
0060C8	b	s	0	EWRAM	item2
0060F5	b	s	0	EWRAM	
018E48	b	u	0	EWRAM	item drop
0196F2	b	u	0	EWRAM	recruit
01984A	b	u	0	EWRAM	x
01984E	b	u	0	EWRAM	y
01A75A	b	h	0	EWRAM	
01CD20	b	h	0	EWRAM	name select
01CD2A	b	u	0	EWRAM	npc 1 lvl
01CD34	w	u	0	EWRAM	npc 1 hp
01CD41	b	u	0	EWRAM	id
01CDA8	b	u	0	EWRAM	npc 1 attack
01CE10	b	u	0	EWRAM	how many items given
01CE2A	b	u	0	EWRAM	npc 1 friend meter
01CE96	b	u	0	EWRAM	npc 2 lvl
01CEA0	w	u	0	EWRAM	npc 2 hp
01CEAD	b	u	0	EWRAM	npc 2 id
01CF96	b	u	0	EWRAM	npc 2 friend meter
01D00C	w	u	0	EWRAM	npc 3 hp
01D019	b	u	0	EWRAM	npc 3 id
04195A	w	u	0	Combined WRAM	fog? (512)
036E43	b	u	0	Combined WRAM	crystal x?
036E44	b	u	0	Combined WRAM	crystal y?
036BD8	b	u	0	Combined WRAM	
036BD9	b	u	0	Combined WRAM	
036E43	w	h	0	Combined WRAM	crystal x?
003F70	b	u	0	Combined WRAM	pit animation timer
041967	b	u	0	Combined WRAM	cant move at 128
04184E	b	u	0	Combined WRAM	
04184C	b	u	0	Combined WRAM	trap id?
041840	b	h	0	Combined WRAM	
1840	b	u	0	IWRAM	
040BE1	b	u	0	Combined WRAM	battle sprite?
040BE5	b	u	0	Combined WRAM	battle transition?
18C8	b	u	0	IWRAM	state
18C9	b	u	0	IWRAM	state transition
18CC	b	u	0	IWRAM	state 
198A	b	u	0	IWRAM	moving?
041980	b	u	0	Combined WRAM	rooms?
0419AC	b	u	0	Combined WRAM	
0419AD	b	u	0	Combined WRAM	
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Just some questions: 1. Is there a list of chapter triggers documented somewhere? 2. If you failed to update your respawn location in that fireball room in 1:37:50, and fell to the water, will it respawn you somewhere further along that room quicker? 3. If you didn't open the key chest after the palace skip, and immediately walked back out, you'll enter from below the stage since the room wasn't updated right? 4. After the credits, if you triggered an earlier chapter again, does the Palace of Shadows get relocked, or does the game have seperate flags for certain events? 5. Would it save any time to fail to update respawn location, then jump to the spikes at the Palace of Shadows?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
warmCabin wrote:
Alright, I have to ask. What happens at 5:50 in the encode, there? You brush against the wall when going into Professor Frankly's area. Same thing at 16:54
Just rechecked the video; in case anyone wonders: 1. 5:50 against the wall is BEFORE the room with fence clip, so it's not that. 2. 16:54 is just before entering Petalsburg, at the final jump. No idea what they do; probably should ask on youtube as well just in case?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Very nice work; so close to sub 2 hours as well. Is it possible to enter chapter 2 early by using Goombella buffer + that paper mode item jump trick?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Alright, thanks. Any suggestions on how to debug gameboy color games, outside simulating the z80 entirely?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Just came back to this for a bit; apparently BizHawk 2.3.2 GamBatte desyncs different than the previous, so going to use the latest. I tried making a spreadsheet for the gnome toss, and noticed something while attempting: 1. Holding Up for different amounts of frames affects Ron 2. RNG (0x0E3E, WRAM) doesn't seem to change on Harry 3. Pretty positive even if the same RNG and frame was reached on Ron's turn, he might still use a different move. So it's likely a different address. 4. Right now, this is the current run: This has a total delay of 2592 frames. The most feasible way to affect Gnome toss RNG seems to be: a) Pausing at different times in gnome pull b) Doing different things in gnome pull c) Delaying pressing A at the last instruction menu for gnome toss.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Nice. That was amazing, especially the Skee-Ball Abuse and Slides/Kelp. 1. What just happened in the Annoy Squidward video? 2. Is there more information on DCB? Like is done compared to normal cruise boost? (Actually, what was the difference between the types of cruise boosts again, sorry forgot). 3. The animation skips are quite clever. Nice.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
This minigame drove me nuts when I was playing it, so this was nice to watch. Would you ever do max scores of other stages as well, and maybe max scores for characters? Edit: Given how there's only a finite amount of NPCs, would it make more sense not to grab some of the timers?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Alright, thanks. Is it normal that the tracelog outputs the same thing, when a WRAM value is frozen during a point where it's supposed to change? In this case, 0x5020 (WRAM) in Harry Potter: Chamber of Secrets (GBC) is responsible for MP. Freezing it vs not freezing it when it's supposed to decrement seems to give the same trace log when done on the frame it decrements. Is this normal?