Gridarta Editor
DefaultIsoGameObject.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.Point;
23 import javax.swing.Icon;
24 import javax.swing.ImageIcon;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.annotations.Nullable;
33 
38 public abstract class DefaultIsoGameObject<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends AbstractGameObject<G, A, R> {
39 
43  private static final long serialVersionUID = 1L;
44 
45  private static final int MAX_STRETCH = 8;
46 
47  private static final int MAX_STRETCH_DIAGONAL = 12;
48 
49  public static final int MAX_SUB_LAYERS = 7;
50 
54  @NotNull
55  public static final String Z = "z";
56 
60  @NotNull
61  public static final String LAYER = "layer";
62 
66  @NotNull
67  public static final String SUB_LAYER = "sub_layer";
68 
72  @NotNull
73  public static final String SYS_OBJECT = "sys_object";
74 
78  @NotNull
79  protected static final String DRAW_DOUBLE_ALWAYS = "draw_double_always";
80 
84  @NotNull
85  protected static final String DRAW_DOUBLE = "draw_double";
86 
90  @NotNull
91  public static final String ALIGN = "align";
92 
96  @NotNull
97  public static final String ZOOM = "zoom";
98 
102  @NotNull
103  public static final String ALPHA = "alpha";
104 
108  @NotNull
109  public static final String ROTATE = "rotate";
110 
114  @NotNull
115  protected static final String GLOW_RADIUS = "glow_radius";
116 
120  @NotNull
121  private final transient FaceObjectProviders faceObjectProviders;
122 
127  @Nullable
128  private ImageIcon transFace;
129 
134  @Nullable
135  private ImageIcon doubleFace;
136 
141  @Nullable
142  private ImageIcon transDoubleFace;
143 
148  @Nullable
149  private ImageIcon stretchedFace;
150 
154  @NotNull
155  private final Point point = new Point();
156 
161  private boolean stretchFactorIsValid;
162 
166  private long stretchFactor;
167 
175  protected DefaultIsoGameObject(@NotNull final R archetype, @NotNull final FaceObjectProviders faceObjectProviders, @NotNull final AnimationObjects animationObjects) {
176  super(archetype, faceObjectProviders, animationObjects);
177  this.faceObjectProviders = faceObjectProviders;
178  }
179 
180  @Override
181  public boolean usesDirection() {
182  return getAttributeInt(IS_TURNABLE) != 0 || getAttributeInt(IS_ANIMATED) != 0;
183  }
184 
185  @Override
186  public void setObjectFace() {
187  transFace = null;
188  doubleFace = null;
189  transDoubleFace = null;
190  stretchedFace = null;
191  super.setObjectFace();
192  }
193 
198  @NotNull
199  public Icon getTransparentImage() {
200  if (transFace == null) {
202  }
203  return transFace;
204  }
205 
210  @NotNull
211  public Icon getDoubleImage() {
212  if (doubleFace == null) {
214  }
215  return doubleFace;
216  }
217 
222  @NotNull
224  if (transDoubleFace == null) {
226  }
227  return transDoubleFace;
228  }
229 
234  public final int getYOffset() {
235  return getAttributeInt(LAYER) > 1 ? getAttributeInt(Z) : 0;
236  }
237 
245  private int getYFloorOffset(final int dx, final int dy) {
246  final MapSquare<G, A, R> mapSquare = getMapSquareOptional();
247  if (mapSquare == null) {
248  return 0;
249  }
250 
251  point.x = mapSquare.getMapX() + dx;
252  point.y = mapSquare.getMapY() + dy;
253 
254  try {
255  for (final G gameObject : mapSquare.getMapModel().getMapSquare(point)) {
256  if (gameObject.getAttributeInt(LAYER) == 1 && gameObject.getAttributeInt(SUB_LAYER) == getAttributeInt(SUB_LAYER)) {
257  return gameObject.getAttributeInt(Z);
258  }
259  }
260  } catch (final IndexOutOfBoundsException ignored) {
261  // skip points outside map bounds
262  }
263 
264  return 0;
265  }
266 
271  public final void refreshStretchFactor() {
272  stretchFactorIsValid = false;
273  stretchedFace = null;
274  }
275 
282  public final long getStretchFactor() {
283  if (stretchFactorIsValid) {
284  return stretchFactor;
285  }
286 
287  int nwHeight = getYFloorOffset(-1, -1);
288  int nHeight = getYFloorOffset(0, -1);
289  int neHeight = getYFloorOffset(1, -1);
290  int swHeight = getYFloorOffset(-1, 1);
291  int sHeight = getYFloorOffset(0, 1);
292  int seHeight = getYFloorOffset(1, 1);
293  int wHeight = getYFloorOffset(-1, 0);
294  int eHeight = getYFloorOffset(1, 0);
295  final int myHeight = getYFloorOffset(0, 0);
296 
297  if (Math.abs(myHeight - eHeight) > MAX_STRETCH) {
298  eHeight = myHeight;
299  }
300 
301  if (Math.abs(myHeight - seHeight) > MAX_STRETCH_DIAGONAL) {
302  seHeight = myHeight;
303  }
304 
305  if (Math.abs(myHeight - sHeight) > MAX_STRETCH) {
306  sHeight = myHeight;
307  }
308 
309  if (Math.abs(myHeight - swHeight) > MAX_STRETCH_DIAGONAL) {
310  swHeight = myHeight;
311  }
312 
313  if (Math.abs(myHeight - wHeight) > MAX_STRETCH) {
314  wHeight = myHeight;
315  }
316 
317  if (Math.abs(myHeight - nwHeight) > MAX_STRETCH_DIAGONAL) {
318  nwHeight = myHeight;
319  }
320 
321  if (Math.abs(myHeight - nHeight) > MAX_STRETCH) {
322  nHeight = myHeight;
323  }
324 
325  if (Math.abs(myHeight - neHeight) > MAX_STRETCH_DIAGONAL) {
326  neHeight = myHeight;
327  }
328 
329  int top = Math.max(wHeight, nwHeight);
330  top = Math.max(top, nHeight);
331  top = Math.max(top, myHeight);
332 
333  int bottom = Math.max(sHeight, seHeight);
334  bottom = Math.max(bottom, eHeight);
335  bottom = Math.max(bottom, myHeight);
336 
337  int right = Math.max(nHeight, neHeight);
338  right = Math.max(right, eHeight);
339  right = Math.max(right, myHeight);
340 
341  int left = Math.max(wHeight, swHeight);
342  left = Math.max(left, sHeight);
343  left = Math.max(left, myHeight);
344 
345  int minHt = Math.min(top, bottom);
346  minHt = Math.min(minHt, left);
347  minHt = Math.min(minHt, right);
348  minHt = Math.min(minHt, myHeight);
349 
350  if (myHeight < 0 && left == 0 && right == 0 && top == 0 && bottom == 0) {
351  int top2 = Math.min(wHeight, nwHeight);
352  top2 = Math.min(top2, nHeight);
353  top2 = Math.min(top2, myHeight);
354 
355  int bottom2 = Math.min(sHeight, seHeight);
356  bottom2 = Math.min(bottom2, eHeight);
357  bottom2 = Math.min(bottom2, myHeight);
358 
359  int right2 = Math.min(nHeight, neHeight);
360  right2 = Math.min(right2, eHeight);
361  right2 = Math.min(right2, myHeight);
362 
363  int left2 = Math.min(wHeight, swHeight);
364  left2 = Math.min(left2, sHeight);
365  left2 = Math.min(left2, myHeight);
366 
367  top = top2 - top;
368  bottom = bottom2 - bottom;
369  right = right2 - right;
370  left = left2 - left;
371 
372  minHt = Math.min(top, bottom);
373  minHt = Math.min(minHt, left);
374  minHt = Math.min(minHt, right);
375  minHt = Math.min(minHt, myHeight);
376 
377  minHt = Math.abs(minHt);
378  top = Math.abs(top);
379  bottom = Math.abs(bottom);
380  left = Math.abs(left);
381  right = Math.abs(right);
382  }
383 
384  top -= minHt;
385  bottom -= minHt;
386  left -= minHt;
387  right -= minHt;
388 
389  top = Math.abs(Math.min(255, top));
390  bottom = Math.abs(Math.min(255, bottom));
391  left = Math.abs(Math.min(255, left));
392  right = Math.abs(Math.min(255, right));
393 
394  stretchFactor = bottom + (left << 8) + (right << 16) + (top << 24);
395  stretchFactorIsValid = true;
396  return stretchFactor;
397  }
398 
403  @NotNull
404  public Icon getStretchedImage(final long stretchFactor) {
405  if (stretchedFace == null) {
407  }
408  return stretchedFace;
409  }
410 
417  public abstract boolean isDrawDouble(boolean drawDoubleFaces);
418 
425  public abstract boolean isStretched(boolean tileStretching);
426 
427  @NotNull
428  @Override
429  @SuppressWarnings("unchecked")
430  public G clone() {
432  return clone.getThis();
433  }
434 
435  @Override
436  public boolean isEqual(@NotNull final BaseObject<?, ?, ?, ?> gameObject) {
437  return super.isEqual(gameObject);
438  // ignore "scriptArchData"
439  // ignore "transFace"
440  }
441 
442  @Override
443  public void facesReloaded() {
444  transFace = null;
445  doubleFace = null;
446  transDoubleFace = null;
447  stretchedFace = null;
448  super.facesReloaded();
449  }
450 
451 }
net.sf.gridarta.model.face.FaceObjectProviders.getDouble
ImageIcon getDouble(@NotNull final GameObject<?, ?, ?> gameObject)
Definition: FaceObjectProviders.java:291
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.faceObjectProviders
final transient FaceObjectProviders faceObjectProviders
Definition: DefaultIsoGameObject.java:121
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.doubleFace
ImageIcon doubleFace
Definition: DefaultIsoGameObject.java:135
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.getYOffset
final int getYOffset()
Definition: DefaultIsoGameObject.java:234
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.usesDirection
boolean usesDirection()
Definition: DefaultIsoGameObject.java:181
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.clone
G clone()
Definition: DefaultIsoGameObject.java:430
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.refreshStretchFactor
final void refreshStretchFactor()
Definition: DefaultIsoGameObject.java:271
net.sf.gridarta
net.sf.gridarta.model.face.FaceObjectProviders
Definition: FaceObjectProviders.java:46
net.sf.gridarta.model.face.FaceObjectProviders.getStretched
ImageIcon getStretched(@NotNull final GameObject<?, ?, ?> gameObject, final long stretch)
Definition: FaceObjectProviders.java:316
net.sf.gridarta.model.maparchobject.MapArchObject
Definition: MapArchObject.java:40
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.isEqual
boolean isEqual(@NotNull final BaseObject<?, ?, ?, ?> gameObject)
Definition: DefaultIsoGameObject.java:436
net.sf.gridarta.model.mapmodel.MapSquare.getMapModel
MapModel< G, A, R > getMapModel()
Definition: MapSquare.java:99
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.getDoubleImage
Icon getDoubleImage()
Definition: DefaultIsoGameObject.java:211
net.sf
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.getStretchFactor
final long getStretchFactor()
Definition: DefaultIsoGameObject.java:282
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.MAX_SUB_LAYERS
static final int MAX_SUB_LAYERS
Definition: DefaultIsoGameObject.java:49
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.model.gameobject.AbstractGameObject
Definition: AbstractGameObject.java:38
net.sf.gridarta.model.baseobject.BaseObject
Definition: BaseObject.java:34
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.SUB_LAYER
static final String SUB_LAYER
Definition: DefaultIsoGameObject.java:67
net.sf.gridarta.model.anim.AnimationObjects
Definition: AnimationObjects.java:30
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.ROTATE
static final String ROTATE
Definition: DefaultIsoGameObject.java:109
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.DRAW_DOUBLE_ALWAYS
static final String DRAW_DOUBLE_ALWAYS
Definition: DefaultIsoGameObject.java:79
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.mapmodel.MapSquare
Definition: MapSquare.java:45
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.serialVersionUID
static final long serialVersionUID
Definition: DefaultIsoGameObject.java:43
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.ZOOM
static final String ZOOM
Definition: DefaultIsoGameObject.java:97
net.sf.gridarta.model.mapmodel.MapModel.getMapSquare
MapSquare< G, A, R > getMapSquare(@NotNull Point pos)
net.sf.gridarta.model.mapmodel.MapSquare.getMapX
int getMapX()
Definition: MapSquare.java:107
net.sf.gridarta.model.gameobject.AbstractGameObject< G, A, R >::archetype
R archetype
Definition: AbstractGameObject.java:51
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.getTransparentDoubleImage
Icon getTransparentDoubleImage()
Definition: DefaultIsoGameObject.java:223
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.DefaultIsoGameObject
DefaultIsoGameObject(@NotNull final R archetype, @NotNull final FaceObjectProviders faceObjectProviders, @NotNull final AnimationObjects animationObjects)
Definition: DefaultIsoGameObject.java:175
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.getYFloorOffset
int getYFloorOffset(final int dx, final int dy)
Definition: DefaultIsoGameObject.java:245
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.ALIGN
static final String ALIGN
Definition: DefaultIsoGameObject.java:91
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.ALPHA
static final String ALPHA
Definition: DefaultIsoGameObject.java:103
net.sf.gridarta.model.face.FaceObjectProviders.getTrans
ImageIcon getTrans(@NotNull final GameObject<?, ?, ?> gameObject)
Definition: FaceObjectProviders.java:280
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.isDrawDouble
abstract boolean isDrawDouble(boolean drawDoubleFaces)
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.MAX_STRETCH
static final int MAX_STRETCH
Definition: DefaultIsoGameObject.java:45
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.transFace
ImageIcon transFace
Definition: DefaultIsoGameObject.java:128
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.LAYER
static final String LAYER
Definition: DefaultIsoGameObject.java:61
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.transDoubleFace
ImageIcon transDoubleFace
Definition: DefaultIsoGameObject.java:142
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.point
final Point point
Definition: DefaultIsoGameObject.java:155
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.setObjectFace
void setObjectFace()
Definition: DefaultIsoGameObject.java:186
net.sf.gridarta.model.gameobject.DefaultIsoGameObject
Definition: DefaultIsoGameObject.java:38
net.sf.gridarta.model
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.SYS_OBJECT
static final String SYS_OBJECT
Definition: DefaultIsoGameObject.java:73
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.DRAW_DOUBLE
static final String DRAW_DOUBLE
Definition: DefaultIsoGameObject.java:85
net.sf.gridarta.model.mapmodel.MapSquare.getMapY
int getMapY()
Definition: MapSquare.java:115
net.sf.gridarta.model.gameobject.AbstractGameObject< G, A, R >::getMapSquareOptional
MapSquare< G, A, R > getMapSquareOptional()
Definition: AbstractGameObject.java:268
net.sf.gridarta.model.baseobject
Definition: AbstractBaseObject.java:20
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.stretchFactorIsValid
boolean stretchFactorIsValid
Definition: DefaultIsoGameObject.java:161
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.MAX_STRETCH_DIAGONAL
static final int MAX_STRETCH_DIAGONAL
Definition: DefaultIsoGameObject.java:47
net.sf.gridarta.model.face
Definition: AbstractFaceObjects.java:20
net.sf.gridarta.model.anim
Definition: AbstractAnimationObjects.java:20
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.facesReloaded
void facesReloaded()
Definition: DefaultIsoGameObject.java:443
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.getTransparentImage
Icon getTransparentImage()
Definition: DefaultIsoGameObject.java:199
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.isStretched
abstract boolean isStretched(boolean tileStretching)
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.stretchFactor
long stretchFactor
Definition: DefaultIsoGameObject.java:166
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.Z
static final String Z
Definition: DefaultIsoGameObject.java:55
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.getStretchedImage
Icon getStretchedImage(final long stretchFactor)
Definition: DefaultIsoGameObject.java:404
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.GLOW_RADIUS
static final String GLOW_RADIUS
Definition: DefaultIsoGameObject.java:115
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.stretchedFace
ImageIcon stretchedFace
Definition: DefaultIsoGameObject.java:149
net.sf.gridarta.model.face.FaceObjectProviders.getTransDouble
ImageIcon getTransDouble(@NotNull final GameObject<?, ?, ?> gameObject)
Definition: FaceObjectProviders.java:305