// 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.Bitmap; import org.infinity.datatype.DecNumber; import org.infinity.datatype.Flag; import org.infinity.datatype.SpawnResourceRef; import org.infinity.datatype.TextString; import org.infinity.datatype.Unknown; import org.infinity.resource.AbstractStruct; import org.infinity.resource.AddRemovable; import org.infinity.resource.Profile; import org.infinity.util.io.StreamUtils; public final class SpawnPoint extends AbstractStruct implements AddRemovable { // ARE/Spawn Point-specific field labels public static final String ARE_SPAWN = "Spawn point"; public static final String ARE_SPAWN_NAME = "Name"; public static final String ARE_SPAWN_LOCATION_X = "Location: X"; public static final String ARE_SPAWN_LOCATION_Y = "Location: Y"; public static final String ARE_SPAWN_CREATURE_FMT = "Creature %d"; public static final String ARE_SPAWN_NUM_CREATURES = "# creatures"; public static final String ARE_SPAWN_ENCOUNTER_DIFFICULTY = "Encounter difficulty"; public static final String ARE_SPAWN_RATE = "Spawn rate"; public static final String ARE_SPAWN_METHOD = "Spawn method"; public static final String ARE_SPAWN_DURATION = "Creature duration"; public static final String ARE_SPAWN_WANDER_DISTANCE = "Creature wander distance"; public static final String ARE_SPAWN_FOLLOW_DISTANCE = "Creature follow distance"; public static final String ARE_SPAWN_MAX_CREATURES = "Maximum spawned creatures"; public static final String ARE_SPAWN_ACTIVE = "Is active?"; public static final String ARE_SPAWN_ACTIVE_AT = "Active at"; public static final String ARE_SPAWN_PROBABILITY_DAY = "Probability (day)"; public static final String ARE_SPAWN_PROBABILITY_NIGHT = "Probability (night)"; public static final String ARE_SPAWN_FREQUENCY = "Spawn frequency"; public static final String ARE_SPAWN_COUNTDOWN = "Countdown"; public static final String ARE_SPAWN_WEIGHT_FMT = "Spawn weight %d"; public static final String[] s_noyes = { "No", "Yes" }; public static final String[] s_method = {"No flags set", "Spawn until paused", "Disable after spawn", "Spawn paused"}; SpawnPoint() throws Exception { super(null, ARE_SPAWN, StreamUtils.getByteBuffer(200), 0); } SpawnPoint(AbstractStruct superStruct, ByteBuffer buffer, int offset, int number) throws Exception { super(superStruct, ARE_SPAWN + " " + 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 TextString(buffer, offset, 32, ARE_SPAWN_NAME)); addField(new DecNumber(buffer, offset + 32, 2, ARE_SPAWN_LOCATION_X)); addField(new DecNumber(buffer, offset + 34, 2, ARE_SPAWN_LOCATION_Y)); for (int i = 0; i < 10; i++) { addField(new SpawnResourceRef(buffer, offset + 36 + (i * 8), String.format(ARE_SPAWN_CREATURE_FMT, i+1))); } addField(new DecNumber(buffer, offset + 116, 2, ARE_SPAWN_NUM_CREATURES)); addField(new DecNumber(buffer, offset + 118, 2, ARE_SPAWN_ENCOUNTER_DIFFICULTY)); addField(new DecNumber(buffer, offset + 120, 2, ARE_SPAWN_RATE)); addField(new Flag(buffer, offset + 122, 2, ARE_SPAWN_METHOD, s_method)); addField(new DecNumber(buffer, offset + 124, 4, ARE_SPAWN_DURATION)); addField(new DecNumber(buffer, offset + 128, 2, ARE_SPAWN_WANDER_DISTANCE)); addField(new DecNumber(buffer, offset + 130, 2, ARE_SPAWN_FOLLOW_DISTANCE)); addField(new DecNumber(buffer, offset + 132, 2, ARE_SPAWN_MAX_CREATURES)); addField(new Bitmap(buffer, offset + 134, 2, ARE_SPAWN_ACTIVE, s_noyes)); addField(new Flag(buffer, offset + 136, 4, ARE_SPAWN_ACTIVE_AT, Actor.s_schedule)); addField(new DecNumber(buffer, offset + 140, 2, ARE_SPAWN_PROBABILITY_DAY)); addField(new DecNumber(buffer, offset + 142, 2, ARE_SPAWN_PROBABILITY_NIGHT)); if (Profile.isEnhancedEdition()) { addField(new DecNumber(buffer, offset + 144, 4, ARE_SPAWN_FREQUENCY)); addField(new DecNumber(buffer, offset + 148, 4, ARE_SPAWN_COUNTDOWN)); for (int i = 0; i < 10; i++) { addField(new DecNumber(buffer, offset + 152 + i, 1, String.format(ARE_SPAWN_WEIGHT_FMT, i+1))); } addField(new Unknown(buffer, offset + 162, 38)); } else { addField(new Unknown(buffer, offset + 144, 56)); } return offset + 200; } }