Gridarta Editor
MultiPositionData.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.gameobject;
21 
22 import java.awt.Dimension;
23 import java.io.BufferedReader;
24 import java.io.IOException;
25 import java.io.InputStream;
26 import java.io.InputStreamReader;
27 import java.io.LineNumberReader;
28 import java.io.Reader;
29 import java.net.URL;
33 import net.sf.gridarta.utils.IOUtils;
35 import org.apache.log4j.Category;
36 import org.apache.log4j.Logger;
37 import org.jetbrains.annotations.NotNull;
38 
44 public class MultiPositionData {
45 
49  @NotNull
50  private static final Category LOG = Logger.getLogger(MultiPositionData.class);
51 
55  public static final int Y_DIM = 16;
56 
60  @NotNull
62 
66  @NotNull
67  private final MultiPositionEntry @NotNull [] data = new MultiPositionEntry[Y_DIM];
68 
74  this.isoMapSquareInfo = isoMapSquareInfo;
75  }
76 
83  public void load(@NotNull final ErrorView errorView, @NotNull final URL url) {
84  final ErrorViewCollector errorViewCollector = new ErrorViewCollector(errorView, url);
85  // read data file line by line, parsing numbers into the array
86  try {
87  try (InputStream inputStream = url.openStream()) {
88  try (Reader reader = new InputStreamReader(inputStream, IOUtils.MAP_ENCODING)) {
89  try (BufferedReader bufferedReader = new BufferedReader(reader)) {
90  try (LineNumberReader lnr = new LineNumberReader(bufferedReader)) {
91  int yp = 0; // y-index in the data array
92 
93  // read the whole file line by line
94  boolean hasErrors = false;
95  while (true) {
96  final String inputLine = lnr.readLine();
97  if (inputLine == null) {
98  break;
99  }
100  final String line = inputLine.trim();
101  if (line.isEmpty() || line.startsWith("#")) {
102  continue;
103  }
104  if (yp >= Y_DIM) {
105  errorViewCollector.addWarning(ErrorViewCategory.ARCHDEF_ENTRY_INVALID, lnr.getLineNumber(), "too many entries");
106  break;
107  }
108  final String[] numbers = StringUtils.PATTERN_SPACE.split(line);
109  if (numbers.length != 2) {
110  errorViewCollector.addError(ErrorViewCategory.ARCHDEF_ENTRY_INVALID, lnr.getLineNumber(), "syntax error");
111  hasErrors = true;
112  continue;
113  }
114  final Dimension d = new Dimension();
115  try {
116  // parse and store it as integer
117  d.width = Integer.parseInt(numbers[0]);
118  } catch (final NumberFormatException ignored) {
119  errorViewCollector.addError(ErrorViewCategory.ARCHDEF_ENTRY_INVALID, lnr.getLineNumber(), "invalid number: " + numbers[0]);
120  hasErrors = true;
121  continue;
122  }
123  try {
124  // parse and store it as integer
125  d.height = Integer.parseInt(numbers[1]);
126  } catch (final NumberFormatException ignored) {
127  errorViewCollector.addError(ErrorViewCategory.ARCHDEF_ENTRY_INVALID, lnr.getLineNumber(), "invalid number: " + numbers[1]);
128  hasErrors = true;
129  continue;
130  }
131  data[yp++] = new MultiPositionEntry(isoMapSquareInfo, d);
132  }
133 
134  // report if there haven't been enough rows in the file
135  if (yp < Y_DIM && !hasErrors) {
136  errorViewCollector.addWarning(ErrorViewCategory.ARCHDEF_ENTRY_INVALID, "missing " + (Y_DIM - yp) + " entries");
137  }
138 
139  // confirm load process
140  if (LOG.isInfoEnabled()) {
141  LOG.info("Loaded multi-part position data from '" + url + "'");
142  }
143  }
144  }
145  }
146  }
147  } catch (final IOException ex) {
148  errorViewCollector.addWarning(ErrorViewCategory.ARCHDEF_FILE_INVALID, ex.getMessage());
149  }
150  }
151 
161  public int getXOffset(final int shapeID, final int positionID) {
162  final MultiPositionEntry entry = data[shapeID];
163  return entry == null ? 0 : entry.getXOffset(positionID);
164  }
165 
175  public int getYOffset(final int shapeID, final int positionID) {
176  final MultiPositionEntry entry = data[shapeID];
177  return entry == null ? 0 : entry.getYOffset(positionID);
178  }
179 
185  public int getWidth(final int shapeID) {
186  final MultiPositionEntry entry = data[shapeID];
187  return entry == null ? 0 : entry.getWidth();
188  }
189 
195  public int getHeight(final int shapeID) {
196  final MultiPositionEntry entry = data[shapeID];
197  return entry == null ? 0 : entry.getHeight();
198  }
199 
200 }
net.sf.gridarta.model.errorview.ErrorView
Definition: ErrorView.java:28
net.sf.gridarta.model.gameobject.MultiPositionData.getHeight
int getHeight(final int shapeID)
Definition: MultiPositionData.java:195
net.sf.gridarta.model.errorview.ErrorViewCategory.ARCHDEF_ENTRY_INVALID
ARCHDEF_ENTRY_INVALID
Definition: ErrorViewCategory.java:42
net.sf.gridarta.utils.StringUtils
Definition: StringUtils.java:31
net.sf.gridarta
net.sf.gridarta.model.errorview.ErrorViewCollector
Definition: ErrorViewCollector.java:31
net.sf.gridarta.model.gameobject.MultiPositionData.getWidth
int getWidth(final int shapeID)
Definition: MultiPositionData.java:185
net.sf.gridarta.model.gameobject.MultiPositionData.load
void load(@NotNull final ErrorView errorView, @NotNull final URL url)
Definition: MultiPositionData.java:83
net.sf
net.sf.gridarta.model.gameobject.MultiPositionData.MultiPositionData
MultiPositionData(@NotNull final IsoMapSquareInfo isoMapSquareInfo)
Definition: MultiPositionData.java:73
net.sf.gridarta.model.gameobject.MultiPositionEntry
Definition: MultiPositionEntry.java:29
net.sf.gridarta.model.gameobject.MultiPositionData.getXOffset
int getXOffset(final int shapeID, final int positionID)
Definition: MultiPositionData.java:161
net.sf.gridarta.model.gameobject.MultiPositionEntry.getXOffset
int getXOffset(final int positionID)
Definition: MultiPositionEntry.java:83
net.sf.gridarta.model.gameobject.MultiPositionData.LOG
static final Category LOG
Definition: MultiPositionData.java:50
net.sf.gridarta.utils.IOUtils.MAP_ENCODING
static final String MAP_ENCODING
Definition: IOUtils.java:52
net.sf.gridarta.model.gameobject.IsoMapSquareInfo
Definition: IsoMapSquareInfo.java:26
net.sf.gridarta.model.errorview.ErrorViewCollector.addError
void addError(@NotNull final ErrorViewCategory category)
Definition: ErrorViewCollector.java:95
net
net.sf.gridarta.model.errorview
Definition: ErrorView.java:20
net.sf.gridarta.model.gameobject.MultiPositionEntry.getHeight
int getHeight()
Definition: MultiPositionEntry.java:110
net.sf.gridarta.model.errorview.ErrorViewCategory.ARCHDEF_FILE_INVALID
ARCHDEF_FILE_INVALID
Definition: ErrorViewCategory.java:44
net.sf.gridarta.model.gameobject.MultiPositionData.data
final MultiPositionEntry[] data
Definition: MultiPositionData.java:67
net.sf.gridarta.model.errorview.ErrorViewCollector.addWarning
void addWarning(@NotNull final ErrorViewCategory category)
Definition: ErrorViewCollector.java:68
net.sf.gridarta.model
net.sf.gridarta.model.gameobject.MultiPositionData.Y_DIM
static final int Y_DIM
Definition: MultiPositionData.java:55
net.sf.gridarta.utils.StringUtils.PATTERN_SPACE
static final Pattern PATTERN_SPACE
Definition: StringUtils.java:67
net.sf.gridarta.model.errorview.ErrorViewCategory
Definition: ErrorViewCategory.java:28
net.sf.gridarta.model.gameobject.MultiPositionData.getYOffset
int getYOffset(final int shapeID, final int positionID)
Definition: MultiPositionData.java:175
net.sf.gridarta.model.gameobject.MultiPositionEntry.getYOffset
int getYOffset(final int positionID)
Definition: MultiPositionEntry.java:94
net.sf.gridarta.utils.IOUtils
Definition: IOUtils.java:40
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.model.gameobject.MultiPositionEntry.getWidth
int getWidth()
Definition: MultiPositionEntry.java:102
net.sf.gridarta.model.gameobject.MultiPositionData.isoMapSquareInfo
final IsoMapSquareInfo isoMapSquareInfo
Definition: MultiPositionData.java:61
net.sf.gridarta.model.gameobject.MultiPositionData
Definition: MultiPositionData.java:44