Gridarta Editor
AbstractResourcesReader.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2023 The Gridarta Developers.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 package net.sf.gridarta.model.resource;
21 
22 import java.io.BufferedReader;
23 import java.io.File;
24 import java.io.FileNotFoundException;
25 import java.io.IOException;
26 import java.io.InputStream;
27 import java.io.InputStreamReader;
28 import java.io.Reader;
29 import java.net.URL;
30 import java.util.HashMap;
31 import java.util.List;
32 import java.util.Map;
45 import net.sf.gridarta.utils.IOUtils;
46 import net.sf.japi.swing.action.ActionBuilder;
47 import net.sf.japi.swing.action.ActionBuilderFactory;
48 import org.apache.log4j.Category;
49 import org.apache.log4j.Logger;
50 import org.jetbrains.annotations.NotNull;
51 import org.jetbrains.annotations.Nullable;
52 
60 public abstract class AbstractResourcesReader<G extends GameObject<G, ?, ?>> {
61 
65  @NotNull
66  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
67 
71  @NotNull
72  private static final Category LOG = Logger.getLogger(AbstractResourcesReader.class);
73 
77  @NotNull
78  private final File collectedDirectory;
79 
84  @Nullable
85  private final String imageSet;
86 
90  @NotNull
92 
96  @NotNull
97  private final FaceObjects faceObjects;
98 
106  protected AbstractResourcesReader(@NotNull final File collectedDirectory, @Nullable final String imageSet, @NotNull final AnimationObjects animationObjects, @NotNull final FaceObjects faceObjects) {
107  this.collectedDirectory = collectedDirectory;
108  this.imageSet = imageSet;
109  this.animationObjects = animationObjects;
110  this.faceObjects = faceObjects;
111  }
112 
118  protected void loadAnimationsFromCollect(@NotNull final ErrorView errorView, @NotNull final Map<String, String> animations) {
119  final int animationObjectsSize = animationObjects.size();
120 
121  try {
122  final URL animationsURL = IOUtils.getResource(collectedDirectory, "animations");
123  final ErrorViewCollector errorViewCollector = new ErrorViewCollector(errorView, animationsURL);
124  try {
125  try (InputStream inputStream = animationsURL.openStream()) {
126  try (Reader reader = new InputStreamReader(inputStream, IOUtils.MAP_ENCODING)) {
127  try (Reader bufferedReader = new BufferedReader(reader)) {
128  AnimationObjectsReader.loadAnimations(animationObjects, errorViewCollector, bufferedReader, "anim ", false, null, animations);
129  }
130  }
131  }
132  } catch (final IOException ex) {
133  errorView.addWarning(ErrorViewCategory.ANIMATIONS_FILE_INVALID, animationsURL + ": " + ex.getMessage());
134  } catch (final AnimationParseException ex) {
135  errorView.addWarning(ErrorViewCategory.ANIMATIONS_FILE_INVALID, ex.getLineNumber(), animationsURL + ": " + ex.getMessage());
136  }
137 
138  if (LOG.isInfoEnabled()) {
139  LOG.info("Loaded " + (animationObjects.size() - animationObjectsSize) + " animations from '" + animationsURL + "'.");
140  }
141  } catch (final FileNotFoundException ex) {
142  errorView.addWarning(ErrorViewCategory.ANIMATIONS_FILE_INVALID, new File(collectedDirectory, "animations") + ": " + ex.getMessage());
143  }
144  }
145 
155  protected void addPNGFace(@NotNull final String filename, @NotNull final String path, @NotNull final String name, @NotNull final ErrorView errorView, @NotNull final ArchFaceProvider archFaceProvider) {
156  final String facename = generateFaceName(name);
157  archFaceProvider.addInfo(facename, filename);
158  try {
159  faceObjects.addFaceObject(facename, path + "/" + facename, 0, (int) new File(filename).length());
160  } catch (final DuplicateFaceException e) {
161  errorView.addWarning(ErrorViewCategory.ARCHETYPE_INVALID, ACTION_BUILDER.format("loadDuplicateFace", e.getDuplicate().getFaceName(), e.getDuplicate().getOriginalFilename(), e.getExisting().getOriginalFilename()));
162  } catch (final IllegalFaceException ex) {
163  errorView.addWarning(ErrorViewCategory.ARCHETYPE_INVALID, ACTION_BUILDER.format("loadIllegalFace", ex.getFaceObject().getFaceName(), ex.getFaceObject().getOriginalFilename()));
164  }
165  }
166 
172  @NotNull
173  private String generateFaceName(@NotNull final String name) {
174  //noinspection VariableNotUsedInsideIf
175  if (imageSet != null) {
176  // we have to snip out the image set information here from
177  // the 'name', and the ".png": (e.g. blocked.base.111.png -> blocked.111)
178  int firstDot = 0;
179  int secondDot = 0;
180  for (int t = 0; t < name.length() && secondDot == 0; t++) {
181  if (name.charAt(t) == '.') {
182  if (firstDot == 0) {
183  firstDot = t;
184  } else {
185  secondDot = t;
186  }
187  }
188  }
189 
190  if (firstDot != 0 && secondDot != 0) {
191  return name.substring(0, firstDot) + name.substring(secondDot, name.length() - 4);
192  }
193  return name.substring(0, name.length() - 4);
194  }
195 
196  // no image set: we need only cut off the ".png"
197  return name.substring(0, name.length() - 4);
198  }
199 
206  @NotNull
207  public abstract FaceProvider read(@NotNull ErrorView errorView, @NotNull List<G> invObjects);
208 
216  @NotNull
217  protected static Map<String, String> loadAnimTree(@NotNull final URL url) throws IOException {
218  final Map<String, String> animations;
219  try (InputStream inputStream = url.openStream()) {
220  try (Reader reader = new InputStreamReader(inputStream, IOUtils.MAP_ENCODING)) {
221  try (BufferedReader bufferedReader = new BufferedReader(reader)) {
222  animations = loadAnimTree(bufferedReader);
223  }
224  }
225  }
226  if (LOG.isInfoEnabled()) {
227  LOG.info("Loaded " + animations.size() + " animations from '" + url + "'.");
228  }
229  return animations;
230  }
231 
238  @NotNull
239  private static Map<String, String> loadAnimTree(@NotNull final BufferedReader reader) throws IOException {
240  final Map<String, String> animations = new HashMap<>();
241  while (true) {
242  final String line = reader.readLine();
243  if (line == null) {
244  break;
245  }
246  final int index = line.lastIndexOf('/');
247  final String name = line.substring(index + 1);
248  animations.put(name, line);
249  }
250  return animations;
251  }
252 
253 }
net.sf.gridarta.model.resource.AbstractResourcesReader
Definition: AbstractResourcesReader.java:60
net.sf.gridarta.model.errorview.ErrorView
Definition: ErrorView.java:28
net.sf.gridarta.model.errorview.ErrorViewCategory.ANIMATIONS_FILE_INVALID
ANIMATIONS_FILE_INVALID
Definition: ErrorViewCategory.java:38
net.sf.gridarta.utils.IOUtils.getResource
static URL getResource(@NotNull final File dir, @NotNull final String fileName)
Definition: IOUtils.java:69
net.sf.gridarta.model.resource.AbstractResourcesReader.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Definition: AbstractResourcesReader.java:66
net.sf.gridarta.model.face.FaceObject.getFaceName
String getFaceName()
net.sf.gridarta.model.io.AnimationObjectsReader.loadAnimations
static void loadAnimations(@NotNull final AnimationObjects animationObjects, @NotNull final ErrorViewCollector errorViewCollector, @NotNull final String path, @NotNull final File animFile, @NotNull final String startKey, final boolean ignoreOtherText)
Definition: AnimationObjectsReader.java:68
net.sf.gridarta
net.sf.gridarta.model.errorview.ErrorViewCollector
Definition: ErrorViewCollector.java:31
net.sf.gridarta.model.face.DuplicateFaceException.getExisting
FaceObject getExisting()
Definition: DuplicateFaceException.java:68
net.sf.gridarta.model.resource.AbstractResourcesReader.read
abstract FaceProvider read(@NotNull ErrorView errorView, @NotNull List< G > invObjects)
net.sf.gridarta.model.errorview.ErrorViewCategory.ARCHETYPE_INVALID
ARCHETYPE_INVALID
Definition: ErrorViewCategory.java:50
net.sf
net.sf.gridarta.model.resource.AbstractResourcesReader.collectedDirectory
final File collectedDirectory
Definition: AbstractResourcesReader.java:78
net.sf.gridarta.model.anim.AnimationObjects
Definition: AnimationObjects.java:30
net.sf.gridarta.model.face.ArchFaceProvider
Definition: ArchFaceProvider.java:38
net.sf.gridarta.model.resource.AbstractResourcesReader.faceObjects
final FaceObjects faceObjects
Definition: AbstractResourcesReader.java:97
net.sf.gridarta.model.face.FaceProvider
Definition: FaceProvider.java:30
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net.sf.gridarta.utils.IOUtils.MAP_ENCODING
static final String MAP_ENCODING
Definition: IOUtils.java:52
net.sf.gridarta.model.io.AnimationObjectsReader
Definition: AnimationObjectsReader.java:44
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.model.errorview
Definition: ErrorView.java:20
net.sf.gridarta.model.data.NamedObjects.size
int size()
net.sf.gridarta.model.resource.AbstractResourcesReader.AbstractResourcesReader
AbstractResourcesReader(@NotNull final File collectedDirectory, @Nullable final String imageSet, @NotNull final AnimationObjects animationObjects, @NotNull final FaceObjects faceObjects)
Definition: AbstractResourcesReader.java:106
net.sf.gridarta.model.resource.AbstractResourcesReader.addPNGFace
void addPNGFace(@NotNull final String filename, @NotNull final String path, @NotNull final String name, @NotNull final ErrorView errorView, @NotNull final ArchFaceProvider archFaceProvider)
Definition: AbstractResourcesReader.java:155
net.sf.gridarta.model.face.DuplicateFaceException.getDuplicate
FaceObject getDuplicate()
Definition: DuplicateFaceException.java:60
net.sf.gridarta.model.face.FaceObject.getOriginalFilename
String getOriginalFilename()
net.sf.gridarta.model.face.IllegalFaceException.getFaceObject
FaceObject getFaceObject()
Definition: IllegalFaceException.java:57
net.sf.gridarta.model.resource.AbstractResourcesReader.imageSet
final String imageSet
Definition: AbstractResourcesReader.java:85
name
name
Definition: ArchetypeTypeSetParserTest-ignoreDefaultAttribute1-result.txt:2
net.sf.gridarta.model.resource.AbstractResourcesReader.loadAnimationsFromCollect
void loadAnimationsFromCollect(@NotNull final ErrorView errorView, @NotNull final Map< String, String > animations)
Definition: AbstractResourcesReader.java:118
net.sf.gridarta.model.io
Definition: AbstractArchetypeParser.java:20
net.sf.gridarta.model.resource.AbstractResourcesReader.generateFaceName
String generateFaceName(@NotNull final String name)
Definition: AbstractResourcesReader.java:173
net.sf.gridarta.model.resource.AbstractResourcesReader.LOG
static final Category LOG
Definition: AbstractResourcesReader.java:72
net.sf.gridarta.model.resource.AbstractResourcesReader.animationObjects
final AnimationObjects animationObjects
Definition: AbstractResourcesReader.java:91
net.sf.gridarta.model
net.sf.gridarta.model.face
Definition: AbstractFaceObjects.java:20
net.sf.gridarta.model.anim
Definition: AbstractAnimationObjects.java:20
net.sf.gridarta.model.errorview.ErrorViewCategory
Definition: ErrorViewCategory.java:28
net.sf.gridarta.model.anim.AnimationParseException.getLineNumber
int getLineNumber()
Definition: AnimationParseException.java:59
net.sf.gridarta.model.face.FaceObjects.addFaceObject
void addFaceObject(@NotNull String faceName, @NotNull String originalFilename, int offset, int size)
net.sf.gridarta.model.face.DuplicateFaceException
Definition: DuplicateFaceException.java:26
net.sf.gridarta.utils.IOUtils
Definition: IOUtils.java:40
net.sf.gridarta.model.face.FaceObjects
Definition: FaceObjects.java:31
net.sf.gridarta.model.face.IllegalFaceException
Definition: IllegalFaceException.java:28
net.sf.gridarta.model.resource.AbstractResourcesReader.loadAnimTree
static Map< String, String > loadAnimTree(@NotNull final URL url)
Definition: AbstractResourcesReader.java:217
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.model.anim.AnimationParseException
Definition: AnimationParseException.java:31
net.sf.gridarta.model.resource.AbstractResourcesReader.loadAnimTree
static Map< String, String > loadAnimTree(@NotNull final BufferedReader reader)
Definition: AbstractResourcesReader.java:239