Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define NULL 0
- extern void* _JW_GetResourceAram(unsigned int aramAddress, unsigned char* outBuffer, int dmaSize);
- extern void memcopy(unsigned char* outBuffer, unsigned char* sourceBuffer, int copySize);
- void mIN_copy_name_str(unsigned char* outBuffer, unsigned short itemId) {
- struct s_itemNameInfo {
- unsigned short beginingItemId;
- unsigned short endingItemId;
- unsigned short itemNameFileOffset;
- };
- unsigned int itemNameFileAddress = 0x9738E0; // JC_JKRAramArchive_getAramAddress_byName(archivePointer, dataString, itemNamesFileName);
- unsigned int itemNameIndexFileAddress = 0x973860; // JC_JKRAramArchive_getAramAddress_byName(archivePointer, dataString, itemNameIndexFileName);
- unsigned char* nameDMAPointer = (unsigned char*) 0x817F0000;
- struct s_itemNameInfo* indexFilePointer = (struct s_itemNameInfo *) 0x817F0000;
- _JW_GetResourceAram(itemNameIndexFileAddress, (unsigned char*) indexFilePointer, 0x80);
- // Item Id Index Table structure:
- // 0: unsigned short beginItemId
- // 2: unsigned short endItemId
- // 4: unsigned short itemNameFileOffset
- unsigned int itemNameFileOffset;
- struct s_itemNameInfo* itemNameInfo = NULL;
- for (int i = 0; i < 18; i++, indexFilePointer++) {
- if (itemId >= indexFilePointer->beginingItemId && itemId <= indexFilePointer->endingItemId) {
- itemNameInfo = indexFilePointer;
- itemNameFileOffset = indexFilePointer->itemNameFileOffset;
- break;
- }
- }
- if (itemNameInfo == NULL) {
- itemNameFileOffset = 0x9B90;
- }
- else if (itemNameInfo->beginingItemId >= 0x2000 && itemNameInfo->beginingItemId < 0x3000) {
- itemNameFileOffset += (itemId - itemNameInfo->beginingItemId) << 4; // or * 16.
- }
- else { // Must be furniture.
- itemNameFileOffset += ((itemId & ~3) - itemNameInfo->beginingItemId) << 2; // only * 4 here since each item is already in increments of four.
- }
- unsigned int itemNameAramAddress = itemNameFileAddress + itemNameFileOffset;
- // Check to see if the ARAM address is 32-bit aligned. If it isn't, it'll cause a DMA exception, so we must align it.
- unsigned int outBufferAdjust = itemNameAramAddress & 0x1F; // Save the remaining offset.
- itemNameAramAddress &= ~0x1F; // Align it to 32 bits.
- _JW_GetResourceAram(itemNameAramAddress, nameDMAPointer, 0x20); // Copy two item names (16 characters each).
- memcopy(outBuffer, nameDMAPointer + outBufferAdjust, 16); // Copy the DMA'd item name into the original output buffer.
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement