forked from Jaysyn/PRC8
Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
190 lines
8.1 KiB
Java
190 lines
8.1 KiB
Java
package prc.utils;
|
|
|
|
import prc.autodoc.*;
|
|
import prc.autodoc.Main.TwoDAStore;
|
|
|
|
import java.io.IOException;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* A tool for automatically updating parts of des_crft_scrolls.2da
|
|
* and des_crft_spells.2da based on spells.2da.
|
|
*
|
|
* @author Ornedan
|
|
*/
|
|
public class UpdateDes {
|
|
|
|
/**
|
|
* Ye olde maine methode.
|
|
*
|
|
* @param args The arguments
|
|
* @throws IOException Just toss any exceptions encountered
|
|
*/
|
|
public static void main(String[] args) throws IOException {
|
|
if (args.length == 0) readMe();
|
|
String twoDAPath = null;
|
|
//String tlkPath = null;
|
|
|
|
// parse args
|
|
for (String param : args) {//2dadir | [--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 {
|
|
// It's a pathname
|
|
if (twoDAPath == null)
|
|
twoDAPath = param;
|
|
/*else if(tlkPath == null)
|
|
tlkPath = param;*/
|
|
else {
|
|
System.out.println("Unknown parameter: " + param);
|
|
readMe();
|
|
}
|
|
}
|
|
}
|
|
|
|
TwoDAStore twoDA = new TwoDAStore(twoDAPath);
|
|
|
|
doUpdateDes(twoDA, twoDAPath);
|
|
}
|
|
|
|
/**
|
|
* Performs the actual 2da updating. Made public for the purposes of BuildScrollHack.
|
|
*
|
|
* @param twoDA A TwoDAStore for loading 2da data from
|
|
* @param twoDAPath Path where the 2da files are located. For resaving
|
|
* @throws IOException Just tossed back up
|
|
*/
|
|
public static void doUpdateDes(TwoDAStore twoDA, String twoDAPath) throws IOException {
|
|
Data_2da spells = twoDA.get("spells"),
|
|
des_crft_scroll = twoDA.get("des_crft_scroll"),
|
|
des_crft_spells = twoDA.get("des_crft_spells"),
|
|
iprp_spells = twoDA.get("iprp_spells");
|
|
|
|
// First, find the highest entry in spells that should have a corresponding entry in des_crft_scroll
|
|
// In other words, one that is cast by arcane or divine casters
|
|
int highestScroll = -1;
|
|
for (int i = 0; i < spells.getEntryCount(); i++) {
|
|
if (!(spells.getEntry("Bard", i).equals("****") &&
|
|
spells.getEntry("Cleric", i).equals("****") &&
|
|
spells.getEntry("Druid", i).equals("****") &&
|
|
spells.getEntry("Paladin", i).equals("****") &&
|
|
spells.getEntry("Ranger", i).equals("****") &&
|
|
spells.getEntry("Wiz_Sorc", i).equals("****")))
|
|
highestScroll = i;
|
|
}
|
|
//System.out.println("Highest entry that should have des_crft_scroll entry: " + highestScroll);
|
|
|
|
// If des_crft_scroll size is under the number determined above, add entries
|
|
while (des_crft_scroll.getEntryCount() <= highestScroll)
|
|
des_crft_scroll.appendRow();
|
|
|
|
// Next, do the same for des_crft_spells size. Except it should just be equal to spells size
|
|
while (des_crft_spells.getEntryCount() < spells.getEntryCount())
|
|
des_crft_spells.appendRow();
|
|
|
|
// Next, update any case where Label of des_crft_scroll or des_crft_spells is **** and spells not ****
|
|
for (int i = 0; i < des_crft_scroll.getEntryCount(); i++) {
|
|
if (!spells.getEntry("Label", i).equals("****") &&
|
|
!spells.getEntry("Label", i).equals(des_crft_scroll.getEntry("Label", i))) {
|
|
des_crft_scroll.setEntry("Label", i, spells.getEntry("Label", i));
|
|
}
|
|
}
|
|
for (int i = 0; i < des_crft_spells.getEntryCount(); i++) {
|
|
if (!spells.getEntry("Label", i).equals("****") &&
|
|
!spells.getEntry("Label", i).equals(des_crft_spells.getEntry("Label", i))) {
|
|
des_crft_spells.setEntry("Label", i, spells.getEntry("Label", i));
|
|
}
|
|
}
|
|
|
|
// Next, update all des_crft_spells Level column values to equal spells Innate values
|
|
for (int i = 0; i < des_crft_spells.getEntryCount(); i++) {
|
|
des_crft_spells.setEntry("Level", i, spells.getEntry("Innate", i));
|
|
}
|
|
|
|
|
|
// Update des_crft_spell IPRP_SpellIndex to be the one with lowest CasterLvl for that spell
|
|
Map<Integer, Tuple<Integer, Integer>> lowestIndex = new HashMap<Integer, Tuple<Integer, Integer>>(); // Map of spells.2da index -> (iprp_spells.2da index, CasterLvl value)
|
|
int spellID, casterLvl;
|
|
for (int i = 0; i < iprp_spells.getEntryCount(); i++) {
|
|
if (!iprp_spells.getEntry("SpellIndex", i).equals("****")) { // Only lines that are connected to spells.2da are scanned
|
|
spellID = Integer.parseInt(iprp_spells.getEntry("SpellIndex", i));
|
|
casterLvl = Integer.parseInt(iprp_spells.getEntry("CasterLvl", i));
|
|
|
|
if (lowestIndex.get(spellID) == null || lowestIndex.get(spellID).e2 > casterLvl)
|
|
lowestIndex.put(spellID, new Tuple<Integer, Integer>(i, casterLvl));
|
|
}
|
|
}
|
|
for (int i = 0; i < des_crft_spells.getEntryCount(); i++) {
|
|
if (lowestIndex.get(i) != null) {
|
|
des_crft_spells.setEntry("IPRP_SpellIndex", i, lowestIndex.get(i).e1.toString());
|
|
}
|
|
}
|
|
|
|
|
|
// Update all des_crft_spells entries that define IPRP_SpellIndex based on that iprp_spells.2da data
|
|
int iprp_index;
|
|
for (int i = 0; i < des_crft_spells.getEntryCount(); i++) {
|
|
// If there is an IP Cast Spell for this spell, see what uses it specifies and match them
|
|
if (!des_crft_spells.getEntry("IPRP_SpellIndex", i).equals("****")) {
|
|
iprp_index = Integer.parseInt(des_crft_spells.getEntry("IPRP_SpellIndex", i));
|
|
|
|
if (iprp_spells.getEntry("GeneralUse", iprp_index).equals("1"))
|
|
des_crft_spells.setEntry("NoScroll", i, "0");
|
|
else
|
|
des_crft_spells.setEntry("NoScroll", i, "1");
|
|
|
|
if (iprp_spells.getEntry("PotionUse", iprp_index).equals("1"))
|
|
des_crft_spells.setEntry("NoPotion", i, "0");
|
|
else
|
|
des_crft_spells.setEntry("NoPotion", i, "1");
|
|
|
|
if (iprp_spells.getEntry("WandUse", iprp_index).equals("1"))
|
|
des_crft_spells.setEntry("NoWand", i, "0");
|
|
else
|
|
des_crft_spells.setEntry("NoWand", i, "1");
|
|
}
|
|
// No IP, no item creation
|
|
else {
|
|
des_crft_spells.setEntry("NoScroll", i, "1");
|
|
des_crft_spells.setEntry("NoPotion", i, "1");
|
|
des_crft_spells.setEntry("NoWand", i, "1");
|
|
}
|
|
}
|
|
|
|
des_crft_scroll.save2da(twoDAPath, true, true);
|
|
des_crft_spells.save2da(twoDAPath, true, true);
|
|
}
|
|
|
|
/**
|
|
* Prints the use instructions for this program and kills execution.
|
|
*/
|
|
private static void readMe() {
|
|
// 0 1 2 3 4 5 6 7 8
|
|
// 12345678901234567890123456789012345678901234567890123456789012345678901234567890
|
|
System.out.println("Usage:\n" +
|
|
" java -jar prc.jar updatedescrft 2dadir | [--help]\n" +
|
|
"\n" +
|
|
"2dadir Path to a directory containing 2da files\n" +
|
|
// "tlkdir Path to a directory containing dialog.tlk and prc_consortium.tlk\n" +
|
|
"\n" +
|
|
"--help prints this info you are reading\n" +
|
|
"\n" +
|
|
"\n" +
|
|
"A tool for automatically updating parts of des_crft_scrolls.2da and\n" +
|
|
"des_crft_spells.2da based on spells.2da\n"
|
|
);
|
|
System.exit(0);
|
|
}
|
|
}
|