My apologies for upping an old thread.
The timer starts at the first input, correct?
If so, waiting at the title screen for demo B to start and end might save a few frames. The B-TYPE will be pre-selected.
You can execute code from WRAM and ECHO in TCG 2 with Zapdos. I have no idea if this can be exploited since I didn't do more tests / didn't take the time to disassemble to see exactly what happens.
https://www.youtube.com/watch?v=9B8Z_YoMkcQ
Lv 40 Gengar (Power of Darkness) lets you do something similar to Zapdos if you reset after resolving its Pokémon Power on the last CPU's Pokémon. If you use a card that requires your opponent to do a choice after that, it sometimes lets you control BOTH players' turns (you and the CPU).
https://www.pixenli.com/index.php?phppage=voir_galerie&id=1376752251032461000
The only case I knew this was possible was walking through the customers in Celadon department store.
If there's a way to go through the guard, how much time would that save from glitchless ?
I think 1) is the best option, once the Stadium GB emu is supported.
And set up the save file for a warp to credits obviously rather than unlocking Mewtwo
I've done some work on Pokémon Stadium 1 (a basic editor / randomizer is available here ), and I'm currently working on how to import modified 3d models back into the game. I'm not gonna lie, this is going to take a while.
I haven't worked that much on Stadium 2, on the other hand.
Welp, guessed so.
About your question in the GCL thread, I'm pretty sure the issue is the green error message that pops up anytime you disconnect the Transfer Pack / the cartridge anywhere in Pokémon Stadium.
The only way I know to circumvent this screen is to disconnect the cartridge / the Transfer Pack while saving the GB game at most frames in the GB emulator, which hangs the saving process, asks you to replug the cartridge so the save can be completed. I'm pretty sure it checks the cartridge header at that moment to prevent you from putting a non-Pokémon game, and the save checksum so you do not swap Pokémon cartridges during a save.
iirc it's at least once per second, probably much more.
It does this in every part of the game, even in battles (causing you to lose progress if Transfer Pack disconnection happens in the middle of a Cup).
Pokémon Stadium should fail, the game checks regularly if the transfer pack + game inserted are connected / have been connected / have been disconnected.
I'll try a setup tonight on French Stadium with 7EME ETAGE when I get back home.
Saying VBA is a little iffy for DMG and GBC is more than an understatement. VBA is utter crap.
VBA is so bad that it causes random softlocks / crashes in a few specific games (Dark Duel Stories for example, randomly softlocks after a duel due to a memory timing error, which also randomly causes card ID 0x00 Blue-Eyes White D. to drop from every opponent).
It also loads the wrong opponent's data from time to time in a GBA game, Reshef of Destruction (confirmed by several people).
(and the emulator you're thinking of is BGB, not GBG :P )
Good job!
It might be too late, but have you checked this ? This is a work in progress, but things like the PRNG are documented in it.
Under very few circumstances, Psychic animation is shortened by a few frames. I'm not sure what causes this, though.
In Pokémon Stadium, recoil is skipped when you KO a Pokémon with a recoil move. So no time is lost as long as you get the OHKO.
Also, if for any reason you can't OHKO something / cannot use an OHKO move, could Metronome could come in handy to grab Fissure / Guillotine / Horn Drill ?
If you need extra exp on one character, suicide is faster than having a Yan snorting them.
Nevertheless, here's the script; Yan use Snort as a counter 25% of the time.
From Hades Workshop (edited the variable values to actual attacks and statuses):
Function Yan_Counter
if ( #Matching(SV_FunctionEnemy[STATUS_CURRENT_B], MINI) ) {
set SV_FunctionEnemy[56] =$ 1
set SV_FunctionEnemy[MODEL_SIZE] =$ 4096
} else {
set SV_FunctionEnemy[56] =$ 1
set SV_FunctionEnemy[MODEL_SIZE] =$ 8192
}
if ( ( GetAttackCommandId == SKILL ) && ( GetAttackId == WHAT'S THAT!? ) ) {
return
}
// 25% Snort
if ( !( GetRandom & 3 ) ) {
if ( ( #NotMatching(SV_PlayerTeam[STATUS_CURRENT_A], PETRIFY | VENOM | DEATH | STOP) ) <= 1 ) {
return
}
set #( SV_Target = Matching(SV_PlayerTeam[STATUS_CURRENT_B], DOOM) )
set #( SV_Target |= Matching(SV_PlayerTeam[STATUS_CURRENT_B], GRADUAL PETRIFY) )
set #( SV_Target |= Matching(SV_PlayerTeam[STATUS_CURRENT_A], POISON) )
set #( SV_Target |= Matching(SV_PlayerTeam[STATUS_CURRENT_A], VENOM) )
set #( SV_Target |= ( ( Matching(SV_PlayerTeam[STATUS_CURRENT_A], REGEN) | Matching(SV_PlayerTeam[STATUS_AUTO_A], REGEN) ) & Matching(SV_PlayerTeam[STATUS_CURRENT_A], ZOMBIE) ) )
if ( #SV_Target ) {
return
}
set #( SV_Target = GetAttacker )
Attack( SNORT )
return
}
// 75% Aera or Float
set #( SV_Target = GetAttacker )
if ( #SV_Target ) {
// If attaker has Float status, counter with Aera
if ( #Matching(SV_Target[STATUS_CURRENT_A], FLOAT) ) {
Attack( AERA )
// Else, cast Float
} else {
Attack( FLOAT )
}
}
return
Pour le RNG, il y a en général une méthode propre et une méthode sale:
• Méthode propre qui demande de connaître un peu d'assembleur: admettons qu'un jeu ait des coups critiques. On va d'abord chercher dans la RAM la valeur qui correspond aux dégâts infligés et on met un breakpoint en écriture dessus, on cherche également la stat d'attaque et on met un breakpoint en lecture dessus. La prochaine fois que l'on attaquera, le breakpoint en lecture se déclenchera, et on pourra regarder la formule de dégâts. Si l'attaque est un critique, on peut directement run jusqu'au breakpoint en écriture des dégâts, on tombera souvent sur un appel au PRNG un peu avant que les dégâts doublés ne soient écrits dans la RAM. Il n'y a plus qu'à regarder quelle valeur est lue plus réécrite dans la RAM.
• Méthode sale, par brute force: le RNG de BOF3 est time-based apparement, il change tout le temps. Cherche juste une valeur qui change sans cesse lorsque tu es dans un écran fixe où rien ne se passe, de nombreuses fois jusqu'à ce que tu n'aies plus qu'une petite liste d'adresses RAM.
Je te conseille d'apprendre le MIPS (au moins suffisament pour te dépatouiller avec), et d'utiliser un émulateur avec un bon debugger pour tes recherches (qui sera probablement différent de l'émulateur que tu utilises pour le TAS).