// 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.are; import java.nio.ByteBuffer; import org.infinity.datatype.DecNumber; import org.infinity.datatype.IdsBitmap; import org.infinity.datatype.ProRef; import org.infinity.datatype.ResourceRef; import org.infinity.datatype.SectionOffset; import org.infinity.resource.AbstractStruct; import org.infinity.resource.AddRemovable; import org.infinity.util.io.StreamUtils; public final class ProTrap extends AbstractStruct implements AddRemovable { // ARE/Projectile Trap-specific field labels public static final String ARE_PROTRAP = "Projectile trap"; public static final String ARE_PROTRAP_TRAP = "Trap"; public static final String ARE_PROTRAP_OFFSET_EFFECTS = "Effects list offset"; public static final String ARE_PROTRAP_EFFECTS_SIZE = "Effects list size"; public static final String ARE_PROTRAP_PROJECTILE = "Projectile"; public static final String ARE_PROTRAP_EXPLOSION_FREQUENCY = "Explosion frequency (frames)"; public static final String ARE_PROTRAP_DURATION = "Duration"; public static final String ARE_PROTRAP_LOCATION_X = "Location: X"; public static final String ARE_PROTRAP_LOCATION_Y = "Location: Y"; public static final String ARE_PROTRAP_LOCATION_Z = "Location: Z"; public static final String ARE_PROTRAP_TARGET = "Target"; public static final String ARE_PROTRAP_PORTRAIT = "Portrait"; ProTrap() throws Exception { super(null, ARE_PROTRAP, StreamUtils.getByteBuffer(28), 0); } ProTrap(AbstractStruct superStruct, ByteBuffer buffer, int offset, int number) throws Exception { super(superStruct, ARE_PROTRAP + " " + number, buffer, offset); } //--------------------- Begin Interface AddRemovable --------------------- @Override public boolean canRemove() { return true; } //--------------------- End Interface AddRemovable --------------------- @Override public int read(ByteBuffer buffer, int offset) throws Exception { addField(new ResourceRef(buffer, offset, ARE_PROTRAP_TRAP, "PRO")); SectionOffset ofsEffects = new SectionOffset(buffer, offset + 8, ARE_PROTRAP_OFFSET_EFFECTS, null); addField(ofsEffects); // Mac ToB doesn't save these right, so EFFs not handled DecNumber sizeEffects = new DecNumber(buffer, offset + 12, 2, ARE_PROTRAP_EFFECTS_SIZE); addField(sizeEffects); addField(new ProRef(buffer, offset + 14, 2, ARE_PROTRAP_PROJECTILE)); addField(new DecNumber(buffer, offset + 16, 2, ARE_PROTRAP_EXPLOSION_FREQUENCY)); addField(new DecNumber(buffer, offset + 18, 2, ARE_PROTRAP_DURATION)); addField(new DecNumber(buffer, offset + 20, 2, ARE_PROTRAP_LOCATION_X)); addField(new DecNumber(buffer, offset + 22, 2, ARE_PROTRAP_LOCATION_Y)); addField(new DecNumber(buffer, offset + 24, 2, ARE_PROTRAP_LOCATION_Z)); addField(new IdsBitmap(buffer, offset + 26, 1, ARE_PROTRAP_TARGET, "EA.IDS")); addField(new DecNumber(buffer, offset + 27, 1, ARE_PROTRAP_PORTRAIT)); if (ofsEffects.getValue() > 0 && sizeEffects.getValue() > 0) { int curOffset = ofsEffects.getValue(); int endOffset = curOffset + sizeEffects.getValue(); int number = 0; while (curOffset < endOffset) { ProEffect pe = new ProEffect(this, buffer, curOffset, number++); curOffset = pe.getEndOffset(); addField(pe); } } return offset + 28; } }