22 de dezembro de 2020

Street Fighter 2 Champion Edition (MAME) - Training Mode

 


Deus abençoe a todos! Hoje eu quero mostrar pra vocês o Modo Treino em Street Fighter 2 Champion Edition, elaborado por Fernando M. Hack e Yacsha.
Este código foi elaborado de início em Super Street Fighter 2 Turbo por Poliva, e achamos excelente converter para esta versão de Street Fighter 2 para o MAME.
Deixarei abaixo o vídeo de demonstração e os códigos para o Modo Treino, espero que gostem!
Agradecimentos a J.F. Souza Yoz pelo espaço em divulgar os trabalhos!
Deus abençoe a todos!

De início iremos começar com os códigos de movimento do lutador, onde os parâmetros irão definir a sua movimentação, tanto no Player 1 quanto no Player 2. A seguir:

<cheat desc=" "/>
<cheat desc="SF2CE Training Mode"/> <comment>Based in POF SSF2 Training Mode and adapted for SF2CE by Yacsha and Fernando M. Hack</comment>
<cheat desc=" "/>

<cheat desc="Padlock P1 (Action)">
    <parameter>
      <item value="0x00">Neutral (Stand)</item>
      <item value="0x01">Left</item>
      <item value="0x02">Right</item>
      <item value="0x03">Left</item>
      <item value="0x04">Down</item>
      <item value="0x05">Down-Left</item>
      <item value="0x06">Down-Right</item>
      <item value="0x08">Up (Jump)</item>
      <item value="0x09">Up (Left)</item>
      <item value="0x0A">Up (Right)</item>
      <item value="0x0B">Up (Left)</item>
      <item value="0xFF">Up (Left) (Fierce Throw)</item>
      <item value="0xFE">Up (Right) (Fierce Throw)</item>
      <item value="0xFD">Up (Jump) (Fierce Throw)</item>
      <item value="0xFC">Down (Fierce Throw)</item>
      <item value="0xFB">Throw-Left (Fierce Throw)</item>
      <item value="0xFA">Throw-Right (Fierce Throw)</item>
      <item value="0xEF">Up (Left) (Fierce Kick)</item>
      <item value="0xEE">Up (Right) (Fierce Kick)</item>
      <item value="0xED">Up (Jump) (Fierce Kick)</item>
      <item value="0xEC">Down (Fierce Kick)</item>
      <item value="0xEB">Left (Fierce Kick)</item>
      <item value="0xEA">Right (Fierce Kick)</item>
    </parameter>
    <script state="on">
        <action>maincpu.mw@379F4=4E71</action>
        <action>maincpu.mw@20EA=4E71,maincpu.mw@20EC=4E71,maincpu.mw@20EE=4E71</action>
    </script>
    <script state="run">
        <action condition="param LT 0x0F">maincpu.pb@FF8651=param</action>
        <action>maincpu.mw@379F4=4E71</action>
        <action condition="param == 0xFF and frame % 2 == 0">maincpu.pw@FF8650=0009</action>
        <action condition="param == 0xFF and frame % 2 != 0">maincpu.pw@FF8650=0041</action>
        <action condition="param == 0xFE and frame % 2 == 0">maincpu.pw@FF8650=000A</action>
        <action condition="param == 0xFE and frame % 2 != 0">maincpu.pw@FF8650=0042</action>
        <action condition="param == 0xFD and frame % 2 == 0">maincpu.pw@FF8650=0008</action>
        <action condition="param == 0xFD and frame % 2 != 0">maincpu.pw@FF8650=0041</action>
        <action condition="param == 0xFC and frame % 2 == 0">maincpu.pw@FF8650=0004</action>
        <action condition="param == 0xFC and frame % 2 != 0">maincpu.pw@FF8650=0042</action>
        <action condition="param == 0xFB and frame % 2 == 0">maincpu.pw@FF8650=0001</action>
        <action condition="param == 0xFB and frame % 2 != 0">maincpu.pw@FF8650=0041</action>
        <action condition="param == 0xFA and frame % 2 == 0">maincpu.pw@FF8650=0002</action>
        <action condition="param == 0xFA and frame % 2 != 0">maincpu.pw@FF8650=0042</action>
        <action condition="param == 0xEF and frame % 2 == 0">maincpu.pw@FF8650=0009</action>
        <action condition="param == 0xEF and frame % 2 != 0">maincpu.pw@FF8650=0409</action>
        <action condition="param == 0xEE and frame % 2 == 0">maincpu.pw@FF8650=000A</action>
        <action condition="param == 0xEE and frame % 2 != 0">maincpu.pw@FF8650=040A</action>
        <action condition="param == 0xED and frame % 2 == 0">maincpu.pw@FF8650=0008</action>
        <action condition="param == 0xED and frame % 2 != 0">maincpu.pw@FF8650=0408</action>
        <action condition="param == 0xEC and frame % 2 == 0">maincpu.pw@FF8650=0004</action>
        <action condition="param == 0xEC and frame % 2 != 0">maincpu.pw@FF8650=0404</action>
        <action condition="param == 0xEB and frame % 2 == 0">maincpu.pw@FF8650=0001</action>
        <action condition="param == 0xEB and frame % 2 != 0">maincpu.pw@FF8650=0401</action>
        <action condition="param == 0xEA and frame % 2 == 0">maincpu.pw@FF8650=0002</action>
        <action condition="param == 0xEA and frame % 2 != 0">maincpu.pw@FF8650=0402</action>
    </script>
    <script state="off">
        <action>maincpu.pw@FF8650=0</action>
        <action>maincpu.mw@379F4=6710</action>
        <action>maincpu.mw@20EA=3BD6,maincpu.mw@20EC=007A,maincpu.mw@20EE=0650</action>
    </script>
  </cheat>

<cheat desc="Padlock P2 (Action)">
    <parameter>
      <item value="0x00">Neutral (Stand)</item>
      <item value="0x01">Left</item>
      <item value="0x02">Right</item>
      <item value="0x03">Left</item>
      <item value="0x04">Down</item>
      <item value="0x05">Down-Left</item>
      <item value="0x06">Down-Right</item>
      <item value="0x08">Up (Jump)</item>
      <item value="0x09">Up (Left)</item>
      <item value="0x0A">Up (Right)</item>
      <item value="0x0B">Up (Left)</item>
      <item value="0xFF">Up (Left) (Fierce Throw)</item>
      <item value="0xFE">Up (Right) (Fierce Throw)</item>
      <item value="0xFD">Up (Jump) (Fierce Throw)</item>
      <item value="0xFC">Down (Fierce Throw)</item>
      <item value="0xFB">Throw-Left (Fierce Throw)</item>
      <item value="0xFA">Throw-Right (Fierce Throw)</item>
      <item value="0xEF">Up (Left) (Fierce Kick)</item>
      <item value="0xEE">Up (Right) (Fierce Kick)</item>
      <item value="0xED">Up (Jump) (Fierce Kick)</item>
      <item value="0xEC">Down (Fierce Kick)</item>
      <item value="0xEB">Left (Fierce Kick)</item>
      <item value="0xEA">Right (Fierce Kick)</item>
    </parameter>
    <script state="on">
        <action>maincpu.mw@379F4=4E71</action>
        <action>maincpu.mw@20F0=4E71,maincpu.mw@20F2=4E71,maincpu.mw@20F4=4E71</action>
    </script>
    <script state="run">
        <action condition="param LT 0x0F">maincpu.pb@FF8951=param</action>
        <action>maincpu.mw@379F4=4E71</action>
        <action condition="param == 0xFF and frame % 2 == 0">maincpu.pw@FF8950=0009</action>
        <action condition="param == 0xFF and frame % 2 != 0">maincpu.pw@FF8950=0041</action>
        <action condition="param == 0xFE and frame % 2 == 0">maincpu.pw@FF8950=000A</action>
        <action condition="param == 0xFE and frame % 2 != 0">maincpu.pw@FF8950=0042</action>
        <action condition="param == 0xFD and frame % 2 == 0">maincpu.pw@FF8950=0008</action>
        <action condition="param == 0xFD and frame % 2 != 0">maincpu.pw@FF8950=0041</action>
        <action condition="param == 0xFC and frame % 2 == 0">maincpu.pw@FF8950=0004</action>
        <action condition="param == 0xFC and frame % 2 != 0">maincpu.pw@FF8950=0042</action>
        <action condition="param == 0xFB and frame % 2 == 0">maincpu.pw@FF8950=0001</action>
        <action condition="param == 0xFB and frame % 2 != 0">maincpu.pw@FF8950=0041</action>
        <action condition="param == 0xFA and frame % 2 == 0">maincpu.pw@FF8950=0002</action>
        <action condition="param == 0xFA and frame % 2 != 0">maincpu.pw@FF8950=0042</action>
        <action condition="param == 0xEF and frame % 2 == 0">maincpu.pw@FF8950=0009</action>
        <action condition="param == 0xEF and frame % 2 != 0">maincpu.pw@FF8950=0409</action>
        <action condition="param == 0xEE and frame % 2 == 0">maincpu.pw@FF8950=000A</action>
        <action condition="param == 0xEE and frame % 2 != 0">maincpu.pw@FF8950=040A</action>
        <action condition="param == 0xED and frame % 2 == 0">maincpu.pw@FF8950=0008</action>
        <action condition="param == 0xED and frame % 2 != 0">maincpu.pw@FF8950=0408</action>
        <action condition="param == 0xEC and frame % 2 == 0">maincpu.pw@FF8950=0004</action>
        <action condition="param == 0xEC and frame % 2 != 0">maincpu.pw@FF8950=0404</action>
        <action condition="param == 0xEB and frame % 2 == 0">maincpu.pw@FF8950=0001</action>
        <action condition="param == 0xEB and frame % 2 != 0">maincpu.pw@FF8950=0401</action>
        <action condition="param == 0xEA and frame % 2 == 0">maincpu.pw@FF8950=0002</action>
        <action condition="param == 0xEA and frame % 2 != 0">maincpu.pw@FF8950=0402</action>
    </script>
    <script state="off">
        <action>maincpu.pw@FF8950=0</action>
        <action>maincpu.mw@379F4=6710</action>
  <action>maincpu.mw@20F0=3BD6,maincpu.mw@20F2=007E,maincpu.mw@20F4=0950</action>
    </script>
  </cheat>

A seguir temos os códigos de recarga de energia, na perda de 40% a energia retorna ao seu estado original. A seguir:

<cheat desc="HUD Recharge PL1">
    <script state="run">
      <!-- Infinite Time -->
      <action condition="maincpu.rb@FF8AC2 == 0"> <!--prevent hang on bonus stages-->
        maincpu.pw@FF8ABE=9928 <!--round time-->
      </action>
      <action>maincpu.pw@FFDDA2=203C</action> <!--char select time-->
      <!-- PL1 Dizzy Status -->
      <action>maincpu.pw@FF841A=00</action> <!--Timeout, no Dizzy-->
      <action>maincpu.pw@FF841C=00</action> <!--Damage, no Dizzy-->
      <!-- Timers -->
      <action condition="(maincpu.rw@FF83E8 lt A and maincpu.rb@FF83C1==14 or maincpu.rb@FF83C1==3)">maincpu.pw@FF83E8=90, maincpu.pw@FF857A=90</action>
      <action condition="(maincpu.rw@FF83E8 gt 90 or maincpu.rw@FF857A gt 90 or maincpu.rw@FF857A==1)">maincpu.pw@FF83E8=90, maincpu.pw@FF857A=90</action>
      <action condition="maincpu.rw@FF83E8 lt 60 and (maincpu.rb@FF83C1 band 10) == 00 and maincpu.rb@FF89D4 == 0">
        maincpu.pw@FF83E8=90, maincpu.pw@FF857A=90
      </action>
      <action condition="maincpu.rb@FF83E8 != FF and maincpu.rb@FF86E8 != FF"> <!-- allow KO slowdown -->
        maincpu.pb@FF82E2=00
      </action>
    </script>
  </cheat>

<cheat desc="HUD Recharge PL2">
    <script state="run">
      <!-- Infinite Time -->
      <action condition="maincpu.rb@FF8AC2 == 0"> <!--prevent hang on bonus stages-->
        maincpu.pw@FF8ABE=9928 <!--round time-->
      </action>
      <action>maincpu.pw@FFDDA2=203C</action> <!--char select time-->
      <!-- PL2 Dizzy Status -->
      <action>maincpu.pw@FF871A=00</action> <!--Timeout, no Dizzy-->
      <action>maincpu.pw@FF871C=00</action> <!--Damage, no Dizzy-->
      <!-- Timers -->
      <action condition="(maincpu.rw@FF86E8 lt A and maincpu.rb@FF86C1==14 or maincpu.rb@FF86C1==3)">maincpu.pw@FF86E8=90, maincpu.pw@FF887A=90</action>
      <action condition="(maincpu.rw@FF86E8 gt 90 or maincpu.rw@FF887A gt 90 or maincpu.rw@FF887A==1)">maincpu.pw@FF86E8=90, maincpu.pw@FF887A=90</action>
      <action condition="maincpu.rw@FF86E8 lt 60 and (maincpu.rb@FF86C1 band 10) == 00 and maincpu.rb@FF89D4 == 0">
        maincpu.pw@FF86E8=90, maincpu.pw@FF887A=90
      </action>
      <action condition="maincpu.rb@FF83E8 != FF and maincpu.rb@FF86E8 != FF"> <!-- allow KO slowdown -->
        maincpu.pb@FF82E2=00
      </action>
    </script>
  </cheat>




A seguir temos o código para desativar o enunciado do round se assim o usuário preferir. A seguir:

<cheat desc="No Round Announce">
    <script state="run">
      <action>maincpu.rw@007A88=4E71</action>
    </script>
    <script state="off">
      <action>maincpu.rw@007A88=4EB9</action>
    </script>
   </cheat>

A seguir temos o código para ativar o movimento do lutador durante o enunciado do round, se o usuário preferir. A seguir:

<cheat desc="Move Round Announce">
    <script state="run">     
      <action>maincpu.pb@FF82E3=00</action>
    </script>
   </cheat>


A Seguir temos um código muito bacana: Seleção de Estágio, onde eu programei para lutar nas telas de bônus com função de luta normal, e para lutar nas telas extras, selecione um lutador no Player 2 com o código cheat. A seguir:

<cheat desc="Select Background"> <comment>VS Stages Activate with Both Players</comment> 
    <parameter>
      <item value="0x00">Ryu</item>
      <item value="0x01">E.Honda</item>
      <item value="0x02">Blanka</item>
      <item value="0x03">Guile</item>
      <item value="0x04">Ken</item>
      <item value="0x05">Chun Li</item>
      <item value="0x06">Zangief</item>
      <item value="0x07">Dhalsim</item>
      <item value="0x08">Dictator/M.Bison</item>
      <item value="0x09">Sagat</item>
      <item value="0x0A">Boxer/Balrog</item>
      <item value="0x0B">Claw/Vega</item>
      <item value="0x0C">Car Stage (VS)</item>
      <item value="0x0D">Barrels Stage (VS)</item>
      <item value="0x0E">Drums Stage (VS)</item>
      <item value="0x0F">Claw Unused Stage (VS)</item>
      <item value="0x0300">Car Bonus Stage</item>
      <item value="0x0601">Barrels Bonus Stage</item>
      <item value="0x0902">Drums Bonus Stage</item>
    </parameter>
   <script state="on">
      <action>temp0=0240E8</action>
    </script>
   <script state="run">
      <action condition="param==0">maincpu.md@temp0=303C0000+57</action>
      <action condition="param==1">maincpu.md@temp0=303C0000+57</action>
      <action condition="param==2">maincpu.md@temp0=303C0000+58</action>
      <action condition="param==3">maincpu.md@temp0=303C0000+59</action>
      <action condition="param==4">maincpu.md@temp0=303C0000+59</action>
      <action condition="param==5">maincpu.md@temp0=303C0000+5A</action>
      <action condition="param==6">maincpu.md@temp0=303C0000+5B</action>
      <action condition="param==7">maincpu.md@temp0=303C0000+5C</action>
      <action condition="param==8">maincpu.md@temp0=303C0000+5E</action>
      <action condition="param==9">maincpu.md@temp0=303C0000+5E</action>
      <action condition="param==A">maincpu.md@temp0=303C0000+59</action>
      <action condition="param==B">maincpu.md@temp0=303C0000+5D</action>
      <action condition="param==C">maincpu.md@temp0=303C0000+4F, maincpu.mw@02E3CE=000D, maincpu.pb@FF8061=C0</action>
      <action condition="param==D">maincpu.md@temp0=303C0000+4F, maincpu.mw@02E3D0=000D, maincpu.pb@FF8061=C0</action>
      <action condition="param==E">maincpu.md@temp0=303C0000+4F, maincpu.mw@02E3D2=000D, maincpu.pb@FF8061=C0</action>
      <action condition="param==F">maincpu.mw@0063DC=0082, maincpu.mw@02E3D4=0082, maincpu.md@temp0=303C0000+4A, maincpu.pb@FF8061=C0</action>
      <action condition="param==300">maincpu.pw@FF89C1=param/100, maincpu.pw@FF89ED=300</action>
      <action condition="param==601">maincpu.pw@FF89C1=param/100, maincpu.pw@FF89ED=601</action>
      <action condition="param==902">maincpu.pw@FF89C1=param/100, maincpu.pw@FF89ED=902</action>
      <action>maincpu.pw@FFDD5E=param, maincpu.pw@FFDD60=param, maincpu.pw@FFDD62=param, maincpu.pw@FFDD64=param</action>
      <action>maincpu.pw@FFDD66=param, maincpu.pw@FFDD68=param, maincpu.pw@FFDD6A=param, maincpu.pw@FFDD6C=param</action>
      <action>maincpu.pw@FFDD6E=param, maincpu.pw@FFDD70=param, maincpu.pw@FFDD72=param, maincpu.pw@FFDD74=param</action>
      <action>maincpu.mb@02B929=63</action>
      <action>maincpu.mb@02B92F=99</action>
      </script>
    <script state="off">
      <action>maincpu.mw@0063DC=4EB8</action>
      <action>maincpu.mw@02E3CE=4EF8</action>
      <action>maincpu.mw@02E3D0=2A0C</action>
      <action>maincpu.mw@02E3D2=0004</action>
      <action>maincpu.mw@02E3D4=0000</action>
      <action>maincpu.mb@02B929=14</action>
      <action>maincpu.mb@02B92F=20</action>
      <action>maincpu.md@temp0=30300000</action>
    </script>
  </cheat>


A seguir temos estes códigos já existentes no MAME, para endereçar um lutador nos dois players. A seguir:

<cheat desc="Select Character PL1"> <comment>Free player selection. Use on the level VS screen.</comment>
    <parameter>
      <item value="0x00">Ryu</item>
      <item value="0x01">E. Honda</item>
      <item value="0x02">Blanka</item>
      <item value="0x03">Guile</item>
      <item value="0x04">Ken</item>
      <item value="0x05">Chun Li</item>
      <item value="0x06">Zangief</item>
      <item value="0x07">Dhalsim</item>
      <item value="0x08">M. Bison</item>
      <item value="0x09">Sagat</item>
      <item value="0x0A">Balrog</item>
      <item value="0x0B">Vega</item>
    </parameter>
    <script state="run">
      <action>maincpu.pb@FF864F=param</action>
    </script>
  </cheat>

<cheat desc="Select Character PL2"> <comment>Free player selection. Use on the level VS screen.</comment>
    <parameter>
      <item value="0x00">Ryu</item>
      <item value="0x01">E. Honda</item>
      <item value="0x02">Blanka</item>
      <item value="0x03">Guile</item>
      <item value="0x04">Ken</item>
      <item value="0x05">Chun Li</item>
      <item value="0x06">Zangief</item>
      <item value="0x07">Dhalsim</item>
      <item value="0x08">M. Bison</item>
      <item value="0x09">Sagat</item>
      <item value="0x0A">Balrog</item>
      <item value="0x0B">Vega</item>
    </parameter>
    <script state="run">
      <action>maincpu.pb@FF894F=param</action>
    </script>
  </cheat>

A seguir temos códigos também já existentes no MAME, para escolher as cores alternativas. A seguir:

<cheat desc="P1 Select Alternate Outfit">
      <script state="run">
         <action>maincpu.pb@FF8672=01</action>
      </script>
   </cheat>

<cheat desc="P2 Select Alternate Outfit">
      <script state="run">
         <action>maincpu.pb@FF8972=01</action>
      </script>
   </cheat>

<cheat desc=" "/>


Espero que tenham gostado e aguardo o feedback de todos! 
Deus abençoe e boa jogatina!
Fernando M. Hack










4 comentários:

  1. Passei deslizando a tela. Pensei que o navegador tinha dado bug! :) É praticamente uma desconstrução de Street Fighter no sentido mais puro do termo. Muito bom.

    ResponderExcluir
    Respostas
    1. Este comentário foi removido pelo autor.

      Excluir
    2. Bom dia amigo! Feliz Natal pra você e sua família! Eu sou muito fã de Street e sempre quis descobrir coisas escondidas, principalmente lutar nas telas de bônus! Agradeço a você pelo apoio e a Yoz pelo espaço! Tenho ainda muitas coisas para postar, acompanhe aqui o Blog! Deus te abençoe!

      Excluir
  2. Cara, que legal. Eu nunca me aventurei por códigos de emuladores e plataformas de jogos no geral, mas ver que dá pra sair configurando tudo usando XML no MAME é algo que me dá até uma certa vontade de brincar algum dia! hahaha
    Muito bacana o post!

    ResponderExcluir