extract graphics data

This commit is contained in:
Evan
2019-11-26 11:47:12 -07:00
parent c73f061cc6
commit d1142b4290
10 changed files with 143 additions and 101 deletions
+50 -36
View File
@@ -7,21 +7,18 @@
#include "field_map_obj.h"
#include "field_camera.h"
// Defines
#define t0 data[0]
#define tX data[4]
#define tY data[5]
#define tListTaskId data[7]
// RAM
EWRAM_DATA u8 gUnknown_2039984 = 0;
// Function Declarations
static void sub_809C1D8(u8 taskId, const u16* a1, u16 a2);
static void sub_809C334(u8 taskId);
static void sub_809C500(u8 taskId);
static void sub_809C640(u8 taskId);
// Data Definitions
static const u16 gUnknown_83DF0D4[] = {0x0308, 0x030a, 0x02d0};
static const u16 gUnknown_83DF0DA[] = {0x0309, 0x030b, 0x02d1};
static const u16 gUnknown_83DF0E0[] = {0x0310, 0x0312, 0x02d8};
@@ -30,34 +27,52 @@ static const u16 gUnknown_83DF0EC[] = {0x02e3, 0x0316, 0x0314};
static const u16 gUnknown_83DF0F2[] = {0x02e4, 0x0317, 0x0315};
static const u16 gUnknown_83DF0F8[] = {0x02eb, 0x031e, 0x031c};
// Functions
#ifdef NONMATCHING
void sub_809C1D8(u8 taskId, const u16* a1, u16 a2)
// Couldn't get the registers to match. Hard to know where to fix since I'm unsure what the variables are for.
static void sub_809C1D8(u8 taskId, const u16* a1, u16 a2)
{
s16 v1, v2, v3;
s16 i, j;
v1 = gTasks[taskId].data[5] - 1;
v2 = gTasks[taskId].data[6] - 1;
v3 = gTasks[taskId].data[2];
if (gTasks[taskId].data[3] == 0)
{
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
MapGridGetMetatileIdAt(v1 + j, v2 + i);
if ()
{
}
MapGridSetMetatileIdAt
}
}
}
s16 i, j;
const s16* v4;
v1 = gTasks[taskId].data[4] - 1;
v2 = gTasks[taskId].data[5] - 1;
v3 = gTasks[taskId].data[1];
if (gTasks[taskId].data[2] == 0)
{
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
v4 = &a1[v3];
if (MapGridGetMetatileIdAt(v1 + j, v2 + i) == v4[0])
{
if (v3 != 2)
MapGridSetMetatileIdAt(v1 + j, v2 + i, a2 | v4[1]);
else
MapGridSetMetatileIdAt(v1 + j, v2 + i, a2 | v4[0]);
}
}
}
}
else
{
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
if (a1[2 - v3] == MapGridGetMetatileIdAt(v1 + j, v2 + i))
{
if (v3 != 2)
MapGridSetMetatileIdAt(v1 + j, v2 + i, a2 | a1[1 - v3]);
else
MapGridSetMetatileIdAt(v1 + j, v2 + i, a2 | a1[2]);
}
}
}
}
}
#else
NAKED
@@ -275,9 +290,9 @@ static void sub_809C334(u8 taskId)
default:
break;
}
data[0] = (data[0] + 1) & 7;
v1 = data[0] & 7;
//ldrh r5, [r4] instead mov r5, r0 somehow
if (v1 == 0)
{
DrawWholeMapView();
@@ -293,7 +308,7 @@ static u8 sub_809C3FC(u16 a0)
taskId = CreateTask(sub_809C334, 0);
data = gTasks[taskId].data;
PlayerGetDestCoords(&tX, &data[5]);
PlayerGetDestCoords(&tX, &tY);
t0 = 0;
data[1] = 0;
data[2] = a0;
@@ -335,10 +350,8 @@ void sub_809C4A8(void)
s16 *data;
taskId = CreateTask(sub_809C500, 0);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = 0;
data = gTasks[taskId].data;
PlayerGetDestCoords(&data[2], &data[3]);
if (gSpecialVar_0x8004 == 0)
@@ -376,9 +389,8 @@ static void sub_809C500(u8 taskId)
data[0]++;
if (data[0] != 0x10)
return;
data[0] = 0;
data[0] == 0;
data[0] = 0;
data[1]++;
if (data[1] != 0xD)
return;
@@ -399,7 +411,6 @@ void sub_809C5FC(void)
taskId = CreateTask(sub_809C640, 0);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = 0;
data = gTasks[taskId].data;
PlayerGetDestCoords(&data[2], &data[3]);
gTasks[taskId].data[2] += 4;
@@ -423,6 +434,7 @@ static void sub_809C640(u8 taskId)
DestroyTask(taskId);
return;
}
data[2]--;
}
MapGridSetMetatileIdAt(data[2], data[3], 0xEB9);
@@ -430,6 +442,7 @@ static void sub_809C640(u8 taskId)
CurrentMapDrawMetatileAt(data[2], data[3]);
CurrentMapDrawMetatileAt(data[2], data[3] + 1);
}
data[0]++;
if (data[0] == 4)
{
@@ -437,3 +450,4 @@ static void sub_809C640(u8 taskId)
data[1]++;
}
}
+44 -54
View File
@@ -2,6 +2,8 @@
#include "shop.h"
#include "menu.h"
#include "data.h"
#include "graphics.h"
#include "strings.h"
#include "list_menu.h"
#include "new_menu_helpers.h"
#include "party_menu.h"
@@ -15,7 +17,6 @@
#include "item_menu.h"
#include "main.h"
#include "sound.h"
#include "strings.h"
#include "string_util.h"
#include "overworld.h"
#include "window.h"
@@ -38,9 +39,7 @@
#include "constants/items.h"
#include "constants/game_stat.h"
#define t0 data[0]
#define tItemCount data[1]
#define tX data[4]
#define tItemId data[5]
#define tListTaskId data[7]
@@ -96,7 +95,6 @@ struct MartHistory
/*0x17*/ u8 unk17;
}; /* size = 0x18 */
EWRAM_DATA s16 sViewportMapObjects[MAP_OBJECTS_COUNT][4] = {0};
EWRAM_DATA struct ShopData gShopData = {0};
EWRAM_DATA u8 sShopMenuWindowId = 0;
@@ -165,39 +163,23 @@ static void nullsub_52(u8 taskId);
static void nullsub_53(void);
static void RecordQuestLogItemPurchase(void);
// external defines
extern u8 MapGridGetMetatileLayerTypeAt(s16 x, s16 y);
extern u16 BagGetQuantityByItemId(u16 item);
//Data Definitions
/*
extern const struct MenuAction gUnknown_83DF09C[];
extern const struct YesNoFuncTable gUnknown_83DF0B4[];
extern const struct WindowTemplate gUnknown_83DF0BC[];
extern const struct BgTemplate gUnknown_83DF0C4[];
*/
//graphics
extern const u32 gUnknown_8E85DC8[]; //gBuyMenuFrame_Gfx[];
extern const u32 gUnknown_8E85EFC[]; //gBuyMenuFrame_Tilemap
extern const u32 gUnknown_8E86038[]; //gBuyMenuFrame_TmHmTilemap
extern const u32 gUnknown_8E86170[]; //gBuyMenuFrame_Pal
static const struct MenuAction gUnknown_83DF09C[] = // sShopMenuActions_BuySellQuit
static const struct MenuAction sShopMenuActions_BuySellQuit[] =
{
{gText_ShopBuy, {.void_u8 = Task_HandleShopMenuBuy}},
{gText_ShopSell, {.void_u8 = Task_HandleShopMenuSell}},
{gText_ShopQuit, {.void_u8 = Task_HandleShopMenuQuit}}
};
static const struct YesNoFuncTable gUnknown_83DF0B4[] = //sShopMenuActions_BuyQuit
static const struct YesNoFuncTable sShopMenuActions_BuyQuit[] =
{
BuyMenuTryMakePurchase, //Task_HandleShopMenuBuy,
BuyMenuReturnToItemList //Task_HandleShopMenuQuit
BuyMenuTryMakePurchase,
BuyMenuReturnToItemList
};
static const struct WindowTemplate gUnknown_83DF0BC[] = //sShopMenuWindowTemplates
static const struct WindowTemplate sShopMenuWindowTemplates[] =
{
{
.bg = 0,
@@ -210,7 +192,7 @@ static const struct WindowTemplate gUnknown_83DF0BC[] = //sShopMenuWindowTem
}
};
static const struct BgTemplate gUnknown_83DF0C4[4] = //sShopBuyMenuBgTemplates
static const struct BgTemplate sShopBuyMenuBgTemplates[4] =
{
{
.bg = 0,
@@ -250,7 +232,6 @@ static const struct BgTemplate gUnknown_83DF0C4[4] = //sShopBuyMenuBgTemplat
}
};
// Functions
static u8 CreateShopMenu(u8 a0)
{
@@ -261,9 +242,9 @@ static u8 CreateShopMenu(u8 a0)
else
gShopData.unk16_4 = 5;
sShopMenuWindowId = AddWindow(gUnknown_83DF0BC); //sShopMenuWindowTemplates
sShopMenuWindowId = AddWindow(sShopMenuWindowTemplates);
SetStdWindowBorderStyle(sShopMenuWindowId, 0);
PrintTextArray(sShopMenuWindowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, 16, 3, gUnknown_83DF09C);
PrintTextArray(sShopMenuWindowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, 16, 3, sShopMenuActions_BuySellQuit);
Menu_InitCursor(sShopMenuWindowId, 2, 0, 2, 16, 3, 0);
PutWindowTilemap(sShopMenuWindowId);
CopyWindowToVram(sShopMenuWindowId, 1);
@@ -272,10 +253,12 @@ static u8 CreateShopMenu(u8 a0)
static u8 GetMartTypeFromItemList(u32 a0)
{
u16 retVal, i;
u16 i;
if (a0)
return (u8)a0;
goto MAIN;
RETURN_1:
return 1;
@@ -296,6 +279,7 @@ static u8 GetMartTypeFromItemList(u32 a0)
else if (gShopData.itemList[i] == 0)
goto RETURN_0;
}
RETURN_0:
return 0;
}
@@ -333,7 +317,7 @@ static void Task_ShopMenu(u8 taskId)
Task_HandleShopMenuQuit(taskId);
break;
default:
gUnknown_83DF09C[Menu_GetCursorPos()].func.void_u8(taskId);
sShopMenuActions_BuySellQuit[Menu_GetCursorPos()].func.void_u8(taskId);
break;
}
}
@@ -377,6 +361,7 @@ static void Task_GoToBuyOrSellMenu(u8 taskId)
{
if (gPaletteFade.active)
return;
SetMainCallback2((void *)GetWordTaskArg(taskId, 0xE));
FreeAllWindowBuffers();
DestroyTask(taskId);
@@ -392,6 +377,7 @@ static void Task_ReturnToShopMenu(u8 taskId)
{
if (field_weather_is_fade_finished() != TRUE)
return;
DisplayItemMessageOnField(taskId, GetMartUnk16_4(), gText_CanIHelpWithAnythingElse, ShowShopMenuAfterExitingBuyOrSellMenu);
}
@@ -420,6 +406,7 @@ static void VBlankCB_BuyMenu(void)
static void CB2_InitBuyMenu(void)
{
u8 taskId;
switch (gMain.state)
{
case 0:
@@ -469,12 +456,15 @@ static bool8 InitShopData(void)
gShopTilemapBuffer1 = Alloc(sizeof(*gShopTilemapBuffer1));
if (gShopTilemapBuffer1 == 0)
goto CANCEL;
gShopTilemapBuffer2 = Alloc(sizeof(*gShopTilemapBuffer2));
if (gShopTilemapBuffer2 == 0)
goto CANCEL;
gShopTilemapBuffer3 = Alloc(sizeof(*gShopTilemapBuffer3));
if (gShopTilemapBuffer3 == 0)
goto CANCEL;
gShopTilemapBuffer4 = Alloc(sizeof(*gShopTilemapBuffer4));
if (gShopTilemapBuffer4 == 0)
goto CANCEL;
@@ -489,7 +479,7 @@ static bool8 InitShopData(void)
static void BuyMenuInitBgs(void)
{
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, gUnknown_83DF0C4, NELEMS(gUnknown_83DF0C4));
InitBgsFromTemplates(0, sShopBuyMenuBgTemplates, NELEMS(sShopBuyMenuBgTemplates));
SetBgTilemapBuffer(1, gShopTilemapBuffer2);
SetBgTilemapBuffer(2, gShopTilemapBuffer4);
SetBgTilemapBuffer(3, gShopTilemapBuffer3);
@@ -512,13 +502,15 @@ static void BuyMenuInitBgs(void)
static void BuyMenuDecompressBgGraphics(void)
{
void* pal;
DecompressAndCopyTileDataToVram(1, gUnknown_8E85DC8, 0x480, 0x3DC, 0);
DecompressAndCopyTileDataToVram(1, gBuyMenuFrame_Gfx, 0x480, 0x3DC, 0);
if ((gShopData.martType) != MART_TYPE_TMHM)
LZDecompressWram(gUnknown_8E85EFC, gShopTilemapBuffer1); //gBuyMenuFrame_Tilemap
LZDecompressWram(gBuyMenuFrame_Tilemap, gShopTilemapBuffer1);
else
LZDecompressWram(gUnknown_8E86038, gShopTilemapBuffer1); //gBuyMenuFrame_TmHmTilemap
LZDecompressWram(gBuyMenuFrame_TmHmTilemap, gShopTilemapBuffer1);
pal = Alloc(0x40);
LZDecompressWram(gUnknown_8E86170, pal);
LZDecompressWram(gBuyMenuFrame_Pal, pal);
LoadPalette(pal, 0xB0, 0x20);
LoadPalette(pal + 0x20, 0x60, 0x20);
Free(pal);
@@ -527,14 +519,17 @@ static void BuyMenuDecompressBgGraphics(void)
static void sub_809B10C(bool32 a0)
{
u8 v;
if (a0 == FALSE)
v = 0xB;
else
v = 6;
if ((gShopData.martType) != MART_TYPE_TMHM)
SetBgRectPal(1, 0, 0xE, 0x1E, 6, v);
else
SetBgRectPal(1, 0, 0xC, 0x1E, 8, v);
ScheduleBgCopyTilemapToVram(1);
}
@@ -551,10 +546,10 @@ static void BuyMenuDrawGraphics(void)
static bool8 BuyMenuBuildListMenuTemplate(void)
{
u16 i;
u16 v;
u16 i, v;
struct ListMenuItem **list = &sShopMenuListMenu;
struct ShopData *mart = &gShopData;
*list = Alloc((gShopData.itemCount + 1) * sizeof(*sShopMenuListMenu));
if (sShopMenuListMenu == 0)
goto FREE_MEMORY;
@@ -574,7 +569,7 @@ static bool8 BuyMenuBuildListMenuTemplate(void)
for (i = 0; i < mart->itemCount; i++)
{
PokeMartWriteNameAndIdAt(&sShopMenuListMenu[i], mart->itemList[i], sShopMenuItemStrings[i]); //PokeMartWriteNameAndIdAt(u16 a0, u16 a1, u8* a2)
PokeMartWriteNameAndIdAt(&sShopMenuListMenu[i], mart->itemList[i], sShopMenuItemStrings[i]);
}
ADD_CANCEL:
@@ -640,6 +635,7 @@ static void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 item, bool8 onInit, s
CreateItemMenuIcon(item, gShopData.itemSlot);
else
CreateItemMenuIcon(ITEM_N_A, gShopData.itemSlot);
gShopData.itemSlot ^= 1;
BuyMenuPrint(5, 2, description, 0, 3, 2, 1, 0, 0);
}
@@ -652,6 +648,7 @@ static void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 item, bool8 onInit, s
}
#ifdef NONMATCHING
// As simple as this seems, I could not get the while loop to use the correct registers. It should pad the front of gStringVar4 with 0 based on the length of gStringVar1.
static void BuyMenuPrintPriceInList(u8 windowId, s32 item, u8 y)
{
u32 len, x;
@@ -857,10 +854,7 @@ static void sub_809B764(void)
static void BuyMenuDrawMapBg(void)
{
s16 i;
s16 j;
s16 x;
s16 y;
s16 i, j, x, y;
const struct MapData *mapData;
u16 metatile;
u8 metatileLayerType;
@@ -913,7 +907,6 @@ static void BuyMenuDrawMapMetatile(s16 x, s16 y, const u16 *src, u8 metatileLaye
static void BuyMenuDrawMapMetatileLayer(u16 *dest, s16 offset1, s16 offset2, const u16 *src)
{
// This function draws a whole 2x2 metatile.
dest[offset1 + offset2] = src[0]; // top left
dest[offset1 + offset2 + 1] = src[1]; // top right
dest[offset1 + offset2 + 32] = src[2]; // bottom left
@@ -922,12 +915,9 @@ static void BuyMenuDrawMapMetatileLayer(u16 *dest, s16 offset1, s16 offset2, con
static void BuyMenuCollectEventObjectData(void)
{
s16 facingX;
s16 facingY;
u8 y;
u8 x;
s16 facingX, facingY;
u8 x, y, z;
u8 num = 0;
u8 z;
GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY);
z = PlayerGetZCoord();
@@ -970,8 +960,7 @@ static void BuyMenuCollectEventObjectData(void)
static void BuyMenuDrawEventObjects(void)
{
u8 i;
u8 spriteId;
u8 i, spriteId;
const struct MapObjectGraphicsInfo *graphicsInfo;
for (i = 0; i < MAP_OBJECTS_COUNT; i++)
@@ -993,7 +982,6 @@ static void BuyMenuDrawEventObjects(void)
static void BuyMenuCopyTilemapData(void)
{
s16 i;
u16 *dst = *gShopTilemapBuffer2;
u16 *src = *gShopTilemapBuffer1;
@@ -1049,6 +1037,7 @@ static void Task_BuyMenu(u8 taskId)
CopyItemName(itemId, gStringVar1);
BuyMenuDisplayMessage(taskId, gText_Var1CertainlyHowMany, Task_BuyHowManyDialogueInit);
}
break;
}
}
}
@@ -1056,7 +1045,6 @@ static void Task_BuyMenu(u8 taskId)
static void Task_BuyHowManyDialogueInit(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u16 quantityInBag = BagGetQuantityByItemId(tItemId);
u16 maxQuantity;
@@ -1120,7 +1108,7 @@ static void Task_BuyHowManyDialogueHandleInput(u8 taskId)
static void CreateBuyMenuConfirmPurchaseWindow(u8 taskId)
{
BuyMenuConfirmPurchase(taskId, gUnknown_83DF0B4);
BuyMenuConfirmPurchase(taskId, sShopMenuActions_BuyQuit);
}
static void BuyMenuTryMakePurchase(u8 taskId)
@@ -1204,6 +1192,7 @@ static void nullsub_53(void)
}
#ifdef NONMATCHING
// couldn't get registers to match. It should store an address into r4 (what tmp wants to be), and load/store from there, eg. ldrh r0, [r4,#4]. Which indicates an array inside the MartHistory struct, except data sizes are not consistent.
void RecordItemPurchase(u16 item, u16 quantity, u8 a2)
{
struct MartHistory *tmp;
@@ -1343,6 +1332,7 @@ static void RecordQuestLogItemPurchase(void)
v = history->unkA;
if (v != 0)
sub_8113550(v + 0x24, (const u16*)history);
v = history->unk16;
if (v != 0)
{