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;
71 return String.CASE_INSENSITIVE_ORDER.compare(o1.getTreasureObj().getName(), o2.getTreasureObj().getName());
83 public boolean accept(@NotNull
final File dir, @NotNull
final String name) {
84 if (name.startsWith(
".")) {
88 final File fullPath =
new File(dir, name);
89 if (fullPath.isDirectory()) {
93 final String lowerCaseName = name.toLowerCase();
94 return lowerCaseName.endsWith(
".tl") || lowerCaseName.endsWith(
".trs");
115 final List<TreasureTreeNode> tmpList =
new ArrayList<>();
116 final List<TreasureTreeNode> needLink =
new ArrayList<>();
121 final File treasureLocation;
123 treasureLocation = configSource.getFile(projectSettings,
"treasures", index);
124 }
catch (
final IOException ex) {
129 if (treasureLocation ==
null) {
133 final int tmpListSize = tmpList.size();
134 if (treasureLocation.isDirectory()) {
136 }
else if (treasureLocation.isFile()) {
141 if (
LOG.isInfoEnabled()) {
142 LOG.info(
"Loaded " + (tmpList.size() - tmpListSize) +
" treasurelists from '" + treasureLocation +
"'.");
159 private static TreasureTree createTreasureTree(@NotNull
final List<TreasureTreeNode> tmpList, @NotNull
final Iterable<TreasureTreeNode> needLink, @NotNull
final Map<String, TreasureTreeNode> specialTreasureLists) {
160 final DefaultMutableTreeNode root =
new DefaultMutableTreeNode(
"Treasurelists:");
162 treasures.
putAll(tmpList);
177 private static void addTopLevelEntries(@NotNull
final List<TreasureTreeNode> tmpList, @NotNull
final Map<String, TreasureTreeNode> specialTreasureLists, @NotNull
final DefaultMutableTreeNode root) {
183 realNode.recalculateChances();
186 final DefaultMutableTreeNode specialTreasureList = specialTreasureLists.get(realNode.getTreasureObj().getName());
187 if (specialTreasureList ==
null) {
190 specialTreasureList.add(realNode);
201 final List<TreasureTreeNode> needSecondLink =
new ArrayList<>();
202 linkSubList2(needLink, treasures,
false, needSecondLink);
206 private static void linkSubList2(@NotNull
final Iterable<TreasureTreeNode> needLink, @NotNull
final TreasureTree treasures,
final boolean processSecondLinking, @Nullable
final List<TreasureTreeNode> needSecondLink) {
209 if (realNode !=
null) {
212 for (
int i = 0; i < realNode.getChildCount(); i++) {
214 node.add(ttn.
getClone(processSecondLinking, needSecondLink));
228 return treasures.get(node.getTreasureObj().getName());
237 private static void addSpecialEntries(@NotNull
final Map<String, TreasureTreeNode> specialTreasureLists, @NotNull
final DefaultMutableTreeNode root) {
238 for (
final MutableTreeNode folder : specialTreasureLists.values()) {
252 private static void loadTreasureList(@NotNull
final ErrorView errorView, @NotNull
final File file,
final Collection<TreasureTreeNode> tmpList,
final List<TreasureTreeNode> needLink) {
255 try (InputStream inputStream =
new FileInputStream(file)) {
257 try (BufferedReader bufferedReader =
new BufferedReader(reader)) {
259 final String rawLine = bufferedReader.readLine();
260 if (rawLine ==
null) {
263 final String line = rawLine.trim();
264 if (!line.isEmpty() && !line.startsWith(
"#")) {
265 if (line.startsWith(
"treasure")) {
266 final int i = line.indexOf(
' ');
270 final String name = line.substring(i).trim();
274 readInsideList(errorViewCollector, node, bufferedReader, needLink);
284 }
catch (
final IOException ex) {
298 private static void loadTreasureDir(@NotNull
final ErrorView errorView, @NotNull
final File dir, @NotNull
final List<TreasureTreeNode> tmpList, @NotNull
final List<TreasureTreeNode> needLink) {
300 if (traverse ==
null) {
304 Arrays.sort(traverse);
305 for (
final String entry : traverse) {
306 final File file =
new File(dir, entry);
309 }
else if (file.isDirectory()) {
327 boolean insideArch =
false;
330 final String rawLine = reader.readLine();
331 if (rawLine ==
null) {
334 final String line = rawLine.trim();
335 if (line.equals(
"end")) {
338 if (!line.isEmpty() && !line.startsWith(
"#")) {
340 if (line.equals(
"more")) {
342 }
else if (line.startsWith(
"chance")) {
345 }
catch (
final NumberFormatException ignored) {
348 }
else if (line.startsWith(
"nrof")) {
351 }
catch (
final NumberFormatException ignored) {
354 }
else if (line.startsWith(
"magic")) {
357 }
catch (
final NumberFormatException ignored) {
360 }
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")) {
362 }
else if (line.startsWith(
"name") || line.startsWith(
"t_style") || line.startsWith(
"affinity")) {
364 }
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 ")) {
366 }
else if (line.equals(
"no")) {
373 chance = 100 - parentChance;
380 }
else if (line.equals(
"yes")) {
388 if (line.startsWith(
"arch ")) {
390 parentNode.add(node);
392 }
else if (line.startsWith(
"list ")) {
393 final String newName = line.substring(line.indexOf(
' ')).trim();
395 parentNode.add(node);