// 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.Flag; import org.infinity.datatype.ResourceRef; import org.infinity.datatype.TextString; import org.infinity.datatype.Unknown; import org.infinity.resource.AbstractStruct; import org.infinity.resource.AddRemovable; import org.infinity.util.io.StreamUtils; public final class Ambient extends AbstractStruct implements AddRemovable { // ARE/Ambient-specific field labels public static final String ARE_AMBIENT = "Ambient"; public static final String ARE_AMBIENT_NAME = "Name"; public static final String ARE_AMBIENT_ORIGIN_X = "Origin: X"; public static final String ARE_AMBIENT_ORIGIN_Y = "Origin: Y"; public static final String ARE_AMBIENT_RADIUS = "Radius"; public static final String ARE_AMBIENT_PITCH_VARIATION = "Pitch variation"; public static final String ARE_AMBIENT_VOLUME_VARIATION = "Volume variation"; public static final String ARE_AMBIENT_VOLUME = "Volume"; public static final String ARE_AMBIENT_SOUND_FMT = "Sound %d"; public static final String ARE_AMBIENT_NUM_SOUNDS = "# sounds"; public static final String ARE_AMBIENT_INTERVAL_BASE = "Base interval"; public static final String ARE_AMBIENT_INTERVAL_VARIATION = "Interval variation"; public static final String ARE_AMBIENT_ACTIVE_AT = "Active at"; public static final String ARE_AMBIENT_FLAGS = "Flags"; public static final String[] s_flag = {"Disabled", "Enabled", "Looping", "Ignore radius", "Play in random order", "High memory ambient"}; Ambient() throws Exception { super(null, ARE_AMBIENT, StreamUtils.getByteBuffer(212), 0); } Ambient(AbstractStruct superStruct, ByteBuffer buffer, int offset, int nr) throws Exception { super(superStruct, ARE_AMBIENT + " " + nr, 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 TextString(buffer, offset, 32, ARE_AMBIENT_NAME)); addField(new DecNumber(buffer, offset + 32, 2, ARE_AMBIENT_ORIGIN_X)); addField(new DecNumber(buffer, offset + 34, 2, ARE_AMBIENT_ORIGIN_Y)); addField(new DecNumber(buffer, offset + 36, 2, ARE_AMBIENT_RADIUS)); // addField(new DecNumber(buffer, offset + 38, 2, "Height (3D)?")); addField(new Unknown(buffer, offset + 38, 2)); addField(new DecNumber(buffer, offset + 40, 4, ARE_AMBIENT_PITCH_VARIATION)); addField(new DecNumber(buffer, offset + 44, 2, ARE_AMBIENT_VOLUME_VARIATION)); addField(new DecNumber(buffer, offset + 46, 2, ARE_AMBIENT_VOLUME)); for (int i = 0; i < 10; i++) { addField(new ResourceRef(buffer, offset + 48 + (i * 8), String.format(ARE_AMBIENT_SOUND_FMT, i+1), "WAV")); } addField(new DecNumber(buffer, offset + 128, 2, ARE_AMBIENT_NUM_SOUNDS)); addField(new Unknown(buffer, offset + 130, 2)); addField(new DecNumber(buffer, offset + 132, 4, ARE_AMBIENT_INTERVAL_BASE)); addField(new DecNumber(buffer, offset + 136, 4, ARE_AMBIENT_INTERVAL_VARIATION)); addField(new Flag(buffer, offset + 140, 4, ARE_AMBIENT_ACTIVE_AT, Actor.s_schedule)); // addField(new HexNumber(buffer, offset + 140, 4, "Day/night presence?")); addField(new Flag(buffer, offset + 144, 4, ARE_AMBIENT_FLAGS, s_flag)); addField(new Unknown(buffer, offset + 148, 64)); return offset + 212; } }