Advertisement
Moolah60

mIN_copy_name_str.c

Jan 12th, 2019
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.42 KB | None | 0 0
  1. #define NULL 0
  2.  
  3. extern void* _JW_GetResourceAram(unsigned int aramAddress, unsigned char* outBuffer, int dmaSize);
  4. extern void memcopy(unsigned char* outBuffer, unsigned char* sourceBuffer, int copySize);
  5.  
  6. void mIN_copy_name_str(unsigned char* outBuffer, unsigned short itemId) {
  7.  
  8.     struct s_itemNameInfo {
  9.         unsigned short beginingItemId;
  10.         unsigned short endingItemId;
  11.         unsigned short itemNameFileOffset;
  12.     };
  13.  
  14.     unsigned int itemNameFileAddress = 0x9738E0; // JC_JKRAramArchive_getAramAddress_byName(archivePointer, dataString, itemNamesFileName);
  15.     unsigned int itemNameIndexFileAddress = 0x973860; // JC_JKRAramArchive_getAramAddress_byName(archivePointer, dataString, itemNameIndexFileName);
  16.    
  17.     unsigned char* nameDMAPointer = (unsigned char*) 0x817F0000;
  18.     struct s_itemNameInfo* indexFilePointer = (struct s_itemNameInfo *) 0x817F0000;
  19.     _JW_GetResourceAram(itemNameIndexFileAddress, (unsigned char*) indexFilePointer, 0x80);
  20.    
  21.     // Item Id Index Table structure:
  22.     //  0: unsigned short beginItemId
  23.     //  2: unsigned short endItemId
  24.     //  4: unsigned short itemNameFileOffset
  25.    
  26.     unsigned int itemNameFileOffset;
  27.     struct s_itemNameInfo* itemNameInfo = NULL;
  28.    
  29.     for (int i = 0; i < 18; i++, indexFilePointer++) {
  30.         if (itemId >= indexFilePointer->beginingItemId && itemId <= indexFilePointer->endingItemId) {
  31.             itemNameInfo = indexFilePointer;
  32.             itemNameFileOffset = indexFilePointer->itemNameFileOffset;
  33.             break;
  34.         }
  35.     }
  36.  
  37.     if (itemNameInfo == NULL) {
  38.         itemNameFileOffset = 0x9B90;
  39.     }
  40.     else if (itemNameInfo->beginingItemId >= 0x2000 && itemNameInfo->beginingItemId < 0x3000) {
  41.         itemNameFileOffset += (itemId - itemNameInfo->beginingItemId) << 4; // or * 16.
  42.     }
  43.     else { // Must be furniture.
  44.         itemNameFileOffset += ((itemId & ~3) - itemNameInfo->beginingItemId) << 2; // only * 4 here since each item is already in increments of four.
  45.     }
  46.    
  47.     unsigned int itemNameAramAddress = itemNameFileAddress + itemNameFileOffset;   
  48.  
  49.     // 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.
  50.     unsigned int outBufferAdjust = itemNameAramAddress & 0x1F; // Save the remaining offset.
  51.     itemNameAramAddress &= ~0x1F; // Align it to 32 bits.
  52.    
  53.     _JW_GetResourceAram(itemNameAramAddress, nameDMAPointer, 0x20); // Copy two item names (16 characters each).
  54.     memcopy(outBuffer, nameDMAPointer + outBufferAdjust, 16); // Copy the DMA'd item name into the original output buffer.
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement