Exemplo n.º 1
0
int TileMap::readFromData(const Tbyte* data,
                          TileMapFormat format__,
                          int w__,
                          int h__) {
    int byteCount = 0;

    // Set format data
    format_ = format__;
    w_ = w__;
    h_ = h__;

    // Reinitialize tile array
    reinitializeTileData(w_, h_);

    // Read tile identifiers
    for (int j = 0; j < h_; j++) {
        for (int i = 0; i < w_; i++) {
            // Place in array
            tileData_[i][j] = TileReference(ByteConversion::fromBytes(
                                                data + byteCount,
                                                ByteSizes::uint16Size,
                                                EndiannessTypes::little,
                                                SignednessTypes::nosign));

            byteCount += ByteSizes::uint16Size;
        }
    }

    return byteCount;
}
Exemplo n.º 2
0
int TileMap::readFromData(const Tbyte* data,
                          TileMapFormat format__,
                          int w__,
                          int h__,
                          Tbyte upperByte__) {
    int byteCount = 0;

    // Set format data
    format_ = format__;
    w_ = w__;
    h_ = h__;

    // Set limits based on upper byte (0 bit = 9th bit of tile num)
    if ((upperByte__ & 0x01) == 0) {
        lowerLimit_ = 0;
        upperLimit_ = 256;
    }
    else {
        lowerLimit_ = 256;
        upperLimit_ = 512;
    }

    // Reinitialize tile array
    reinitializeTileData(w_, h_);

    // Read tile identifiers
    for (int j = 0; j < h_; j++) {
        for (int i = 0; i < w_; i++) {
            // Read low byte of identifier
            unsigned int identifier = ByteConversion::fromBytes(
                                          data + byteCount,
                                          ByteSizes::uint8Size,
                                          EndiannessTypes::little,
                                          SignednessTypes::nosign);

            // Incorporate upper byte
            identifier |= (((unsigned int)(upperByte__)) << 8);

            // Place in array
            tileData_[i][j] = TileReference(identifier);

            byteCount += ByteSizes::uint8Size;
        }
    }

    return byteCount;
}
Exemplo n.º 3
0
int MetatileStructureSet::readFromData(LoadedROM& rom,
                                               Taddress address__) {
  address_ = address__;
  
  // Count of read bytes
  int byteCount = 0;
                                               
  // Get bank number of the table
  int tableBankNum = LoadedROM::directToBankNum(address__);
  
  // Compute table size.
  // The first address in the index always points to the first
  // structure definition
  Taddress contentStartBankedAddress = ByteConversion::fromBytes(
        rom.directRead(address__),
        ByteSizes::uint16Size,
        EndiannessTypes::little,
        SignednessTypes::nosign);
  
  // Convert to direct address
  Taddress contentStartAddress = 0;
  if (contentStartBankedAddress == invalidStructureToken) {
    contentStartAddress = invalidRepairAddress;
  }
  else {
    contentStartAddress = LoadedROM::getDirectAddress(
                                              tableBankNum,
                                              contentStartBankedAddress);
  }
  
  // Get size of index, given by ((tableStart - indexStart) / entrySize)
  int indexEntries = (contentStartAddress - address__) / ByteSizes::uint16Size;
  
  // Read the index.
  // Remember the highest index we encounter
  int highestIndex = 0;
  for (int i = 0; i < indexEntries; i++) {
    // Get banked address
    Taddress entryBankedAddress = ByteConversion::fromBytes(
          rom.directRead(address__ + (i * ByteSizes::uint16Size)),
          ByteSizes::uint16Size,
          EndiannessTypes::little,
          SignednessTypes::nosign);
    byteCount += ByteSizes::uint16Size;
    
    // Convert to direct address
    int entryAddress = 0;
    // If address is invalid, repair
    if (entryBankedAddress == invalidStructureToken) {
//      std::cout << contentStartAddress << std::endl;
      entryAddress = invalidRepairAddress
                             + (i * MetatileStructure::dataSize);
    }
    else {
      entryAddress = LoadedROM::getDirectAddress(
                                        tableBankNum,
                                        entryBankedAddress);
    }
    
    // Compute the actual index this address corresponds to
    int structureIndex = (entryAddress - contentStartAddress)
          / MetatileStructure::dataSize;
    
    // Add mapping to index map
    index_.insert(MetatileIndexToStructurePair(i, structureIndex));
    
    if (structureIndex > highestIndex) {
      highestIndex = structureIndex;
    }
  }
  
  // Increment highest index (we're using it as a limit for the read loop)
  ++highestIndex;
  
  // Read the structure definitions.
  // The highest index indicates the actual number of structure definitions
  // in the table
  for (int i = 0; i < highestIndex; i++) {
    // Read each metatile
    MetatileStructure metatile;
    metatile.readFromData(rom.directRead(contentStartAddress
                            + (i * MetatileStructure::dataSize)));
    
    // If reading invalid table, repair tiles
    if (contentStartAddress == invalidRepairAddress) {
//      std::cout << highestIndex << std::endl;
      metatile.upperLeft() = TileReference(invalidRepairTile);
      metatile.upperRight() = TileReference(invalidRepairTile);
      metatile.lowerLeft() = TileReference(invalidRepairTile);
      metatile.lowerRight() = TileReference(invalidRepairTile);
    }
    
    // Add to content
    primaryStorage_.push_back(metatile);
    
    byteCount += MetatileStructure::dataSize;
  }
  
  // HACK: (sort of) Add dummy entries to fill rest of set.
  // This fixes issues that I think are caused by out-of-range
  // values in the index.
//  while (primaryStorage_.size() < 256) {
//    primaryStorage_.push_back(MetatileStructure());
//  }
  
  return byteCount;
}