Example #1
0
  void loadHeader(LShrinkArray in) throws BadParameter {

    // Gamebryo header
    if (SPGlobal.debugNIFimport) {
      SPGlobal.logSync(header, "Loading nif file");
    }
    if (!in.getString(20).equals("Gamebryo File Format")) {
      byte first = in.extract(1)[0];
      if (!in.extractString((int) first, 20).equals("Gamebryo File Format")) {
        throw new BadParameter(fileName + " was not a NIF file.");
      }
    }

    in.extractLine();

    // BlockTypes
    numBlocks = in.extractInt(9, 4);
    if (SPGlobal.debugNIFimport && SPGlobal.logging()) {
      SPGlobal.logSync(header, "Num Blocks: " + numBlocks);
    }
    in.skip(in.extractInt(4, 1)); // Author name
    in.skip(in.extractInt(1)); // Export Info 1
    in.skip(in.extractInt(1)); // Export Info 2
    int numBlockTypes = in.extractInt(2);
    if (SPGlobal.debugNIFimport && SPGlobal.logging()) {
      SPGlobal.logSync(header, "Num Block Types: " + numBlockTypes);
    }
    blockTypes = new ArrayList<>(numBlockTypes);
    for (int i = 0; i < numBlockTypes; i++) {
      String blockType = in.extractString(in.extractInt(4));
      blockTypes.add(blockType);
      if (SPGlobal.debugNIFimport && SPGlobal.logging()) {
        SPGlobal.logSync(header, "  Added block type[" + i + "]: " + blockType);
      }
    }

    // Blocks list
    if (SPGlobal.debugNIFimport && SPGlobal.logging()) {
      SPGlobal.logSync(header, "Block Type list: ");
    }
    nodes = new ArrayList<>(numBlocks);
    for (int i = 0; i < numBlocks; i++) {
      int type = in.extractInt(2);
      Node n = new Node(NodeType.SPvalueOf(blockTypes.get(type)));
      n.number = i;
      nodes.add(n);
      if (SPGlobal.debugNIFimport && SPGlobal.logging()) {
        SPGlobal.logSync(
            header,
            "  Block list[" + i + "] has block type: " + type + ", " + blockTypes.get(type));
      }
    }

    // Block lengths
    for (int i = 0; i < numBlocks; i++) {
      nodes.get(i).size = in.extractInt(4);
    }

    if (SPGlobal.debugNIFimport && SPGlobal.logging()) {
      SPGlobal.logSync(header, "Block headers: ");
      for (int i = 0; i < numBlocks; i++) {
        SPGlobal.logSync(
            header,
            "  ["
                + i
                + "]: "
                + nodes.get(i).type
                + ", length: "
                + Ln.prettyPrintHex(nodes.get(i).size));
      }
    }

    // Strings
    if (SPGlobal.debugNIFimport && SPGlobal.logging()) {
      SPGlobal.logSync(header, "Block Titles: ");
    }
    int numStrings = in.extractInt(4);
    in.skip(4); // max Length string
    ArrayList<String> strings = new ArrayList<>(numStrings);
    for (int i = 0; i < numStrings; i++) {
      strings.add(in.extractString(in.extractInt(4)));
    }
    in.skip(4); // unknown int

    for (int i = 0; i < numBlocks; i++) {
      nodes.get(i).data = new LShrinkArray(in, nodes.get(i).size);
      in.skip(nodes.get(i).size);
    }

    // Set titles
    for (int i = 0; i < numBlocks; i++) {
      NodeType type = nodes.get(i).type;
      if (type == NodeType.NINODE
          || type == NodeType.NITRISHAPE
          || type == NodeType.BSINVMARKER
          || type == NodeType.BSBEHAVIORGRAPHEXTRADATA) {
        Node n = nodes.get(i);
        int stringIndex = n.data.getInts(0, 4)[0];
        n.title = strings.get(stringIndex);
        if (SPGlobal.debugNIFimport && SPGlobal.logging()) {
          SPGlobal.log(
              header, "  [" + i + "]: " + nodes.get(i).type + ", string: " + nodes.get(i).title);
        }
      }
    }
  }