// 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.gam;
import java.nio.ByteBuffer;
import org.infinity.datatype.DecNumber;
import org.infinity.datatype.HexNumber;
import org.infinity.datatype.ResourceRef;
import org.infinity.resource.AbstractStruct;
public final class Familiar extends AbstractStruct
{
// GAM/Familiar-specific field labels
public static final String GAM_FAMILIAR = "Familiar info";
public static final String GAM_FAMILIAR_LG = "Lawful good";
public static final String GAM_FAMILIAR_LN = "Lawful neutral";
public static final String GAM_FAMILIAR_LE = "Lawful evil";
public static final String GAM_FAMILIAR_NG = "Neutral good";
public static final String GAM_FAMILIAR_TN = "True neutral";
public static final String GAM_FAMILIAR_NE = "Neutral evil";
public static final String GAM_FAMILIAR_CG = "Chaotic good";
public static final String GAM_FAMILIAR_CN = "Chaotic neutral";
public static final String GAM_FAMILIAR_CE = "Chaotic evil";
public static final String GAM_FAMILIAR_OFFSET_RESOURCES = "Familiar resources offset";
public static final String GAM_FAMILIAR_COUNT_FMT = "%s level %d familiar count";
public static final String GAM_FAMILIAR_RESOURCE_FMT = "Familiar resource %d";
public static final String[] ALIGNMENT_LABELS = { "LG", "LN", "CG", "NG", "TN", "NE", "LE", "CN", "CE" };
Familiar(AbstractStruct superStruct, ByteBuffer buffer, int offset) throws Exception
{
super(superStruct, GAM_FAMILIAR, buffer, offset);
}
@Override
public int read(ByteBuffer buffer, int offset) throws Exception
{
addField(new ResourceRef(buffer, offset, GAM_FAMILIAR_LG, "CRE"));
addField(new ResourceRef(buffer, offset + 8, GAM_FAMILIAR_LN, "CRE"));
addField(new ResourceRef(buffer, offset + 16, GAM_FAMILIAR_LE, "CRE"));
addField(new ResourceRef(buffer, offset + 24, GAM_FAMILIAR_NG, "CRE"));
addField(new ResourceRef(buffer, offset + 32, GAM_FAMILIAR_TN, "CRE"));
addField(new ResourceRef(buffer, offset + 40, GAM_FAMILIAR_NE, "CRE"));
addField(new ResourceRef(buffer, offset + 48, GAM_FAMILIAR_CG, "CRE"));
addField(new ResourceRef(buffer, offset + 56, GAM_FAMILIAR_CN, "CRE"));
addField(new ResourceRef(buffer, offset + 64, GAM_FAMILIAR_CE, "CRE"));
HexNumber offEOS = new HexNumber(buffer, offset + 72, 4, GAM_FAMILIAR_OFFSET_RESOURCES);
addField(offEOS);
offset += 76;
// To be confirmed: I've never seen these fields in use
int numFamiliarExtra = 0;
for (final String align: ALIGNMENT_LABELS) {
for (int i = 1; i < 10; i++) {
DecNumber familiarCount = new DecNumber(buffer, offset, 4,
String.format(GAM_FAMILIAR_COUNT_FMT, align, i));
numFamiliarExtra += familiarCount.getValue();
addField(familiarCount);
offset += 4;
}
}
if (numFamiliarExtra > 0) {
int curOffset = offEOS.getValue();
for (int i = 0; i < numFamiliarExtra; i++) {
addField(new ResourceRef(buffer, curOffset, String.format(GAM_FAMILIAR_RESOURCE_FMT, i), "CRE"));
curOffset += 8;
}
}
return offset;
}
void updateFilesize(DecNumber filesize)
{
DecNumber fs = (DecNumber)getAttribute(GAM_FAMILIAR_OFFSET_RESOURCES);
fs.setValue(filesize.getValue());
}
}