661 lines
32 KiB
Java
661 lines
32 KiB
Java
package prc.utils;
|
|
|
|
import prc.autodoc.*;
|
|
|
|
import java.io.File;
|
|
import java.util.ArrayList;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
|
|
import static prc.Main.spinner;
|
|
|
|
/**
|
|
*
|
|
*/
|
|
public final class SpellbookMaker {
|
|
private SpellbookMaker() {/* Prevent instantiation */}
|
|
|
|
private static int spells2daRow = 0;
|
|
private static int feat2daRow = 0;
|
|
private static int iprp_feats2daRow = 0;
|
|
private static int tlkRow = 0;
|
|
private static int classSpellRow = 0;
|
|
private static int classFeatRow = 0;
|
|
private static int subradialID = 7000;
|
|
private static Data_2da classes2da;
|
|
private static Data_2da spells2da;
|
|
private static Data_2da feat2da;
|
|
private static Data_2da iprp_feats2da;
|
|
private static Data_TLK customtlk;
|
|
private static Data_TLK dialogtlk;
|
|
private static Data_2da classSpell2da;
|
|
private static Data_2da classFeat2da;
|
|
private static String[] spellLabels;
|
|
|
|
private static final int MAGIC_TLK = 0x01000000;
|
|
|
|
/**
|
|
* The main method, as usual.
|
|
*
|
|
* @param args do I really need to explain this?
|
|
* @throws Exception this is a simple tool, just let all failures blow up
|
|
*/
|
|
public static void main(String[] args) throws Exception {
|
|
// Parse args
|
|
for (String param : args) {//[--help]
|
|
// Parameter parseage
|
|
if (param.startsWith("-")) {
|
|
if (param.equals("--help")) readMe();
|
|
else {
|
|
for (char c : param.substring(1).toCharArray()) {
|
|
switch (c) {
|
|
default:
|
|
System.out.println("Unknown parameter: " + c);
|
|
readMe();
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
System.out.println("Unknown parameter: " + param);
|
|
readMe();
|
|
}
|
|
}
|
|
|
|
|
|
//load all the data files in advance
|
|
//this is quite slow, but needed
|
|
classes2da = Data_2da.load2da("2das" + File.separator + "classes.2da", true);
|
|
spells2da = Data_2da.load2da("2das" + File.separator + "spells.2da", true);
|
|
feat2da = Data_2da.load2da("2das" + File.separator + "feat.2da", true);
|
|
iprp_feats2da = Data_2da.load2da("2das" + File.separator + "iprp_feats.2da", true);
|
|
customtlk = new Data_TLK("tlk" + File.separator + "prc8_consortium.tlk");
|
|
dialogtlk = new Data_TLK("tlk" + File.separator + "dialog.tlk");
|
|
spellLabels = spells2da.getLabels();
|
|
|
|
//get the start/end rows for each file for the reserved blocks
|
|
getFirstSpells2daRow();
|
|
getFirstFeat2daRow();
|
|
getFirstIPRPFeats2daRow();
|
|
getFirstTlkRow();
|
|
System.out.println("First free spells.2da row is " + spells2daRow);
|
|
System.out.println("First free feat.2da row is " + feat2daRow);
|
|
System.out.println("First free iprp_feats.2da row is " + iprp_feats2daRow);
|
|
System.out.println("First free tlk row is " + tlkRow);
|
|
|
|
//now process each class in turn
|
|
for (int classRow = 0; classRow < classes2da.getEntryCount(); classRow++) {
|
|
//the feat file is the root of the file naming layout
|
|
String classfilename = classes2da.getEntry("FeatsTable", classRow);
|
|
|
|
//check its a real class not padding
|
|
if (classfilename != null && classfilename.length() > 9) {
|
|
classfilename = classfilename.substring(9);
|
|
String classCoreFilename = "cls_spcr_" + classfilename;
|
|
|
|
//check the file exists
|
|
File classCoreFile = new File("2das" + File.separator + classCoreFilename + ".2da");
|
|
|
|
if (classCoreFile.exists()) {
|
|
//open the core spell file
|
|
Data_2da classCoreSpell2da = Data_2da.load2da(classCoreFile.getPath(), true);
|
|
|
|
// If the cls_spell file for this class does not exist yet, create it
|
|
File classSpell2daFile = new File("2das" + File.separator + "cls_spell_" + classfilename + ".2da");
|
|
if (!classSpell2daFile.exists()) {
|
|
System.out.println("File " + classSpell2daFile.getPath() + " did not exist, creating");
|
|
classSpell2da = new Data_2da("cls_spell_" + classfilename, "");
|
|
classSpell2da.addColumn("Label");
|
|
classSpell2da.addColumn("Level");
|
|
classSpell2da.addColumn("FeatID");
|
|
classSpell2da.addColumn("IPFeatID");
|
|
classSpell2da.addColumn("SpellID");
|
|
classSpell2da.addColumn("RealSpellID");
|
|
classSpell2da.addColumn("ReqFeat");
|
|
} else {
|
|
classSpell2da = Data_2da.load2da(classSpell2daFile.getPath(), true);
|
|
|
|
// Clear all the existing rows
|
|
for (String label : classSpell2da.getLabels())
|
|
for (int i = 0; i < classSpell2da.getEntryCount(); i++)
|
|
classSpell2da.setEntry(label, i, "****");
|
|
}
|
|
|
|
// Make sure the file contains at least one line
|
|
if (classSpell2da.getEntryCount() == 0) {
|
|
classSpell2da.appendRow();
|
|
}
|
|
|
|
// The first line should be left blank, so initialise index to 1
|
|
classSpellRow = 1;
|
|
|
|
// Load the class feats 2da
|
|
classFeat2da = Data_2da.load2da("2das" + File.separator + "cls_feat_" + classfilename + ".2da", true);
|
|
getFirstClassFeat2daRow();
|
|
|
|
//get the class name
|
|
String className = getCheckedTlkEntry(classes2da.getBiowareEntryAsInt("Name", classRow)) + " ";
|
|
|
|
// Construct the class portion of labels to be generated
|
|
String classLabel = classes2da.getEntry("Label", classRow);
|
|
// Nothing longer than Suel_Archanamach (16 chars) allowed in order to avoid extending the length of all spells.2da rows again
|
|
if (classLabel.length() > 16)
|
|
classLabel = classLabel.substring(0, 17);
|
|
classLabel += "_";
|
|
|
|
//get the maximum spell level
|
|
int maxLevel = 0;
|
|
for (int row = 0; row < classCoreSpell2da.getEntryCount(); row++)
|
|
maxLevel = Math.max(maxLevel, classCoreSpell2da.getBiowareEntryAsInt("Level", row));
|
|
|
|
//loop over all the spells
|
|
for (int row = 0; row < classCoreSpell2da.getEntryCount(); row++) {
|
|
//check its not a null row
|
|
if (!classCoreSpell2da.getEntry("SpellID", row).equals("****")) {
|
|
//get the real spellID
|
|
int spellID = classCoreSpell2da.getBiowareEntryAsInt("SpellID", row);
|
|
//get the level of the spell
|
|
int spellLevel = classCoreSpell2da.getBiowareEntryAsInt("Level", row);
|
|
//get the metamagic reference to know what types work
|
|
int metamagic = spells2da.getBiowareEntryAsInt("Metamagic", spellID);
|
|
if (metamagic == 0)
|
|
System.out.println("Check metamagic for spell " + spellID);
|
|
|
|
// Hack - Determine how radial masters there might be: 1 + metamagics
|
|
int masterCount = 1;
|
|
for (int metamagicFlag = 0x1; metamagicFlag <= 0x20; metamagicFlag <<= 1)
|
|
if ((metamagic & metamagicFlag) != 0) {
|
|
/*
|
|
* 0x01 = 1 = Empower
|
|
* 0x02 = 2 = Extend
|
|
* 0x04 = 4 = Maximize
|
|
* 0x08 = 8 = Quicken
|
|
* 0x10 = 16 = Silent
|
|
* 0x20 = 32 = Still
|
|
*/
|
|
int metaCost = 0;
|
|
if (metamagicFlag == 0x01) metaCost = 2;
|
|
else if (metamagicFlag == 0x02) metaCost = 1;
|
|
else if (metamagicFlag == 0x04) metaCost = 3;
|
|
else if (metamagicFlag == 0x08) metaCost = 4;
|
|
else if (metamagicFlag == 0x10) metaCost = 1;
|
|
else if (metamagicFlag == 0x20) metaCost = 1;
|
|
|
|
if (spellLevel + metaCost <= maxLevel)
|
|
masterCount += 1;
|
|
}
|
|
List<Integer> preReservedClassSpell2daRows = new ArrayList<Integer>();
|
|
// Reserve a number of cls_spell_ rows for the main entries.
|
|
for (int i = 0; i < masterCount; i++) {
|
|
// If needed, add rows to the file to prevent errors in addNewSpellbookData
|
|
if (classSpellRow >= classSpell2da.getEntryCount()) {
|
|
classSpell2da.appendRow();
|
|
}
|
|
preReservedClassSpell2daRows.add(classSpellRow++);
|
|
}
|
|
// Generate an iterator for it
|
|
Iterator<Integer> preReservedClassSpell2daRowIterator = preReservedClassSpell2daRows.iterator();
|
|
|
|
//now loop over the metamagic varients
|
|
//-1 represents no metamagic
|
|
for (int metamagicNo = -1; metamagicNo < 6; metamagicNo++) {
|
|
/*
|
|
* 0x01 = 1 = Empower
|
|
* 0x02 = 2 = Extend
|
|
* 0x04 = 4 = Maximize
|
|
* 0x08 = 8 = Quicken
|
|
* 0x10 = 16 = Silent
|
|
* 0x20 = 32 = Still
|
|
*/
|
|
// If creating the base entry, or the given metamagic applies
|
|
if (metamagicNo == -1 || (metamagic & (1 << metamagicNo)) != 0) {
|
|
String spellNameMetamagic = "";
|
|
String spellLabelMetamagic = "";
|
|
String metaScript = "";
|
|
int metamagicLevel = 0;
|
|
String metamagicFeat = "****";
|
|
if (metamagicNo == -1) {
|
|
spellNameMetamagic = "";
|
|
spellLabelMetamagic = "";
|
|
metaScript = "sp";
|
|
metamagicLevel = 0;
|
|
metamagicFeat = "****";
|
|
} else if (metamagicNo == 0) {
|
|
spellNameMetamagic = "Empowered ";
|
|
spellLabelMetamagic = "Empowered_";
|
|
metaScript = "em";
|
|
metamagicLevel = 2;
|
|
metamagicFeat = "11";
|
|
} else if (metamagicNo == 1) {
|
|
spellNameMetamagic = "Extended ";
|
|
spellLabelMetamagic = "Exteneded_";
|
|
metaScript = "ex";
|
|
metamagicLevel = 1;
|
|
metamagicFeat = "12";
|
|
} else if (metamagicNo == 2) {
|
|
spellNameMetamagic = "Maximized ";
|
|
spellLabelMetamagic = "Maximized_";
|
|
metaScript = "ma";
|
|
metamagicLevel = 3;
|
|
metamagicFeat = "25";
|
|
} else if (metamagicNo == 3) {
|
|
spellNameMetamagic = "Quickened ";
|
|
spellLabelMetamagic = "Quickened_";
|
|
metaScript = "qu";
|
|
metamagicLevel = 4;
|
|
metamagicFeat = "29";
|
|
} else if (metamagicNo == 4) {
|
|
spellNameMetamagic = "Silent ";
|
|
spellLabelMetamagic = "Silent_";
|
|
metaScript = "si";
|
|
metamagicLevel = 1;
|
|
metamagicFeat = "33";
|
|
} else if (metamagicNo == 5) {
|
|
spellNameMetamagic = "Still ";
|
|
spellLabelMetamagic = "Still_";
|
|
metaScript = "st";
|
|
metamagicLevel = 1;
|
|
metamagicFeat = "37";
|
|
}
|
|
//check if the metamagic adjusted level is less than the maximum level
|
|
if ((metamagicLevel + spellLevel) <= maxLevel) {
|
|
//debug printout
|
|
//System.out.println(name+" : "+label);
|
|
addNewSpellbookData(spellID,
|
|
classfilename,
|
|
metaScript,
|
|
metamagicNo,
|
|
metamagicLevel,
|
|
metamagicFeat,
|
|
spellLevel,
|
|
className,
|
|
spellNameMetamagic,
|
|
classLabel,
|
|
spellLabelMetamagic,
|
|
preReservedClassSpell2daRowIterator,
|
|
0);
|
|
}//end of level check
|
|
}//end of metamamgic check
|
|
}//end of metamagic loop
|
|
}// end if - The cls_spcr row contains an entry
|
|
}//end of cls_spells_*_core.2da loop
|
|
|
|
//save the new cls_spell_*.2da file
|
|
classSpell2da.save2da("2das", true, true);
|
|
classFeat2da.save2da("2das", true, true);
|
|
} else {
|
|
//System.out.println(classfilename+" does not exist.");
|
|
}
|
|
}
|
|
}
|
|
//now resave the files we opened
|
|
spells2da.save2da("2das", true, true);
|
|
feat2da.save2da("2das", true, true);
|
|
iprp_feats2da.save2da("2das", true, true);
|
|
customtlk.saveAsXML("prc8_consortium", "tlk", true);
|
|
}
|
|
|
|
private static void addNewSpellbookData(int spellID,
|
|
String classfilename,
|
|
String metaScript,
|
|
int metamagicNo,
|
|
int metamagicLevel,
|
|
String metamagicFeat,
|
|
int spellLevel,
|
|
String className,
|
|
String spellNameMetamagic,
|
|
String classLabel,
|
|
String spellLabelMetamagic,
|
|
Iterator<Integer> preReservedClassSpell2daRows,
|
|
int subradialMaster) {
|
|
// Hack - If not a subradial, use prereserved cls_spell row
|
|
int localClassSpellRow;
|
|
if (subradialMaster == 0) {
|
|
localClassSpellRow = preReservedClassSpell2daRows.next();
|
|
} else {
|
|
// Grab the current value of classSpellRow for use and then increment it
|
|
localClassSpellRow = classSpellRow++;
|
|
}
|
|
|
|
//get the name of the spell
|
|
String spellName = getCheckedTlkEntry(spells2da.getBiowareEntryAsInt("Name", spellID));
|
|
//get the label of the spell
|
|
String spellLabel = spells2da.getEntry("Label", spellID);
|
|
//assemble the name
|
|
String name = className + spellNameMetamagic + spellName;
|
|
//assemble the label
|
|
String label = classLabel + spellLabelMetamagic + spellLabel;
|
|
//set the next tlk line to the name
|
|
customtlk.setEntry(tlkRow, name);
|
|
|
|
//copy the original spells.2da line to the next free spells.2da line
|
|
String[] originalSpellRow = spells2da.getRow(spellID);
|
|
for (int i = 0; i < originalSpellRow.length; i++) {
|
|
spells2da.setEntry(spellLabels[i], spells2daRow, spells2da.getEntry(spellLabels[i], spellID));
|
|
}
|
|
|
|
//change the ImpactScript
|
|
String script = "prc_" + (classfilename.length() <= 5 ? classfilename : classfilename.substring(0, 5)) + "_" + metaScript + "_gen";
|
|
spells2da.setEntry("ImpactScript", spells2daRow, script);
|
|
//change the Label
|
|
spells2da.setEntry("Label", spells2daRow, label);
|
|
//change the Name
|
|
spells2da.setEntry("Name", spells2daRow, Integer.toString(tlkRow + MAGIC_TLK));
|
|
|
|
//if quickened, set conjuring/casting duration to zero
|
|
if (metamagicNo == 3) {
|
|
spells2da.setEntry("ConjTime", spells2daRow, "0");
|
|
spells2da.setEntry("CastTime", spells2daRow, "0");
|
|
}
|
|
//if silenced, set it to no vocals
|
|
if (metamagicNo == 4) {
|
|
spells2da.setEntry("ConjSoundVFX", spells2daRow, "****");
|
|
spells2da.setEntry("ConjSoundMale", spells2daRow, "****");
|
|
spells2da.setEntry("ConjSoundFemale", spells2daRow, "****");
|
|
spells2da.setEntry("CastSound", spells2daRow, "****");
|
|
}
|
|
//if stilled, set it to no casting animations
|
|
if (metamagicNo == 5) {
|
|
spells2da.setEntry("CastAnim", spells2daRow, "****");
|
|
spells2da.setEntry("ConjAnim", spells2daRow, "****");
|
|
}
|
|
|
|
//set the level to the correct value, including metamagic
|
|
spells2da.setEntry("Innate", spells2daRow, Integer.toString(metamagicLevel + spellLevel));
|
|
//clear class levels
|
|
spells2da.setEntry("Bard", spells2daRow, "****");
|
|
spells2da.setEntry("Cleric", spells2daRow, "****");
|
|
spells2da.setEntry("Druid", spells2daRow, "****");
|
|
spells2da.setEntry("Paladin", spells2daRow, "****");
|
|
spells2da.setEntry("Ranger", spells2daRow, "****");
|
|
spells2da.setEntry("Wiz_Sorc", spells2daRow, "****");
|
|
|
|
// set subradial master, if applicable
|
|
if (subradialMaster != 0) {
|
|
spells2da.setEntry("Master", spells2daRow, Integer.toString(subradialMaster));
|
|
//calculate the new feat id
|
|
int subradialFeatID = spells2da.getBiowareEntryAsInt("FeatID", subradialMaster);
|
|
//Set the FEATID on each of the subspells as follows: (65536 * subfeat) + feat ID.
|
|
//The top 16 bits is used for subfeat, the bottom for feat.
|
|
subradialFeatID = (65536 * subradialID) + subradialFeatID;
|
|
spells2da.setEntry("FeatID", spells2daRow, Integer.toString(subradialFeatID));
|
|
} else {
|
|
spells2da.setEntry("Master", spells2daRow, "****");
|
|
//make it point to the new feat.2da line that will be added soon
|
|
spells2da.setEntry("FeatID", spells2daRow, Integer.toString(feat2daRow));
|
|
}
|
|
|
|
//remove projectiles from firing because the real spell will do this
|
|
spells2da.setEntry("Proj", spells2daRow, "0");
|
|
spells2da.setEntry("ProjModel", spells2daRow, "****");
|
|
spells2da.setEntry("ProjType", spells2daRow, "****");
|
|
spells2da.setEntry("ProjSpwnPoint", spells2daRow, "****");
|
|
spells2da.setEntry("ProjSound", spells2daRow, "****");
|
|
spells2da.setEntry("ProjOrientation", spells2daRow, "****");
|
|
spells2da.setEntry("HasProjectile", spells2daRow, "0");
|
|
|
|
//add a feat.2da line
|
|
if (subradialMaster == 0) {
|
|
// Clear the line of old values
|
|
for (String featLabel : feat2da.getLabels())
|
|
feat2da.setEntry(featLabel, feat2daRow, "****");
|
|
|
|
// Reset the ReqAction column to 1
|
|
feat2da.setEntry("ReqAction", feat2daRow, "1");
|
|
|
|
//make it point to the new spells.2da line
|
|
feat2da.setEntry("SPELLID", feat2daRow, Integer.toString(spells2daRow));
|
|
//change the Name
|
|
feat2da.setEntry("FEAT", feat2daRow, Integer.toString(tlkRow + MAGIC_TLK));
|
|
//change the Label
|
|
feat2da.setEntry("LABEL", feat2daRow, label);
|
|
//change the description
|
|
feat2da.setEntry("DESCRIPTION", feat2daRow, spells2da.getEntry("SpellDesc", spells2daRow));
|
|
//change the icon
|
|
feat2da.setEntry("ICON", feat2daRow, spells2da.getEntry("IconResRef", spells2daRow));
|
|
//personal range
|
|
feat2da.setEntry("TARGETSELF", feat2daRow, spells2da.getEntry("Range", spellID).equals("P") ? "1" : "0");
|
|
//if spell is hostile, make feat hostile
|
|
if (spells2da.getEntry("HostileSetting", spellID).equals("1")) {
|
|
feat2da.setEntry("HostileFeat", feat2daRow, "1");
|
|
} else {
|
|
feat2da.setEntry("HostileFeat", feat2daRow, "0");
|
|
}
|
|
//set the category to the same as the spell
|
|
feat2da.setEntry("CATEGORY", feat2daRow, spells2da.getEntry("Category", spells2daRow));
|
|
}
|
|
|
|
|
|
//add an iprp_feats.2da line
|
|
if (subradialMaster == 0) {
|
|
// Clear the line of old values
|
|
for (String iprpLabel : iprp_feats2da.getLabels())
|
|
iprp_feats2da.setEntry(iprpLabel, iprp_feats2daRow, "****");
|
|
|
|
//set its label
|
|
iprp_feats2da.setEntry("Label", iprp_feats2daRow, label);
|
|
//set its name
|
|
iprp_feats2da.setEntry("Name", iprp_feats2daRow, Integer.toString(tlkRow + MAGIC_TLK));
|
|
//make it point to the new feat.2da line
|
|
iprp_feats2da.setEntry("FeatIndex", iprp_feats2daRow, Integer.toString(feat2daRow));
|
|
//set its cost to 0.0
|
|
iprp_feats2da.setEntry("Cost", iprp_feats2daRow, "0.0");
|
|
}
|
|
|
|
//add a cls_spell_*.2da line if needed
|
|
if (localClassSpellRow >= classSpell2da.getEntryCount()) {
|
|
classSpell2da.appendRow();
|
|
}
|
|
//set its label
|
|
classSpell2da.setEntry("Label", localClassSpellRow, label);
|
|
//make it point to the new spells.2da
|
|
classSpell2da.setEntry("SpellID", localClassSpellRow, Integer.toString(spells2daRow));
|
|
//make it point to the old spells.2da
|
|
classSpell2da.setEntry("RealSpellID", localClassSpellRow, Integer.toString(spellID));
|
|
|
|
//if its a subradial, dont do this
|
|
if (subradialMaster == 0) {
|
|
//make it point to the new feat.2da
|
|
classSpell2da.setEntry("FeatID", localClassSpellRow, Integer.toString(feat2daRow));
|
|
//make it point to the new iprp_feats.2da
|
|
classSpell2da.setEntry("IPFeatID", localClassSpellRow, Integer.toString(iprp_feats2daRow));
|
|
//add the metamagic checks
|
|
classSpell2da.setEntry("ReqFeat", localClassSpellRow, metamagicFeat);
|
|
//set its level
|
|
classSpell2da.setEntry("Level", localClassSpellRow, Integer.toString(metamagicLevel + spellLevel));
|
|
} else {
|
|
//make it point to the new feat.2da
|
|
classSpell2da.setEntry("FeatID", localClassSpellRow, "****");
|
|
//make it point to the new iprp_feats.2da
|
|
classSpell2da.setEntry("IPFeatID", localClassSpellRow, "****");
|
|
//add the metamagic checks
|
|
classSpell2da.setEntry("ReqFeat", localClassSpellRow, "****");
|
|
//set its level
|
|
classSpell2da.setEntry("Level", localClassSpellRow, "****");
|
|
}
|
|
|
|
//cls_feat_*.2da
|
|
if (subradialMaster == 0) {
|
|
classFeat2da.setEntry("FeatLabel", classFeatRow, label);
|
|
classFeat2da.setEntry("FeatIndex", classFeatRow, Integer.toString(feat2daRow));
|
|
classFeat2da.setEntry("List", classFeatRow, Integer.toString(0));
|
|
classFeat2da.setEntry("GrantedOnLevel", classFeatRow, Integer.toString(99));
|
|
classFeat2da.setEntry("OnMenu", classFeatRow, Integer.toString(1));
|
|
}
|
|
|
|
|
|
//move to next file lines
|
|
getNextSpells2daRow();
|
|
getNextTlkRow();
|
|
//only need new ones of these if its not a subradial
|
|
if (subradialMaster == 0) {
|
|
getNextFeat2daRow();
|
|
getNextIPRPFeats2daRow();
|
|
getNextClassFeat2daRow();
|
|
} else { //do this if it is a subradial
|
|
// increase the subradial id ready for next one
|
|
subradialID++;
|
|
}
|
|
|
|
//add subradial spells
|
|
if (subradialMaster == 0) {
|
|
//store the spell row the master uses
|
|
//will be incremented by subradials
|
|
//the -1 is because you want the last used row, not the current blank row
|
|
int masterSpellID = spells2daRow - 1;
|
|
boolean doOnce = false;
|
|
for (int subradial = 1; subradial <= 5; subradial++) {
|
|
if (spells2da.getBiowareEntryAsInt("SubRadSpell" + subradial, spellID) != 0) {
|
|
// It is, in fact, a radial master, so set it's ImpactScript to tell people
|
|
// about the BioBug triggered by using subradial feats directly from class radial
|
|
if (!doOnce) {
|
|
doOnce = true;
|
|
|
|
spells2da.setEntry("ImpactScript", masterSpellID, "prc_radialbug");
|
|
}
|
|
addNewSpellbookData(spells2da.getBiowareEntryAsInt("SubRadSpell" + subradial, spellID),
|
|
classfilename,
|
|
metaScript,
|
|
metamagicNo,
|
|
metamagicLevel,
|
|
metamagicFeat,
|
|
spellLevel,
|
|
className,
|
|
spellNameMetamagic,
|
|
classLabel,
|
|
spellLabelMetamagic,
|
|
preReservedClassSpell2daRows,
|
|
masterSpellID);
|
|
//update the master rows with the subradial spell rows
|
|
//the -1 is because you want the last used row, not the current blank row
|
|
spells2da.setEntry("SubRadSpell" + subradial, masterSpellID, Integer.toString(spells2daRow - 1));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void getFirstSpells2daRow() {
|
|
System.out.print("Finding start of spells.2da ");
|
|
while (!spells2da.getEntry("Label", spells2daRow).equals("####START_OF_NEW_SPELLBOOK_RESERVE")) {
|
|
spells2daRow++;
|
|
if (spells2daRow > spells2da.getEntryCount()) {
|
|
System.out.println("Spells.2da reached the end of the file.");
|
|
System.exit(1);
|
|
}
|
|
spinner.spin();
|
|
}
|
|
spells2daRow++;
|
|
System.out.println("- Done");
|
|
}
|
|
|
|
private static void getNextSpells2daRow() {
|
|
spells2daRow++;
|
|
if (spells2da.getEntry("Label", spells2daRow).equals("####END_OF_NEW_SPELLBOOK_RESERVE")) {
|
|
getFirstSpells2daRow();
|
|
}
|
|
}
|
|
|
|
private static void getFirstFeat2daRow() {
|
|
System.out.print("Finding start of feat.2da ");
|
|
while (!feat2da.getEntry("Label", feat2daRow).equals("####START_OF_NEW_SPELLBOOK_RESERVE")) {
|
|
feat2daRow++;
|
|
if (feat2daRow > feat2da.getEntryCount()) {
|
|
System.out.println("Feat.2da reached the end of the file.");
|
|
System.exit(1);
|
|
}
|
|
spinner.spin();
|
|
}
|
|
feat2daRow++;
|
|
System.out.println("- Done");
|
|
}
|
|
|
|
private static void getNextFeat2daRow() {
|
|
feat2daRow++;
|
|
if (feat2da.getEntry("Label", feat2daRow).equals("####END_OF_NEW_SPELLBOOK_RESERVE")) {
|
|
getFirstFeat2daRow();
|
|
}
|
|
}
|
|
|
|
private static void getFirstIPRPFeats2daRow() {
|
|
System.out.print("Finding start of iprp_spells.2da ");
|
|
while (!iprp_feats2da.getEntry("Label", iprp_feats2daRow).equals("####START_OF_NEW_SPELLBOOK_RESERVE")) {
|
|
iprp_feats2daRow++;
|
|
if (iprp_feats2daRow > iprp_feats2da.getEntryCount()) {
|
|
System.out.println("iprp_feats.2da reached the end of the file.");
|
|
System.exit(1);
|
|
}
|
|
spinner.spin();
|
|
}
|
|
iprp_feats2daRow++;
|
|
System.out.println("- Done");
|
|
}
|
|
|
|
private static void getNextIPRPFeats2daRow() {
|
|
iprp_feats2daRow++;
|
|
if (iprp_feats2da.getEntry("Label", iprp_feats2daRow).equals("####END_OF_NEW_SPELLBOOK_RESERVE")) {
|
|
getFirstIPRPFeats2daRow();
|
|
}
|
|
}
|
|
|
|
private static void getFirstClassFeat2daRow() {
|
|
classFeatRow = 0;
|
|
System.out.print("Finding start of cls_feat_*.2da ");
|
|
while (!classFeat2da.getEntry("FeatLabel", classFeatRow).equals("####START_OF_NEW_SPELLBOOK_RESERVE")) {
|
|
classFeatRow++;
|
|
if (classFeatRow >= classFeat2da.getEntryCount()) {
|
|
System.out.println("cls_feat_*.2da reached the end of the file.");
|
|
System.exit(1);
|
|
}
|
|
spinner.spin();
|
|
}
|
|
getNextClassFeat2daRow();
|
|
System.out.println("- Done");
|
|
}
|
|
|
|
private static void getNextClassFeat2daRow() {
|
|
classFeatRow++;
|
|
if (classFeat2da.getEntry("FeatLabel", classFeatRow).equals("####END_OF_NEW_SPELLBOOK_RESERVE")) {
|
|
classFeat2da.insertRow(classFeatRow);
|
|
}
|
|
}
|
|
|
|
private static void getFirstTlkRow() {
|
|
System.out.print("Finding start of prc8_consortium.tlk ");
|
|
while (!customtlk.getEntry(tlkRow).equals("####START_OF_NEW_SPELLBOOK_RESERVE")) {
|
|
tlkRow++;
|
|
spinner.spin();
|
|
}
|
|
tlkRow++;
|
|
System.out.println("- Done");
|
|
}
|
|
|
|
private static void getNextTlkRow() {
|
|
tlkRow++;
|
|
if (customtlk.getEntry(tlkRow).equals("####END_OF_NEW_SPELLBOOK_RESERVE")) {
|
|
getFirstTlkRow();
|
|
}
|
|
}
|
|
|
|
private static String getCheckedTlkEntry(int entryNo) {
|
|
if (entryNo > MAGIC_TLK) {
|
|
return customtlk.getEntry(entryNo - MAGIC_TLK);
|
|
}
|
|
return dialogtlk.getEntry(entryNo);
|
|
}
|
|
|
|
private static void readMe() {
|
|
// 0 1 2 3 4 5 6 7 8
|
|
// 12345678901234567890123456789012345678901234567890123456789012345678901234567890
|
|
System.out.println("Usage:\n" +
|
|
" [--help]\n" +
|
|
"\n" +
|
|
" --help prints this text\n" +
|
|
"\n" +
|
|
"\n" +
|
|
"Creates and/or updates the new spellbooks data. Assumes it's being run from\n" +
|
|
"the root of the nwnprc cvs module. Looks for dialog.tlk under tlk/.\n" +
|
|
"Reads the cls_spcr_*.2da files and updates cls_feat_*.2da, cls_spell*.2da,\n" +
|
|
"feat.2da, iprp_feats.2da and spells.2da."
|
|
);
|
|
System.exit(0);
|
|
}
|
|
} |