// 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.pro;
import java.nio.ByteBuffer;
import org.infinity.datatype.ColorValue;
import org.infinity.datatype.DecNumber;
import org.infinity.datatype.Flag;
import org.infinity.datatype.HashBitmap;
import org.infinity.datatype.IdsBitmap;
import org.infinity.datatype.ResourceRef;
import org.infinity.datatype.Unknown;
import org.infinity.resource.AbstractStruct;
import org.infinity.resource.AddRemovable;
import org.infinity.util.LongIntegerHashMap;
import org.infinity.util.io.StreamUtils;
public final class ProSingleType extends AbstractStruct implements AddRemovable
{
// PRO/Single-specific field labels
public static final String PRO_SINGLE = "Projectile info";
public static final String PRO_SINGLE_FLAGS = "Flags";
public static final String PRO_SINGLE_PRO_ANIMATION = "Projectile animation";
public static final String PRO_SINGLE_SHADOW_ANIMATION = "Shadow animation";
public static final String PRO_SINGLE_PRO_ANIMATION_INDEX = "Projectile animation number";
public static final String PRO_SINGLE_SHADOW_ANIMATION_INDEX = "Shadow animation number";
public static final String PRO_SINGLE_LIGHT_SPOT_INTENSITY = "Light spot intensity";
public static final String PRO_SINGLE_LIGHT_SPOT_WIDTH = "Light spot width";
public static final String PRO_SINGLE_LIGHT_SPOT_HEIGHT = "Light spot height";
public static final String PRO_SINGLE_PALETTE = "Palette";
public static final String PRO_SINGLE_PRO_COLOR_FMT = "Projectile color %d";
public static final String PRO_SINGLE_SMOKE_PUFF_DELAY = "Smoke puff delay";
public static final String PRO_SINGLE_SMOKE_COLOR_FMT = "Smoke color %d";
public static final String PRO_SINGLE_FACE_TARGET_GRANULARITY = "Face target granularity";
public static final String PRO_SINGLE_SMOKE_ANIMATION = "Smoke animation";
public static final String PRO_SINGLE_TRAILING_ANIMATION_FMT = "Trailing animation %d";
public static final String PRO_SINGLE_TRAILING_ANIMATION_DELAY_FMT = "Trailing animation delay %d";
public static final String PRO_SINGLE_TRAIL_FLAGS = "Trail flags";
public static final LongIntegerHashMap<String> m_facetarget = new LongIntegerHashMap<String>();
public static final String[] s_flags = {"No flags set", "Colored BAM", "Creates smoke", "Colored smoke",
"Not light source", "Modify for height", "Casts shadow",
"Light spot enabled", "Translucent", "Mid-level brighten", "Blended"};
public static final String[] s_trail = {"No flags set", "Draw at target", "Draw at source"};
static {
m_facetarget.put(new Long(1), "Do not face target");
m_facetarget.put(new Long(5), "Mirrored east (reduced)");
m_facetarget.put(new Long(9), "Mirrored east (full)");
m_facetarget.put(new Long(16), "Not mirrored (full)");
}
public ProSingleType() throws Exception
{
super(null, PRO_SINGLE, StreamUtils.getByteBuffer(256), 0);
setOffset(256);
}
public ProSingleType(AbstractStruct superStruct, ByteBuffer buffer, int offset) throws Exception
{
super(superStruct, PRO_SINGLE, buffer, offset);
}
//--------------------- Begin Interface AddRemovable ---------------------
@Override
public boolean canRemove()
{
return false; // can not be removed manually
}
//--------------------- End Interface AddRemovable ---------------------
@Override
public int read(ByteBuffer buffer, int offset) throws Exception
{
addField(new Flag(buffer, offset, 4, PRO_SINGLE_FLAGS, s_flags));
addField(new ResourceRef(buffer, offset + 4, PRO_SINGLE_PRO_ANIMATION, "BAM"));
addField(new ResourceRef(buffer, offset + 12, PRO_SINGLE_SHADOW_ANIMATION, "BAM"));
addField(new DecNumber(buffer, offset + 20, 1, PRO_SINGLE_PRO_ANIMATION_INDEX));
addField(new DecNumber(buffer, offset + 21, 1, PRO_SINGLE_SHADOW_ANIMATION_INDEX));
addField(new DecNumber(buffer, offset + 22, 2, PRO_SINGLE_LIGHT_SPOT_INTENSITY));
addField(new DecNumber(buffer, offset + 24, 2, PRO_SINGLE_LIGHT_SPOT_WIDTH));
addField(new DecNumber(buffer, offset + 26, 2, PRO_SINGLE_LIGHT_SPOT_HEIGHT));
addField(new ResourceRef(buffer, offset + 28, PRO_SINGLE_PALETTE, "BMP"));
for (int i = 0; i < 7; i++) {
addField(new ColorValue(buffer, offset + 36 + i, 1, String.format(PRO_SINGLE_PRO_COLOR_FMT, i+1)));
}
addField(new DecNumber(buffer, offset + 43, 1, PRO_SINGLE_SMOKE_PUFF_DELAY));
for (int i = 0; i < 7; i++) {
addField(new ColorValue(buffer, offset + 44 + i, 1, String.format(PRO_SINGLE_SMOKE_COLOR_FMT, i+1)));
}
addField(new HashBitmap(buffer, offset + 51, 1, PRO_SINGLE_FACE_TARGET_GRANULARITY, m_facetarget));
addField(new IdsBitmap(buffer, offset + 52, 2, PRO_SINGLE_SMOKE_ANIMATION, "ANIMATE.IDS"));
for (int i = 0; i < 3; i++) {
addField(new ResourceRef(buffer, offset + 54 + (i * 8),
String.format(PRO_SINGLE_TRAILING_ANIMATION_FMT, i+1), "BAM"));
}
for (int i = 0; i < 3; i++) {
addField(new DecNumber(buffer, offset + 78 + (i * 2), 2,
String.format(PRO_SINGLE_TRAILING_ANIMATION_DELAY_FMT, i+1)));
}
addField(new Flag(buffer, offset + 84, 4, PRO_SINGLE_TRAIL_FLAGS, s_trail));
addField(new Unknown(buffer, offset + 88, 168));
return offset + 256;
}
}