20 package net.sf.gridarta.model.treasurelist;
22 import java.io.BufferedReader;
24 import java.io.FileInputStream;
25 import java.io.FilenameFilter;
26 import java.io.IOException;
27 import java.io.InputStream;
28 import java.io.InputStreamReader;
29 import java.io.Reader;
30 import java.util.ArrayList;
31 import java.util.Arrays;
32 import java.util.Collection;
33 import java.util.Comparator;
34 import java.util.List;
36 import javax.swing.tree.DefaultMutableTreeNode;
37 import javax.swing.tree.MutableTreeNode;
44 import org.apache.log4j.Category;
45 import org.apache.log4j.Logger;
46 import org.jetbrains.annotations.NotNull;
47 import org.jetbrains.annotations.Nullable;
67 private static final Comparator<TreasureTreeNode>
TREASURE_NODE_COMPARATOR = (o1, o2) -> String.CASE_INSENSITIVE_ORDER.compare(o1.getTreasureObj().getName(), o2.getTreasureObj().getName());
74 if (
name.startsWith(
".")) {
78 final File fullPath =
new File(dir,
name);
79 if (fullPath.isDirectory()) {
83 final String lowerCaseName =
name.toLowerCase();
84 return lowerCaseName.endsWith(
".tl") || lowerCaseName.endsWith(
".trs");
103 final List<TreasureTreeNode> tmpList =
new ArrayList<>();
104 final List<TreasureTreeNode> needLink =
new ArrayList<>();
109 final File treasureLocation;
111 treasureLocation = configSource.getFile(projectSettings,
"treasures", index);
112 }
catch (
final IOException ex) {
117 if (treasureLocation ==
null) {
121 final int tmpListSize = tmpList.size();
122 if (treasureLocation.isDirectory()) {
124 }
else if (treasureLocation.isFile()) {
129 if (
LOG.isInfoEnabled()) {
130 LOG.info(
"Loaded " + (tmpList.size() - tmpListSize) +
" treasurelists from '" + treasureLocation +
"'.");
147 private static TreasureTree createTreasureTree(@NotNull
final List<TreasureTreeNode> tmpList, @NotNull
final Iterable<TreasureTreeNode> needLink, @NotNull
final Map<String, TreasureTreeNode> specialTreasureLists) {
148 final DefaultMutableTreeNode root =
new DefaultMutableTreeNode(
"Treasurelists:");
150 treasures.
putAll(tmpList);
165 private static void addTopLevelEntries(@NotNull
final List<TreasureTreeNode> tmpList, @NotNull
final Map<String, TreasureTreeNode> specialTreasureLists, @NotNull
final DefaultMutableTreeNode root) {
171 realNode.recalculateChances();
174 final DefaultMutableTreeNode specialTreasureList = specialTreasureLists.get(realNode.getTreasureObj().getName());
175 if (specialTreasureList ==
null) {
178 specialTreasureList.add(realNode);
189 final List<TreasureTreeNode> needSecondLink =
new ArrayList<>();
190 linkSubList2(needLink, treasures,
false, needSecondLink);
194 private static void linkSubList2(@NotNull
final Iterable<TreasureTreeNode> needLink, @NotNull
final TreasureTree treasures,
final boolean processSecondLinking, @Nullable
final List<TreasureTreeNode> needSecondLink) {
197 if (realNode !=
null) {
200 for (
int i = 0; i < realNode.getChildCount(); i++) {
202 node.add(ttn.
getClone(processSecondLinking, needSecondLink));
216 return treasures.get(node.getTreasureObj().getName());
225 private static void addSpecialEntries(@NotNull
final Map<String, TreasureTreeNode> specialTreasureLists, @NotNull
final DefaultMutableTreeNode root) {
226 for (
final MutableTreeNode folder : specialTreasureLists.values()) {
240 private static void loadTreasureList(@NotNull
final ErrorView errorView, @NotNull
final File file,
final Collection<TreasureTreeNode> tmpList,
final List<TreasureTreeNode> needLink) {
243 try (InputStream inputStream =
new FileInputStream(file)) {
245 try (BufferedReader bufferedReader =
new BufferedReader(reader)) {
247 final String rawLine = bufferedReader.readLine();
248 if (rawLine ==
null) {
251 final String line = rawLine.trim();
252 if (!line.isEmpty() && !line.startsWith(
"#")) {
253 if (line.startsWith(
"treasure")) {
254 final int i = line.indexOf(
' ');
258 final String
name = line.substring(i).trim();
262 readInsideList(errorViewCollector, node, bufferedReader, needLink);
272 }
catch (
final IOException ex) {
286 private static void loadTreasureDir(@NotNull
final ErrorView errorView, @NotNull
final File dir, @NotNull
final List<TreasureTreeNode> tmpList, @NotNull
final List<TreasureTreeNode> needLink) {
288 if (traverse ==
null) {
292 Arrays.sort(traverse);
293 for (
final String entry : traverse) {
294 final File file =
new File(dir, entry);
297 }
else if (file.isDirectory()) {
315 boolean insideArch =
false;
318 final String rawLine = reader.readLine();
319 if (rawLine ==
null) {
322 final String line = rawLine.trim();
323 if (line.equals(
"end")) {
326 if (!line.isEmpty() && !line.startsWith(
"#")) {
328 if (line.equals(
"more")) {
330 }
else if (line.startsWith(
"chance")) {
333 }
catch (
final NumberFormatException ignored) {
336 }
else if (line.startsWith(
"nrof")) {
339 }
catch (
final NumberFormatException ignored) {
342 }
else if (line.startsWith(
"magic")) {
345 }
catch (
final NumberFormatException ignored) {
348 }
else if (line.startsWith(
"artifact_chance") || line.startsWith(
"title") || line.startsWith(
"difficulty") || line.startsWith(
"quality_quality") || line.startsWith(
"quality_range") || line.startsWith(
"material_quality") || line.startsWith(
"material_range")) {
350 }
else if (line.startsWith(
"name") || line.startsWith(
"t_style") || line.startsWith(
"affinity")) {
352 }
else if (line.startsWith(
"artifact ") || line.startsWith(
"list_magic_value ") || line.startsWith(
"list_magic_adjustment ") || line.startsWith(
"change_name ") || line.startsWith(
"change_title ") || line.startsWith(
"slaying ")) {
354 }
else if (line.equals(
"no")) {
361 chance = 100 - parentChance;
368 }
else if (line.equals(
"yes")) {
376 if (line.startsWith(
"arch ")) {
378 parentNode.add(node);
380 }
else if (line.startsWith(
"list ")) {
381 final String newName = line.substring(line.indexOf(
' ')).trim();
383 parentNode.add(node);