Registrarse

[pokeruby - pokeemerald] Índice de pequeñas modificaciones

Disturbo

Decomper
Post original creado por Avara en PokéCommunity, todos los créditos van dirigidos a la autora. Adaptado y traído a WaH para vuestro uso y disfrute por el Equipo de traducción. Podéis publicar aportes vosotros también, e iré actualizando el índice. Importante mencionar a otros colaboradores del post como DizzyEgg y Lunos.

~ Disturbo
Índice de pequeñas modificaciones para
pokeemerald y pokeruby



[hr][/hr]


Este hilo tiene el propósito de ser una forma en la que organizar pequeños aportes que no sean lo bastante grandes como para necesitar un post propio. Se recogerán las instrucciones necesarias para aplicar estas modificaciones y se creará una lista en este mismo post para faciltar la búsqueda de algo específico.

Si conoces o piensas que alguna pequeña modificación puede ser añadida a esta lista, deja un comentario y se actualizará el índice. Con un poco de suerte, esto hará que más rom hackers se pasen a las decomps :D


[hr][/hr]




¡Atención lector! Debido a la carga de trabajo de segundo de bachillerato y la gran cantidad de aportes que están teniendo lugar en el mundillo de la decompilación (al que estoy dando bastante preferencia), no puedo mantener este índice al día. Os insto a formar parte del equipo de traducción, cualquier pequeño aporte que hagais es bienvenido, y lo único que se espera de vosotros es que sepáis el lenguaje que estais traduciendo, no tenéis que traducir nada obligatoriamente ni nada por el estilo. ¡Gracias por leer esto!​
 
Última edición:

Disturbo

Decomper
Editar los items del almacenados en el PC original
pokeemerald & pokeruby


[hr][/hr]



Abrimos "src/player_pc.c" y vamos a la siguiente struct. Puedes usar Ctrl+F "POTION" para localizarla.
Código:
static const struct ItemSlot gNewPCItems[]=
{
	{ ITEM_POTION, 1 },
	{ ITEM_NONE, 0 }
};

El código aquí es bastante intuitivo, solo debemos asegurarnos de no eliminar o modificar { ITEM_NONE, 0 }. Por ejemplo:
Código:
static const struct ItemSlot gNewPCItems[]=
{
	{ ITEM_SITRUS_BERRY, 5 },
	{ ITEM_LUM_BERRY, 3 },
	{ ITEM_NONE, 0 }
};

Esto resultaría en el siguiente PC al comienzo del juego:


[hr][/hr]

 
Última edición:

Disturbo

Decomper
Cambiar los Pokémon inicales original
pokeemerald & pokeruby


[hr][/hr]



Abrimos "src/starter_choose.c" y vamos a la siguiente sección. Puedes usar Ctrl+F "TREECKO" para localizarlo.
Código:
static const u16 sStarterMon[STARTER_MON_COUNT] =
{
	SPECIES_TREECKO,
	SPECIES TORCHIC,
	SPECIES_MUDKIP,
}

Una vez más, el cambio es sencillo. Simplemente cambia los "SPECIES_" al Pokémon que quieras. Por ejemplo:
Código:
static const u16 sStarterMon[STARTER_MON_COUNT] =
{
	SPECIES_CHIKORITA,
	SPECIES CYNDAQUIL,
	SPECIES_TOTODILE,
}

Ahora, los tres iniciales serán Chikorita, Cyndaquil y Totodile.


[hr][/hr]

 
Última edición:

Disturbo

Decomper
Cambiar la cantidad de dinero con la que se comienza original
pokeemerald & pokeruby


[hr][/hr]



Abrimos "src/new_game.c" y vamos a la siguiente línea.
Código:
SetMoney(&gSaveBlock1Ptr->money, 3000);

Todo lo que tenemos que hacer es cambiar el 3000 por la nueva cantidad. Para pokeruby, la línea es diferente.
Código:
gSaveBlock1.money = 3000;

[hr][/hr]

 
Última edición:

Disturbo

Decomper
Cambiar el Pokémon de la introducción de Birch original
pokeemerald & pokeruby


[hr][/hr]



Abrimos "src/player_pc.c" y econtamos las siguientes partes. Puedes usar Ctrl+F "SPECIES_LOTAD" para localizarla.
Código:
	CreatePokeballSpriteToReleaseMon(spriteId, gSprites[spriteId].oam.platteNum, 112, 58, 0, 0, 32, 0x00000FFFF, SPECIES_LOTAD);
	gTasks[taskId].func = Task_NewGameBirchSpeechSub_WaitForLotad;
	gTasks[sBirchSpeechMainTaskId].tTimer = 0;
}
Código:
static u8 NewGameBirchSpeech_CreateLotadSprite(u8 a, u8 b)
{
	return CreatePicSprite2(SPECIES_LOTAD, 8, 0, 1, a, b, 14, -1);
}

Para cambiar el Pokémon simplemente debemos sutituir "SPECIES_LOTAD" por el Pokémon que queramos (Por ejemplo: "SPECIES_TRAPINCH").


[hr][/hr]

 
Última edición:

Disturbo

Decomper
Disociar las paletas de back y frontsprites del jugador original
pokeemerald


[hr][/hr]



Antes de nada, debes guardar la paleta de tu nuevo back a la carpeta "palettes" dentro de "graphics/trainer". Por simplificar las cosas, las mías se llaman "brendan_back" y "may_back".
Ahora debemos definir las nuevas variables que usaremos para estas paletas.
Abrimos "include/graphics.h" y añadimos las siguientes líneas. Preferiblemente alrededor de la línea 3070 para mantener cierto orden.
Código:
extern const u32 gTrainerBackPicPalette_Brendan[];
extern const u32 gTrainerBackPicPalette_May[];

Ve a “pokeemerald\src\data\graphics\trainers.h” y añade las siguientes dos líneas alrededor de la línea 290 por el mismo motivo que antes.
Código:
const u32 gTrainerBackPicPalette_Brendan[] = INCBIN_U32("graphics/trainers/palettes/brendan_back.gbapal.lz");
const u32 gTrainerBackPicPalette_May[] = INCBIN_U32("graphics\trainers\palettes\may_back.gbapal.lz");

Por último, ve a la siguiente struct en “pokeemerald\src\data\trainer_graphics\back_pic_tables.h” y cambia:
Código:
const struct CompressedSpritePalette gTrainerBackPicPaletteTable[] = 
{
	gTrainerPalette_Brendan, 0,
	gTrainerPalette_May, 1,
A esto
Código:
const struct CompressedSpritePalette gTrainerBackPicPaletteTable[] = 
{
	gTrainerBackPicPalette_Brendan, 0,
	gTrainerBackPicPalette_May, 1,

Y eso es todo, ya no te tienes que preocupar que los fronts y backs del jugador tengan los mismos colores.

[hr][/hr]

 
Última edición:

Disturbo

Decomper
Cambiar los valores predeterminados del menú de opciones original
pokeemerald


[hr][/hr]



Dirígete a “src\new_game.c”. Usa CTRL+F para encontrar lo siguiente:
Código:
static void SetDefaultOptions(void)
{
	gSaveBlock2Ptr->optionsTextSpeed = OPTIONS_TEXT_SPEED_MID;
	gSaveBlock2Ptr->optionsWindowFrameType = 0;
	gSaveBlock2Ptr->optionsSound = OPTIONS_SOUND_MONO;
	gSaveBlock2Ptr->optionsBattleStyle = OPTIONS_BATTLE_STYLE_SHIFT;
	gSaveBlock2Ptr->optionsBattleSceneOff = FALSE;
	gSaveBlock2Ptr->regionMapZoom = FALSE;
}

Estos son los valores que puedes modificar. Se sobreentiende lo que hace cada uno.

[hr][/hr]

 
Última edición:

Disturbo

Decomper
MTs reusables y hacer que los Pokémon no las puedan llevar original
pokeemerald


[hr][/hr]



Dirígete a “src\party_menu.c”. Usa CTRL+F para encontrar las siguientes líneas. Elimínalas y las MTs ya serán reusables.
Código:
if (item < ITEM_HM01_CUT)
    RemoveBagItem(item, 1);

Para hacer que no tengan un número a su derecha y que no las pueda sujetar un Pokémon, abre "src/data/items.h" y cambia el valor de ".importance" en cada Máquina Técnica a 1. El resultado es el siguiente:


[hr][/hr]

 
Última edición:

Kaktus

Miembro insignia
Miembro insignia
¡¡Excelente índice!!

Me alegra ver que vuestro equipo también se ha animado a traducir este tipo de aportes de la comunidad inglesa. Como sugerencias, me gustaría decirte que en lugar de guiones, puedes usar

Código:
[hr][/hr]
Para crear una barra así [hr][/hr]

Y en caso de que no quieras que ocupe todo el ancho, puedes escribir

Código:
[CSS="width: 60%;"][COLOR="Silver"][hr][/hr][/COLOR][/CSS]
Con lo que se verá algo así:

[hr][/hr]


Que sin duda queda bastante mejor

También te recomendaría que enlazaras cada post en el índice (así cumpliría
mejor la función de índice).

Código:
[post="nºdelpost"]Nombre del tutorial[/post]
Por ejemplo, esto:

Código:
[post="439384"][b][COLOR="Black"][[color=darkgreen]pokeemerald[/color] & [color=darkred]pokeruby[/color]][/b] Editar los items del almacenados en el PC[/COLOR][/post]
Se vería así:

[post="439384"][pokeemerald & pokeruby] Editar los items del almacenados en el PC[/post]

Por lo demás, está todo impecable, buen trabajo, seguid así :)
 

Disturbo

Decomper
Sistema de repelente de BW original
pokeemerald


[hr][/hr]



Abrimos "src/script_menu.c" y buscamos la función "DrawMultichoiceMenu", y la reemplazamos con el siguiente código.
Código:
static void DrawMultichoiceMenuCustom(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress, u8 cursorPos, const struct MenuAction *actions, int count)
{
    int i;
    u8 windowId;
    int width = 0;
    u8 newWidth;

    for (i = 0; i < count; i++)
    {
        width = display_text_and_get_width(actions[i].text, width);
    }

    newWidth = convert_pixel_width_to_tile_width(width);
    left = sub_80E2D5C(left, newWidth);
    windowId = CreateWindowFromRect(left, top, newWidth, count * 2);
    SetStandardWindowBorderStyle(windowId, 0);
    PrintMenuTable(windowId, count, actions);
    InitMenuInUpperLeftCornerPlaySoundWhenAPressed(windowId, count, cursorPos);
    schedule_bg_copy_tilemap_to_vram(0);
    sub_80E1FBC(ignoreBPress, count, windowId, multichoiceId);
}

static void DrawMultichoiceMenu(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress, u8 cursorPos)
{
    DrawMultichoiceMenuCustom(left, top, multichoiceId, ignoreBPress, cursorPos, gMultichoiceLists[multichoiceId].list, gMultichoiceLists[multichoiceId].count);
}

void TryDrawRepelMenu(void)
{
    static const u16 repelItems[] = {ITEM_REPEL, ITEM_SUPER_REPEL, ITEM_MAX_REPEL};
    struct MenuAction menuItems[4] = {NULL};
    int i, count = 0;

    for (i = 0; i < ARRAY_COUNT(repelItems); i++)
    {
        if (CheckBagHasItem(repelItems[i], 1))
        {
            VarSet(VAR_0x8004 + count, repelItems[i]);
            menuItems[count].text = ItemId_GetName(repelItems[i]);
            count++;
        }
    }

    if (count > 1)
        DrawMultichoiceMenuCustom(0, 0, 0, FALSE, 0, menuItems, count);

    gSpecialVar_Result = (count > 1);
}

void HandleRepelMenuChoice(void)
{
    gSpecialVar_0x8004 = VarGet(VAR_0x8004 + gSpecialVar_Result); // Get item Id;
    VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_0x8004));
}

Tras esto, abrimos "data/event_script.s" y buscamos "EventScript_RepelWoreOff", y lo reemplazamos por lo siguiente.
Código:
EventScript_RepelWoreOff:: @ 82A4B2A
	msgbox Text_RepelWoreOff, MSGBOX_SIGN
	checkitem ITEM_REPEL, 1
	compare VAR_RESULT, TRUE
	goto_if_eq EventScript_RepelWoreOff_AskAnother
	checkitem ITEM_SUPER_REPEL, 1
	compare VAR_RESULT, TRUE
	goto_if_eq EventScript_RepelWoreOff_AskAnother
	checkitem ITEM_MAX_REPEL, 1
	compare VAR_RESULT, FALSE
	goto_if_eq EventScript_RepelWoreOff_End
EventScript_RepelWoreOff_AskAnother:
	msgbox Text_RepelAskAnother, MSGBOX_YESNO
	closemessage
	compare VAR_RESULT, 0
	goto_if_eq EventScript_RepelWoreOff_End
	callnative TryDrawRepelMenu
	compare VAR_RESULT, FALSE
	goto_if_eq EventScript_RepelWoreOff_Chose
	waitstate
	compare VAR_RESULT, 127
	goto_if_eq EventScript_RepelWoreOff_End
EventScript_RepelWoreOff_Chose:
	callnative HandleRepelMenuChoice
	bufferitemname 1, VAR_0x8004
	takeitem VAR_0x8004, 1
	playse SE_TU_SAA
	msgbox gText_PlayerUsedVar2, MSGBOX_SIGN
EventScript_RepelWoreOff_End:
	end

Text_RepelWoreOff: @ 82A4B33
	.string "REPEL's effect wore off…$"
Text_RepelAskAnother:
	.string "Would you like to use another one?$"

¡Y eso sería todo! In-game quedaría tal que así:


También hay una branch de la que pullear este sistema directamente.

[hr][/hr]

 
Última edición:

Disturbo

Decomper
Editar el mapa inicial original
pokeemerald


[hr][/hr]



Abrimos "src/new_game.c" y buscamos la siguiente función:
Código:
static void WarpToTruck(void)
{
    SetWarpDestination(MAP_GROUP(INSIDE_OF_TRUCK), MAP_NUM(INSIDE_OF_TRUCK), -1, -1, -1);
    WarpIntoMap();
}

Debemos modificar los parámetros de la función "SetWarpDestination", por ejemplo, para que el mapa inicial sea Oldale Town:
Código:
SetWarpDestination(MAP_GROUP(OLDALE_TOWN), MAP_NUM(OLDALE_TOWN), -1, 6, 18);
Esto nos coloca a la salida del Centro Pokémon. Si queremos colocarnos en el centro del mapa, simplemente establecemos las coordenadas a -1, tal que:
Código:
SetWarpDestination(MAP_GROUP(OLDALE_TOWN), MAP_NUM(OLDALE_TOWN), -1, -1, -1);

Por otro lado, si queremos eliminar la animación del camión, simplemente nos dirigimos a "src/overworld.c" en la función CB2_NewGame y eliminamos o comentamos esta línea:
Código:
gFieldCallback = ExecuteTruckSequence;
¡Y eso es todo!


[hr][/hr]

 
Última edición:

Disturbo

Decomper
Cambiar el límite de dinero original
pokeemerald


[hr][/hr]



En el siguiente ejemplo, cambiaremos el límite de dinero a 9.999.999. Para ello, nos dirigimos a "src/money.c".
En la línea 13 encontramos lo siguiente, que establece el límite. Lo cambiamos a la cantidad deseada y ya está... ¡pues no!
Código:
#define MAX_MONEY 9999999
Ahora vamos a la línea 135, donde cambiaremos el 0x26 por 0x20. Si quisiesemos cambiar la cantidad de dinero a una cifra de longitud mayor, simplemente restamos 0x06 por cada cifra extra.
Código:
PrintMoneyAmount(windowId, 0x20, 1, amount, speed);
Lo último que modificaremos en este archivo es la línea 145. Aquí cambiaremos el valor numérico por cualquiera que sea la longitud de la cifra.
Código:
strLength = 7 - StringLength(gStringVar1);


Ahora nos dirigimos a "src/shop.c", donde reeplazaremos 38 por 32, y al igual que con la línea 135 de "src/money.c", si queremos poner una cifra más larga, restamos 6 por cada cifra extra
Código:
PrintMoneyAmount(4, 32, 1, gShopDataPtr->totalCost, TEXT_SPEED_FF);


Por último, abrimos "src/trainer_card". Aquí hacemos un cambio similar al de la línea 145 de "src/money.c", y reemplazamos el 6 por la longitud de nuestro nuevo límite.
Código:
ConvertIntToDecimalStringN(gStringVar1, sData->trainerCard.money, 0, 7);

¡Y eso sería todo! Queda tal que así:

También hay una branch de la que pullear este cambio directamente.

[hr][/hr]

 
Última edición:

Lunos

Enfrentando a La Organización
Miembro insignia
Esto lo mencioné en PokeCommunity y merece repetirlo aquí.
Esta implementación funciona, pero tiene un pequeño inconveniente, y es que al reemplazar un viejo movimiento con uno nuevo, sus PPs se recargan.
Debido a eso, uno se puede aprovechar de esto y recargar infinitamente los PPs de uno o todos los movimientos de su pokémon enseñando distintas MTs/MOs todo el rato.
EDITO: En el momento en el que escribí esto originalmente no lo habia testeado, pero lo cierto es que así funciona el asunto desde la 6ta Generación.
Igualmente queda feo a mi parecer, pero eso ya es subjetivo.

Modificando la tabla de objetos de la habilidad Recogida (Em) original
(fuera de la Pirámide Batalla)


Para esto, nos dirigiremos al archivo src/battle_script_commands.c.
Lo que haremos aquí es echarle un vistazo a la lista de elementos nombrada sPickupItems.
Lo que esto contiene, como lo pueden suponer, es la lista de objetos que un Pokémon con Recogida puede obtener tras ganar una batalla, con probabilidades de 4%, 10% y 30%.


Justo debajo de ella tenemos otra lista de nombre sRarePickupItems.
Esta contiene la lista de objetos que un Pokémon con Recogida puede obtener con 1% de probabilidad.


Modificar estas listas es tan simple como modificar las constantes de objetos a placer, guardar y make en tu terminal.

Aquí hay un video rapido en el cual reemplazo todos los objetos en sPickupItems con with Master Balls.


No lo he revisado mucho, pero la Pirámide Batalla usa sus propias listas.
Los curiosos las encontrarán empezando por la Linea 289 del archivo src/battle_pyramid.c.
Volver al índice
 
Última edición:

victor94abcd

Usuario de oro
Una cosa, para cambiar el pokémon de la intro, si no lo encuentras en el archivo
1615852060888.png
lo puedes encontrar en el archivo
1615852094590.png
y hacéis lo que dice Crl + F y SPECIES_LOTAD.
Buen aporte aunque llego tarde.
 

Samu

Miembro insignia
Miembro insignia
Una cosa, para cambiar el pokémon de la intro, si no lo encuentras en el archivo Ver el archivo adjunto 4679 lo puedes encontrar en el archivo Ver el archivo adjunto 4680 y hacéis lo que dice Crl + F y SPECIES_LOTAD.
Buen aporte aunque llego tarde.
Todo el tema está bastante desactualizado en Wah, yo os recomendaría mirar el post original de Pokeco:


Habría que actualizar el tema, la verdad, lleva muerto 2 años xDD.
 
Arriba