// 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.spl;
import java.nio.ByteBuffer;
import javax.swing.JComponent;
import org.infinity.datatype.Bitmap;
import org.infinity.datatype.DecNumber;
import org.infinity.datatype.ProRef;
import org.infinity.datatype.ResourceRef;
import org.infinity.datatype.SectionCount;
import org.infinity.datatype.Unknown;
import org.infinity.datatype.UnsignDecNumber;
import org.infinity.gui.StructViewer;
import org.infinity.resource.AbstractAbility;
import org.infinity.resource.AbstractStruct;
import org.infinity.resource.AddRemovable;
import org.infinity.resource.Effect;
import org.infinity.resource.HasAddRemovable;
import org.infinity.resource.HasViewerTabs;
import org.infinity.resource.Profile;
import org.infinity.resource.ResourceFactory;
import org.infinity.util.io.StreamUtils;
public final class Ability extends AbstractAbility implements AddRemovable, HasAddRemovable, HasViewerTabs
{
// SPL/Ability-specific field labels (more fields defined in AbstractAbility)
public static final String SPL_ABIL = "Spell ability";
public static final String SPL_ABIL_HOSTILITY = "Hostility";
public static final String SPL_ABIL_MIN_LEVEL = "Minimum level";
public static final String SPL_ABIL_CASTING_SPEED = "Casting speed";
public static final String[] s_hostility = {"Hostile", "", "", "", "Non-hostile"};
public static final String[] s_abilityuse = {"", "", "Spell slots", "", "Innate slots"};
Ability() throws Exception
{
super(null, SPL_ABIL, StreamUtils.getByteBuffer(40), 0);
}
Ability(AbstractStruct superStruct, ByteBuffer buffer, int offset, int number) throws Exception
{
super(superStruct, SPL_ABIL + " " + number, buffer, offset);
}
// --------------------- Begin Interface HasAddRemovable ---------------------
@Override
public AddRemovable[] getAddRemovables() throws Exception
{
return new AddRemovable[]{new Effect()};
}
@Override
public AddRemovable confirmAddEntry(AddRemovable entry) throws Exception
{
return entry;
}
@Override
public boolean confirmRemoveEntry(AddRemovable entry) throws Exception
{
return true;
}
// --------------------- End Interface HasAddRemovable ---------------------
//--------------------- Begin Interface AddRemovable ---------------------
@Override
public boolean canRemove()
{
return true;
}
//--------------------- End Interface AddRemovable ---------------------
// --------------------- Begin Interface HasViewerTabs ---------------------
@Override
public int getViewerTabCount()
{
return 1;
}
@Override
public String getViewerTabName(int index)
{
return StructViewer.TAB_VIEW;
}
@Override
public JComponent getViewerTab(int index)
{
return new ViewerAbility(this);
}
@Override
public boolean viewerTabAddedBefore(int index)
{
return true;
}
// --------------------- End Interface HasViewerTabs ---------------------
@Override
public int read(ByteBuffer buffer, int offset) throws Exception
{
if (Profile.getEngine() == Profile.Engine.PST) {
addField(new Bitmap(buffer, offset, 1, ABILITY_TYPE, s_type));
addField(new Bitmap(buffer, offset + 1, 1, SPL_ABIL_HOSTILITY, s_hostility));
} else {
addField(new Bitmap(buffer, offset, 2, ABILITY_TYPE, s_type));
}
addField(new Bitmap(buffer, offset + 2, 2, ABILITY_LOCATION, s_abilityuse));
addField(new ResourceRef(buffer, offset + 4, ABILITY_ICON, "BAM"));
addField(new Bitmap(buffer, offset + 12, 1, ABILITY_TARGET, s_targettype));
addField(new UnsignDecNumber(buffer, offset + 13, 1, ABILITY_NUM_TARGETS));
addField(new DecNumber(buffer, offset + 14, 2, ABILITY_RANGE));
addField(new DecNumber(buffer, offset + 16, 2, SPL_ABIL_MIN_LEVEL));
addField(new DecNumber(buffer, offset + 18, 2, SPL_ABIL_CASTING_SPEED));
addField(new DecNumber(buffer, offset + 20, 2, ABILITY_HIT_BONUS));
addField(new DecNumber(buffer, offset + 22, 2, ABILITY_DICE_SIZE));
addField(new DecNumber(buffer, offset + 24, 2, ABILITY_DICE_COUNT));
addField(new DecNumber(buffer, offset + 26, 2, ABILITY_DAMAGE_BONUS));
addField(new Bitmap(buffer, offset + 28, 2, ABILITY_DAMAGE_TYPE, s_dmgtype));
addField(new SectionCount(buffer, offset + 30, 2, ABILITY_NUM_EFFECTS, Effect.class));
addField(new DecNumber(buffer, offset + 32, 2, ABILITY_FIRST_EFFECT_INDEX));
addField(new DecNumber(buffer, offset + 34, 2, ABILITY_NUM_CHARGES));
addField(new Unknown(buffer, offset + 36, 2));
if (ResourceFactory.resourceExists("PROJECTL.IDS")) {
addField(new ProRef(buffer, offset + 38, ABILITY_PROJECTILE));
} else if (Profile.getEngine() == Profile.Engine.PST) {
addField(new Bitmap(buffer, offset + 38, 2, ABILITY_PROJECTILE, s_proj_pst));
} else if (Profile.getEngine() == Profile.Engine.IWD || Profile.getEngine() == Profile.Engine.IWD2) {
addField(new Bitmap(buffer, offset + 38, 2, ABILITY_PROJECTILE, s_proj_iwd));
} else {
addField(new Bitmap(buffer, offset + 38, 2, ABILITY_PROJECTILE, s_projectile));
}
return offset + 40;
}
}