Registrarse

[RH - ASM] ASM y Hex

MagallanoX

Pequeño Saltamontes
Hola todos,
Quisiera preguntarle a alguien si me pudieran asistir en mejor entender ambos el Hex y ASM. Yo tengo experiencia en desarrollo, pero no entiendo como es que hay gente que puedan entender tan bien lo que hace cada bandera o variables en Hexadecimal.
Busco querer saber como entender el ASM tan bien que yo solo pueda quitar la introducción de cualquier juego ROM o pueda hacer otro rival sin pasar trabajo.
Creo yo que necesito entender mas el sujeto, pero como que todos los tutoriales están bastante basico. No hay nada que he encontrado que sea concreto.
Ejemplo: Busco un tutorial bien avanzado para comprender por ejemplo, como o donde guardar el variable que hace que el rival escoja el Pokemon que sea mas fuerte que el que hayas escogido de cero.

Gracias.
 

Jaizu

Decomp user
Tu ejemplo no es ni HEX ni ASM
Cuando escoges tu primer pokémon hay 3 opciones, uno por cada starter.
Según el starter que hayas escogido le asignas un valor a una variable (0, 1 o 2). Y cuando el rival pelea contra ti carga un trainerbattle u otro según esa variable.
 

MagallanoX

Pequeño Saltamontes
Tu ejemplo no es ni HEX ni ASM
Cuando escoges tu primer pokémon hay 3 opciones, uno por cada starter.
Según el starter que hayas escogido le asignas un valor a una variable (0, 1 o 2). Y cuando el rival pelea contra ti carga un trainerbattle u otro según esa variable.
Segun lo que me dices, si no es ni HEX ni ASM.
¿Entonces a donde se localiza esa variable que deja el ordenador hacer la decision?
Tiene que estar en memoria en forma de un numero, porque si no, es imposible que sea un factor calculable.
 

Jaizu

Decomp user
Segun lo que me dices, si no es ni HEX ni ASM.
¿Entonces a donde se localiza esa variable que deja el ordenador hacer la decision?
Tiene que estar en memoria en forma de un numero, porque si no, es imposible que sea un factor calculable.
Eso se hacen en eventos, que sí, se convierte a HEX, pero no se hace con HEX, se hacen con comandos.
Las variables y flags, entre otras muchas cosas, se guardan en el .sav. Según tengo entendido tiene dos bloques, saveblock 1 y 2
En el saveblock están las flags y variables, sacándolo de decomp, te muestro la struct:
Código:
struct SaveBlock1
{
    /*0x00*/ struct Coords16 pos;
    /*0x04*/ struct WarpData location;
    /*0x0C*/ struct WarpData continueGameWarp;
    /*0x14*/ struct WarpData dynamicWarp;
    /*0x1C*/ struct WarpData lastHealLocation; // used by white-out and teleport
    /*0x24*/ struct WarpData escapeWarp; // used by Dig and Escape Rope
    /*0x2C*/ u16 savedMusic;
    /*0x2E*/ u8 weather;
    /*0x2F*/ u8 weatherCycleStage;
    /*0x30*/ u8 flashLevel;
    /*0x32*/ u16 mapLayoutId;
    /*0x34*/ u16 mapView[0x100];
    /*0x234*/ u8 playerPartyCount;
    /*0x238*/ struct Pokemon playerParty[PARTY_SIZE];
    /*0x490*/ u32 money;
    /*0x494*/ u16 coins;
    /*0x496*/ u16 registeredItem; // registered for use with SELECT button
    /*0x498*/ struct ItemSlot pcItems[PC_ITEMS_COUNT];
    /*0x560*/ struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT];
    /*0x5D8*/ struct ItemSlot bagPocket_KeyItems[BAG_KEYITEMS_COUNT];
    /*0x650*/ struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT];
    /*0x690*/ struct ItemSlot bagPocket_TMHM[BAG_TMHM_COUNT];
    /*0x790*/ struct ItemSlot bagPocket_Berries[BAG_BERRIES_COUNT];
    /*0x848*/ struct Pokeblock pokeblocks[POKEBLOCKS_COUNT];
    /*0x988*/ u8 seen1[DEX_FLAGS_NO];
    /*0x9BC*/ u16 berryBlenderRecords[3];
    /*0x9C2*/ u8 field_9C2[6];
    /*0x9C8*/ u16 trainerRematchStepCounter;
    /*0x9CA*/ u8 trainerRematches[MAX_REMATCH_ENTRIES];
    /*0xA30*/ struct ObjectEvent objectEvents[OBJECT_EVENTS_COUNT];
    /*0xC70*/ struct ObjectEventTemplate objectEventTemplates[OBJECT_EVENT_TEMPLATES_COUNT];
    /*0x1270*/ u8 flags[FLAGS_COUNT];
    /*0x139C*/ u16 vars[VARS_COUNT];
    /*0x159C*/ u32 gameStats[NUM_GAME_STATS];
    /*0x169C*/ struct BerryTree berryTrees[BERRY_TREES_COUNT];
    /*0x1A9C*/ struct SecretBase secretBases[SECRET_BASES_COUNT];
    /*0x271C*/ u8 playerRoomDecorations[DECOR_MAX_PLAYERS_HOUSE];
    /*0x2728*/ u8 playerRoomDecorationPositions[DECOR_MAX_PLAYERS_HOUSE];
    /*0x2734*/ u8 decorationDesks[10];
    /*0x273E*/ u8 decorationChairs[10];
    /*0x2748*/ u8 decorationPlants[10];
    /*0x2752*/ u8 decorationOrnaments[30];
    /*0x2770*/ u8 decorationMats[30];
    /*0x278E*/ u8 decorationPosters[10];
    /*0x2798*/ u8 decorationDolls[40];
    /*0x27C0*/ u8 decorationCushions[10];
    /*0x27CA*/ u8 padding_27CA[2];
    /*0x27CC*/ TVShow tvShows[TV_SHOWS_COUNT];
    /*0x2B50*/ PokeNews pokeNews[POKE_NEWS_COUNT];
    /*0x2B90*/ u16 outbreakPokemonSpecies;
    /*0x2B92*/ u8 outbreakLocationMapNum;
    /*0x2B93*/ u8 outbreakLocationMapGroup;
    /*0x2B94*/ u8 outbreakPokemonLevel;
    /*0x2B95*/ u8 outbreakUnk1;
    /*0x2B96*/ u16 outbreakUnk2;
    /*0x2B98*/ u16 outbreakPokemonMoves[MAX_MON_MOVES];
    /*0x2BA0*/ u8 outbreakUnk4;
    /*0x2BA1*/ u8 outbreakPokemonProbability;
    /*0x2BA2*/ u16 outbreakDaysLeft;
    /*0x2BA4*/ struct GabbyAndTyData gabbyAndTyData;
    /*0x2BB0*/ u16 easyChatProfile[EASY_CHAT_BATTLE_WORDS_COUNT];
    /*0x2BBC*/ u16 easyChatBattleStart[EASY_CHAT_BATTLE_WORDS_COUNT];
    /*0x2BC8*/ u16 easyChatBattleWon[EASY_CHAT_BATTLE_WORDS_COUNT];
    /*0x2BD4*/ u16 easyChatBattleLost[EASY_CHAT_BATTLE_WORDS_COUNT];
    /*0x2BE0*/ struct MailStruct mail[MAIL_COUNT];
    /*0x2E20*/ u8 additionalPhrases[8]; // bitfield for 33 additional phrases in easy chat system
    /*0x2E28*/ OldMan oldMan;
    /*0x2e64*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff
    /*0x2e90*/ struct ContestWinner contestWinners[13]; // 0 - 5 used in contest hall, 6 - 7 unused?, 8 - 12 museum
    /*0x3030*/ struct DayCare daycare;
    /*0x3150*/ struct LinkBattleRecords linkBattleRecords;
    /*0x31A8*/ u8 giftRibbons[52];
    /*0x31DC*/ struct Roamer roamer;
    /*0x31F8*/ struct EnigmaBerry enigmaBerry;
    /*0x322C*/ struct MEventBuffers unk_322C;
    /*0x3598*/ u8 field_3598[0x180];
    /*0x3718*/ u32 trainerHillTimes[4];
    /*0x3728*/ struct RamScript ramScript;
    /*0x3B14*/ struct RecordMixingGift recordMixingGift;
    /*0x3B24*/ u8 seen2[DEX_FLAGS_NO];
    /*0x3B58*/ LilycoveLady lilycoveLady;
    /*0x3B98*/ struct TrainerNameRecord trainerNameRecords[20];
    /*0x3C88*/ u8 unk3C88[10][21];
    /*0x3D5A*/ u8 filler3D5A[0xA];
    /*0x3D64*/ struct SaveTrainerHill trainerHill;
    /*0x3D70*/ struct WaldaPhrase waldaPhrase;
    // sizeof: 0x3D88
};
 

MagallanoX

Pequeño Saltamontes
Eso se hacen en eventos, que sí, se convierte a HEX, pero no se hace con HEX, se hacen con comandos.
Las variables y flags, entre otras muchas cosas, se guardan en el .sav. Según tengo entendido tiene dos bloques, saveblock 1 y 2
En el saveblock están las flags y variables, sacándolo de decomp, te muestro la struct:
Código:
struct SaveBlock1
{
    /*0x00*/ struct Coords16 pos;
    /*0x04*/ struct WarpData location;
    /*0x0C*/ struct WarpData continueGameWarp;
    /*0x14*/ struct WarpData dynamicWarp;
    /*0x1C*/ struct WarpData lastHealLocation; // used by white-out and teleport
    /*0x24*/ struct WarpData escapeWarp; // used by Dig and Escape Rope
    /*0x2C*/ u16 savedMusic;
    /*0x2E*/ u8 weather;
    /*0x2F*/ u8 weatherCycleStage;
    /*0x30*/ u8 flashLevel;
    /*0x32*/ u16 mapLayoutId;
    /*0x34*/ u16 mapView[0x100];
    /*0x234*/ u8 playerPartyCount;
    /*0x238*/ struct Pokemon playerParty[PARTY_SIZE];
    /*0x490*/ u32 money;
    /*0x494*/ u16 coins;
    /*0x496*/ u16 registeredItem; // registered for use with SELECT button
    /*0x498*/ struct ItemSlot pcItems[PC_ITEMS_COUNT];
    /*0x560*/ struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT];
    /*0x5D8*/ struct ItemSlot bagPocket_KeyItems[BAG_KEYITEMS_COUNT];
    /*0x650*/ struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT];
    /*0x690*/ struct ItemSlot bagPocket_TMHM[BAG_TMHM_COUNT];
    /*0x790*/ struct ItemSlot bagPocket_Berries[BAG_BERRIES_COUNT];
    /*0x848*/ struct Pokeblock pokeblocks[POKEBLOCKS_COUNT];
    /*0x988*/ u8 seen1[DEX_FLAGS_NO];
    /*0x9BC*/ u16 berryBlenderRecords[3];
    /*0x9C2*/ u8 field_9C2[6];
    /*0x9C8*/ u16 trainerRematchStepCounter;
    /*0x9CA*/ u8 trainerRematches[MAX_REMATCH_ENTRIES];
    /*0xA30*/ struct ObjectEvent objectEvents[OBJECT_EVENTS_COUNT];
    /*0xC70*/ struct ObjectEventTemplate objectEventTemplates[OBJECT_EVENT_TEMPLATES_COUNT];
    /*0x1270*/ u8 flags[FLAGS_COUNT];
    /*0x139C*/ u16 vars[VARS_COUNT];
    /*0x159C*/ u32 gameStats[NUM_GAME_STATS];
    /*0x169C*/ struct BerryTree berryTrees[BERRY_TREES_COUNT];
    /*0x1A9C*/ struct SecretBase secretBases[SECRET_BASES_COUNT];
    /*0x271C*/ u8 playerRoomDecorations[DECOR_MAX_PLAYERS_HOUSE];
    /*0x2728*/ u8 playerRoomDecorationPositions[DECOR_MAX_PLAYERS_HOUSE];
    /*0x2734*/ u8 decorationDesks[10];
    /*0x273E*/ u8 decorationChairs[10];
    /*0x2748*/ u8 decorationPlants[10];
    /*0x2752*/ u8 decorationOrnaments[30];
    /*0x2770*/ u8 decorationMats[30];
    /*0x278E*/ u8 decorationPosters[10];
    /*0x2798*/ u8 decorationDolls[40];
    /*0x27C0*/ u8 decorationCushions[10];
    /*0x27CA*/ u8 padding_27CA[2];
    /*0x27CC*/ TVShow tvShows[TV_SHOWS_COUNT];
    /*0x2B50*/ PokeNews pokeNews[POKE_NEWS_COUNT];
    /*0x2B90*/ u16 outbreakPokemonSpecies;
    /*0x2B92*/ u8 outbreakLocationMapNum;
    /*0x2B93*/ u8 outbreakLocationMapGroup;
    /*0x2B94*/ u8 outbreakPokemonLevel;
    /*0x2B95*/ u8 outbreakUnk1;
    /*0x2B96*/ u16 outbreakUnk2;
    /*0x2B98*/ u16 outbreakPokemonMoves[MAX_MON_MOVES];
    /*0x2BA0*/ u8 outbreakUnk4;
    /*0x2BA1*/ u8 outbreakPokemonProbability;
    /*0x2BA2*/ u16 outbreakDaysLeft;
    /*0x2BA4*/ struct GabbyAndTyData gabbyAndTyData;
    /*0x2BB0*/ u16 easyChatProfile[EASY_CHAT_BATTLE_WORDS_COUNT];
    /*0x2BBC*/ u16 easyChatBattleStart[EASY_CHAT_BATTLE_WORDS_COUNT];
    /*0x2BC8*/ u16 easyChatBattleWon[EASY_CHAT_BATTLE_WORDS_COUNT];
    /*0x2BD4*/ u16 easyChatBattleLost[EASY_CHAT_BATTLE_WORDS_COUNT];
    /*0x2BE0*/ struct MailStruct mail[MAIL_COUNT];
    /*0x2E20*/ u8 additionalPhrases[8]; // bitfield for 33 additional phrases in easy chat system
    /*0x2E28*/ OldMan oldMan;
    /*0x2e64*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff
    /*0x2e90*/ struct ContestWinner contestWinners[13]; // 0 - 5 used in contest hall, 6 - 7 unused?, 8 - 12 museum
    /*0x3030*/ struct DayCare daycare;
    /*0x3150*/ struct LinkBattleRecords linkBattleRecords;
    /*0x31A8*/ u8 giftRibbons[52];
    /*0x31DC*/ struct Roamer roamer;
    /*0x31F8*/ struct EnigmaBerry enigmaBerry;
    /*0x322C*/ struct MEventBuffers unk_322C;
    /*0x3598*/ u8 field_3598[0x180];
    /*0x3718*/ u32 trainerHillTimes[4];
    /*0x3728*/ struct RamScript ramScript;
    /*0x3B14*/ struct RecordMixingGift recordMixingGift;
    /*0x3B24*/ u8 seen2[DEX_FLAGS_NO];
    /*0x3B58*/ LilycoveLady lilycoveLady;
    /*0x3B98*/ struct TrainerNameRecord trainerNameRecords[20];
    /*0x3C88*/ u8 unk3C88[10][21];
    /*0x3D5A*/ u8 filler3D5A[0xA];
    /*0x3D64*/ struct SaveTrainerHill trainerHill;
    /*0x3D70*/ struct WaldaPhrase waldaPhrase;
    // sizeof: 0x3D88
};
Ahh, Ya veo. Entonces me imagino que cuando cargues el rom de nuevo, con esta información que se pusiera en tales direcciones de memoria, comenzarías el juego donde lo dejaste aunque no se salva directamente al juego si no como un archivo que reemplaza los valores básicos del juego. Esto esta buenísimo.
Venga, ¿donde fue que aprendiste de esto? Me podéis dar los recursos o recomendarme los? Quisiera involucrarme mas en el rom hacking porque soy desarrollador de aplicaciones.
¡Muchas Gracias!
Quisiera involucrarme con un equipo para aprender mas de esto.
 

Jaizu

Decomp user
Ahh, Ya veo. Entonces me imagino que cuando cargues el rom de nuevo, con esta información que se pusiera en tales direcciones de memoria, comenzarías el juego donde lo dejaste aunque no se salva directamente al juego si no como un archivo que reemplaza los valores básicos del juego. Esto esta buenísimo.
Venga, ¿donde fue que aprendiste de esto? Me podéis dar los recursos o recomendarme los? Quisiera involucrarme mas en el rom hacking porque soy desarrollador de aplicaciones.
¡Muchas Gracias!
Quisiera involucrarme con un equipo para aprender mas de esto.
Claro.
El emulador/consola lo que hace es cargar la ROM, la cual no se modifica jugando, es READ ONLY MEMORY.
Lo que hacen los emuladores es crear el archivo de guardado que todos los juegos tienen, normalmente un .sav, en él se guardan cosas como tu equipo pokémon, los pokes de tus cajas, los objetos que tienes... Vamos, todo lo que tiene tu partida del juego.

Y por cierto, no es que el .sav reemplace valores. El juego tiene flags (interruptores) y variables definidas, lo que guardas es qué flags (interruptores) está activadas (on/off) y qué valores tienen las variables.
 

MagallanoX

Pequeño Saltamontes
Claro.
El emulador/consola lo que hace es cargar la ROM, la cual no se modifica jugando, es READ ONLY MEMORY.
Lo que hacen los emuladores es crear el archivo de guardado que todos los juegos tienen, normalmente un .sav, en él se guardan cosas como tu equipo pokémon, los pokes de tus cajas, los objetos que tienes... Vamos, todo lo que tiene tu partida del juego.

Y por cierto, no es que el .sav reemplace valores. El juego tiene flags (interruptores) y variables definidas, lo que guardas es qué flags (interruptores) está activadas (on/off) y qué valores tienen las variables.
Estaba interesado en aprender mas de esto para hacer un juego de mundo abierto. Por ejemplo, seria un juego que puedas obtener en el caso de FireRed cualquier medalla en Kanto, y al obtener mas medallas, lucharias contra oponentes mas fuertes.
 

Cheve_X

MoonLover~
Miembro de honor
Si acabas de llegar al mundillo te recomiendo que vayas derecho a Decomp, que es programación en C.

En RomHacking de Pokémon, existen "Scripts" que son eventos desarrollados con un lenguaje propio del juego, para ésto busca "Tutoriales de Scripting" en el subforo de RomHacking. (Éste lenguaje es uno de nivel "alto" comparado con Hex y ASM que se usan para otras cosas más... extremas, por así decirlo... aunque, repito, si acabas de empezar en ésto, vete a Decomp directo, más si ya sabes de programación, te vas a ahorrar infinitos dolores de cabeza)

PD: Digo ésto basado en mis 3 años de estudiar programación y mis 6 hackeando roms de pokémon /y algo de no pokémon/

PD: Si estás interesado en el RomHacking en general, más allá de las Roms de pokémon (Si, eso existe, de verdad xDDD) entonces quizá si te interese ASM y Hex, pero en el foro hay poco contenido de eso, la verdura.
 
Arriba