Registrarse

[pokeruby] Hacer que las TMs/MTs sean objetos de una sola compra

Lunos

Enfrentando a La Organización
Miembro insignia
Holi. Como lo dice el titulo, hoy aprenderemos a hacer que las TMs/MTs que pongamos a la venta en algun PokéMart solo se puedan comprar una vez.
Esta modificación va como anillo al dedo para las TMs/MTs reusables.

Antes de empezar, toca decir que los creditos se los lleva Doesnt pues él diseñó esto.
Sin mas que decir, empecemos.

Requisitos:
-Leer mi tema de introducción a Pokeruby.
-Editor de texto (yo usaré Notepad++)

Instrucciones:
1) Abrimos el archivo pokeruby\include\strings.h con nuestro editor de texto
Aquí vamos a la Linea 277, y en una nueva linea escribimos:
Código:
extern const u8 gOtherText_ThatsSoldOut[];
2) Abrimos el archivo pokeruby\src\data\items_en.h con nuestro editor de texto
Aquí simplemente cambiaremos el nombre del Pokémon #0 de "????????" a "-----".

3) Ahora nos vamos a pokeruby\src\shop.c
-Vamos a la Linea 547, y en una nueva añadimos:
Código:
 	u8 width = 0x58;
-Vamos a la Linea 556, y dejando una linea nueva y de por medio, añadimos:
Código:
// Don't display TM names if we have them already
	if (ItemId_GetPocket(itemId) == 3 && (CheckBagHasItem(itemId, 1) || CheckPCHasItem(itemId, 1)))
	{
		itemId = 0;
		width = 0x74;
	}
Imagen de ejemplo.

-Vamos a la Linea 567, seleccionamos "sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, 0x58, 0x1);" y lo reemplazamos con:
Código:
sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, width, 0x1);
-Ctrl+F "GetMoneyAmountText(stringPtr, (ItemId_GetPrice".
Eliminamos la linea que contiene eso y la siguiente, y en su lugar ponemos:
Código:
if (itemId != 0)
	{
	    GetMoneyAmountText(stringPtr, (ItemId_GetPrice(itemId) >> GetPriceReduction(1)), 0x4);
        Menu_PrintTextPixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 1);
    }
Imagen de ejemplo.

-Ctrl+F "sub_8072AB0(ItemId_GetDescription(gMartInfo".
Eliminamos la linea que contiene eso y la siguiente, y en su lugar ponemos:
Código:
u16 itemId = gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor];
		    if (ItemId_GetPocket(itemId) == 3 && (CheckBagHasItem(itemId, 1) || CheckPCHasItem(itemId, 1)))
			    itemId = 0;
            sub_8072AB0(ItemId_GetDescription(itemId), 0x4, 0x68, 0x68, 0x30, 0);
Imagen de ejemplo.

-Ctrl+F "static void Shop_UpdateCurItemCountToMax(u8 taskId)", y debajo el "u16 var;" que vemos ahi, añadimos:
Código:
u16 itemId = gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor];
-Vamos a la Linea 775, y en una nueva linea de por medio, añadimos:
Código:
var = gSaveBlock1.money / (ItemId_GetPrice(itemId) >> GetPriceReduction(1));
-Reemplazamos las 5 lineas de codigo que siguen, por:
Código:
if (ItemId_GetPocket(itemId) == 3)
		var = 1;
	if (var > 99)
		gMartInfo.curItemCount = 99;
	else
		gMartInfo.curItemCount = var;
-Ctrl+F "// set 1x price".
Eliminamos la linea que contiene eso y la siguiente, y en su lugar ponemos:
Código:
u16 itemId = gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor];
                    gMartTotalCost = (ItemId_GetPrice(itemId) >> GetPriceReduction(1)); // set 1x price
					if (ItemId_GetPocket(itemId) == 3 && (CheckBagHasItem(itemId, 1) || CheckPCHasItem(itemId, 1)))
					{
                        DisplayItemMessageOnField(taskId, gOtherText_ThatsSoldOut, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); // tail merge
					}
                    else if (!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost))
Imagen de ejemplo.

-Y por ultimo, Ctrl+F "else // _080B42BA".
Reemplazaremos:
Código:
Con:
Código:
CopyItemName(itemId, gStringVar1);
3) Para concluir, nos vamos a pokeruby\src\strings.c
Ctrl+F "const u8 gOtherText_NotEnoughMoney[]", y en una nueva linea añadimos:
Código:
const u8 gOtherText_ThatsSoldOut[] = _("That’s sold out.{PAUSE_UNTIL_PRESS}");
Aquí una muestra del resultado:


Si por algun motivo no entendieron este tutorial, pueden echarle un vistazo a estos archivos justo aqui.

Y eso fue todo.​
 
Arriba