// 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.dlg; import java.nio.ByteBuffer; import org.infinity.datatype.DecNumber; import org.infinity.datatype.Flag; import org.infinity.datatype.ResourceRef; import org.infinity.datatype.StringRef; import org.infinity.resource.AbstractStruct; import org.infinity.resource.AddRemovable; import org.infinity.util.io.StreamUtils; public final class Transition extends AbstractStruct implements AddRemovable { // DLG/Transition-specific field labels public static final String DLG_TRANS = "Response"; public static final String DLG_TRANS_FLAGS = "Flags"; public static final String DLG_TRANS_TEXT = "Associated text"; public static final String DLG_TRANS_JOURNAL_ENTRY = "Journal entry"; public static final String DLG_TRANS_TRIGGER_INDEX = "Trigger index"; public static final String DLG_TRANS_ACTION_INDEX = "Action index"; public static final String DLG_TRANS_NEXT_DIALOG = "Next dialogue"; public static final String DLG_TRANS_NEXT_DIALOG_STATE = "Next dialogue state"; private static final String[] s_flag = {"No flags set", "Text associated", "Trigger", "Action", "Terminates dialogue", "Journal entry", "", "Add unsolved quest", "Add journal note", "Add solved quest"}; private int nr; Transition() throws Exception { super(null, DLG_TRANS, StreamUtils.getByteBuffer(32), 0); } Transition(AbstractStruct superStruct, ByteBuffer buffer, int offset, int nr) throws Exception { super(superStruct, DLG_TRANS + " " + nr, buffer, offset); this.nr = nr; } public int getActionIndex() { if (getFlag().isFlagSet(2)) { return ((DecNumber)getAttribute(DLG_TRANS_ACTION_INDEX)).getValue(); } else { return -1; } } public StringRef getAssociatedText() { return (StringRef)getAttribute(DLG_TRANS_TEXT); } public Flag getFlag() { return (Flag)getAttribute(DLG_TRANS_FLAGS); } public StringRef getJournalEntry() { return (StringRef)getAttribute(DLG_TRANS_JOURNAL_ENTRY); } public ResourceRef getNextDialog() { return (ResourceRef)getAttribute(DLG_TRANS_NEXT_DIALOG); } public int getNextDialogState() { return ((DecNumber)getAttribute(DLG_TRANS_NEXT_DIALOG_STATE)).getValue(); } public int getNumber() { return nr; } public int getTriggerIndex() { if (getFlag().isFlagSet(1)) { return ((DecNumber)getAttribute(DLG_TRANS_TRIGGER_INDEX)).getValue(); } else { return -1; } } //--------------------- Begin Interface AddRemovable --------------------- @Override public boolean canRemove() { return true; } //--------------------- End Interface AddRemovable --------------------- @Override public int read(ByteBuffer buffer, int offset) throws Exception { addField(new Flag(buffer, offset, 4, DLG_TRANS_FLAGS, s_flag)); addField(new StringRef(buffer, offset + 4, DLG_TRANS_TEXT)); addField(new StringRef(buffer, offset + 8, DLG_TRANS_JOURNAL_ENTRY)); addField(new DecNumber(buffer, offset + 12, 4, DLG_TRANS_TRIGGER_INDEX)); addField(new DecNumber(buffer, offset + 16, 4, DLG_TRANS_ACTION_INDEX)); addField(new ResourceRef(buffer, offset + 20, DLG_TRANS_NEXT_DIALOG, "DLG")); addField(new DecNumber(buffer, offset + 28, 4, DLG_TRANS_NEXT_DIALOG_STATE)); return offset + 32; } }