// Near Infinity - An Infinity Engine Browser and Editor
// Copyright (C) 2001 - 2005 Jon Olav Hauglid
// See LICENSE.txt for license information
package org.infinity.resource.wmp;
import java.nio.ByteBuffer;
import javax.swing.JComponent;
import org.infinity.datatype.DecNumber;
import org.infinity.datatype.Flag;
import org.infinity.datatype.ResourceRef;
import org.infinity.datatype.SectionCount;
import org.infinity.datatype.SectionOffset;
import org.infinity.datatype.StringRef;
import org.infinity.datatype.Unknown;
import org.infinity.gui.StructViewer;
import org.infinity.resource.AbstractStruct;
import org.infinity.resource.HasViewerTabs;
import org.infinity.resource.Profile;
final class MapEntry extends AbstractStruct implements HasViewerTabs
{
// WMP/MapEntry-specific field labels
public static final String WMP_MAP = "Map";
public static final String WMP_MAP_RESREF = "Map";
public static final String WMP_MAP_WIDTH = "Width";
public static final String WMP_MAP_HEIGHT = "Height";
public static final String WMP_MAP_ID = "Map ID";
public static final String WMP_MAP_NAME = "Name";
public static final String WMP_MAP_CENTER_X = "Center location: X";
public static final String WMP_MAP_CENTER_Y = "Center location: Y";
public static final String WMP_MAP_NUM_AREAS = "# areas";
public static final String WMP_MAP_OFFSET_AREAS = "Areas offset";
public static final String WMP_MAP_OFFSET_AREA_LINKS = "Area links offset";
public static final String WMP_MAP_NUM_AREA_LINKS = "# area links";
public static final String WMP_MAP_ICONS = "Map icons";
private static final String[] s_flag = {"No flags set", "Colored icon", "Ignore palette"};
MapEntry(AbstractStruct superStruct, ByteBuffer buffer, int offset, int nr) throws Exception
{
super(superStruct, WMP_MAP + " " + nr, buffer, offset);
}
// --------------------- Begin Interface HasViewerTabs ---------------------
@Override
public int getViewerTabCount()
{
return 1;
}
@Override
public String getViewerTabName(int index)
{
return StructViewer.TAB_VIEW;
}
@Override
public JComponent getViewerTab(int index)
{
return new ViewerMap(this);
}
@Override
public boolean viewerTabAddedBefore(int index)
{
return true;
}
// --------------------- End Interface HasViewerTabs ---------------------
@Override
public int read(ByteBuffer buffer, int offset) throws Exception
{
addField(new ResourceRef(buffer, offset, WMP_MAP_RESREF, "MOS"));
addField(new DecNumber(buffer, offset + 8, 4, WMP_MAP_WIDTH));
addField(new DecNumber(buffer, offset + 12, 4, WMP_MAP_HEIGHT));
addField(new DecNumber(buffer, offset + 16, 4, WMP_MAP_ID));
addField(new StringRef(buffer, offset + 20, WMP_MAP_NAME));
addField(new DecNumber(buffer, offset + 24, 4, WMP_MAP_CENTER_X));
addField(new DecNumber(buffer, offset + 28, 4, WMP_MAP_CENTER_Y));
SectionCount area_count = new SectionCount(buffer, offset + 32, 4, WMP_MAP_NUM_AREAS, AreaEntry.class);
addField(area_count);
SectionOffset area_offset = new SectionOffset(buffer, offset + 36, WMP_MAP_OFFSET_AREAS, AreaEntry.class);
addField(area_offset);
SectionOffset link_offset = new SectionOffset(buffer, offset + 40, WMP_MAP_OFFSET_AREA_LINKS, AreaLink.class);
addField(link_offset);
SectionCount link_count = new SectionCount(buffer, offset + 44, 4, WMP_MAP_NUM_AREA_LINKS, AreaLink.class);
addField(link_count);
addField(new ResourceRef(buffer, offset + 48, WMP_MAP_ICONS, "BAM"));
if (Profile.isEnhancedEdition()) {
addField(new Flag(buffer, offset + 56, 4, "Flags", s_flag));
addField(new Unknown(buffer, offset + 60, 124));
} else {
addField(new Unknown(buffer, offset + 56, 128));
}
int curOfs = area_offset.getValue();
for (int i = 0; i < area_count.getValue(); i++) {
AreaEntry areaEntry = new AreaEntry(this, buffer, curOfs, i);
curOfs = areaEntry.getEndOffset();
addField(areaEntry);
areaEntry.readLinks(buffer, link_offset);
}
return offset + 128 + 56;
}
}