Crossfire JXClient, Trunk
AnimationState.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff
19  * Copyright (C) 2006-2017,2019-2023 Andreas Kirschbaum
20  * Copyright (C) 2010-2012,2014-2018,2020-2023 Nicolas Weeger
21  */
22 
23 package com.realtime.crossfire.jxclient.map;
24 
30 import java.util.Collection;
31 import java.util.Collections;
32 import java.util.HashSet;
33 import java.util.Iterator;
34 import java.util.Set;
35 import org.jetbrains.annotations.NotNull;
36 
41 public class AnimationState implements Iterable<Location> {
42 
46  @NotNull
47  private final Animation animation;
48 
52  @NotNull
54 
58  @NotNull
59  private final ItemSet itemSet;
60 
64  @NotNull
65  private final FacesManager facesManager;
66 
70  private int speed = 1;
71 
75  private int tickNo;
76 
81  private int index;
82 
86  private int lastFace = -1;
87 
91  @NotNull
92  private final Set<Location> locations = new HashSet<>();
93 
97  @NotNull
98  private final Collection<Integer> tags = new HashSet<>();
99 
108  public AnimationState(@NotNull final Animation animation, final int index, @NotNull final CfAnimationsMapListener mapListener, @NotNull final ItemSet itemSet, @NotNull final FacesManager facesManager) {
109  this.animation = animation;
110  this.mapListener = mapListener;
111  this.itemSet = itemSet;
112  this.facesManager = facesManager;
113  this.index = index%animation.getFaces();
114  }
115 
120  public void setSpeed(final int speed) {
121  final int effectiveSpeed = Math.max(1, speed);
122  if (this.speed == effectiveSpeed) {
123  return;
124  }
125  final int tmpIndex = index/this.speed;
126  final int tmpDelay = Math.min(index%this.speed, effectiveSpeed-1);
127  this.speed = effectiveSpeed;
128  index = tmpIndex*effectiveSpeed+tmpDelay;
129  updateFace();
130  }
131 
136  public void setTickNo(final int tickNo) {
137  this.tickNo = tickNo;
138  }
139 
144  public void updateTickNo(final int tickNo) {
145  final int diff = tickNo-this.tickNo;
146  if (tickNo < this.tickNo) {
147  System.err.println("Ignoring inconsistent tick value: current tick number is "+tickNo+", previous tick number was "+this.tickNo+".");
148  } else {
149  index = (index+diff)%(speed*animation.getFaces());
150  }
151  this.tickNo = tickNo;
152  updateFace();
153  }
154 
158  private void updateFace() {
159  final int face = animation.getFace(index/speed);
160  if (face == lastFace) {
161  return;
162  }
163  lastFace = face;
164  for (Location location : locations) {
165  mapListener.mapFace(location, face);
166  }
167  final Face face2 = facesManager.getFace(face);
168  for (int tag : tags) {
169  itemSet.updateItem(UpdItem.UPD_FACE, tag, 0, 0, 0, face2, "", "", 0, 0, 0);
170  }
171  }
172 
177  public void allocate(@NotNull final Location location) {
178  if (!locations.add(location)) {
179  throw new IllegalArgumentException("duplicate location "+location);
180  }
181  if (lastFace != -1) {
182  mapListener.mapFace(location, lastFace);
183  }
184  }
185 
190  public void allocate(final int tag) {
191  if (!tags.add(tag)) {
192  throw new IllegalArgumentException("duplicate item tag "+tag);
193  }
194  if (lastFace != -1) {
195  itemSet.updateItem(UpdItem.UPD_FACE, tag, 0, 0, 0, facesManager.getFace(lastFace), "", "", 0, 0, 0);
196  }
197  }
198 
203  public void free(@NotNull final Location location) {
204  if (!locations.remove(location)) {
205  throw new IllegalArgumentException("undefined location "+location);
206  }
207  }
208 
212  public void freeAllLocations() {
213  locations.clear();
214  }
215 
220  public void free(final int tag) {
221  if (!tags.remove(tag)) {
222  throw new IllegalArgumentException("undefined item tag "+tag);
223  }
224  }
225 
226  @NotNull
227  @Override
228  public Iterator<Location> iterator() {
229  return Collections.unmodifiableSet(locations).iterator();
230  }
231 
239  public void scroll(final int dx, final int dy, final int width, final int height) {
240  final Collection<Location> tmp = new HashSet<>();
241  for (Location location : locations) {
242  if (0 <= location.getX() && location.getX() < width && 0 <= location.getY() && location.getY() < height) { // out-of-map bounds animations are dropped, not scrolled
243  final int newX = location.getX()-dx;
244  final int newY = location.getY()-dy;
245  if (0 <= newX && newX < width && 0 <= newY && newY < height) { // in-map bounds animations are dropped if scrolled off the visible area
246  final Location newLocation = new Location(newX, newY, location.getLayer());
247  tmp.add(newLocation);
248  }
249  }
250  }
251  locations.clear();
252  locations.addAll(tmp);
253  }
254 
255 }
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.map.AnimationState.itemSet
final ItemSet itemSet
Definition: AnimationState.java:59
com.realtime.crossfire.jxclient.map.AnimationState.tags
final Collection< Integer > tags
Definition: AnimationState.java:98
com.realtime.crossfire.jxclient.map.AnimationState.setSpeed
void setSpeed(final int speed)
Definition: AnimationState.java:120
com.realtime.crossfire.jxclient.map.AnimationState.mapListener
final CfAnimationsMapListener mapListener
Definition: AnimationState.java:53
com.realtime.crossfire.jxclient.map.AnimationState.AnimationState
AnimationState(@NotNull final Animation animation, final int index, @NotNull final CfAnimationsMapListener mapListener, @NotNull final ItemSet itemSet, @NotNull final FacesManager facesManager)
Definition: AnimationState.java:108
com.realtime.crossfire.jxclient.map.AnimationState.setTickNo
void setTickNo(final int tickNo)
Definition: AnimationState.java:136
com.realtime.crossfire.jxclient.animations.Animation.getFace
int getFace(final int index)
Definition: Animation.java:78
com.realtime.crossfire.jxclient.map.AnimationState.free
void free(final int tag)
Definition: AnimationState.java:220
com.realtime.crossfire.jxclient.items.ItemSet
Definition: ItemSet.java:44
com.realtime.crossfire.jxclient.map.AnimationState.animation
final Animation animation
Definition: AnimationState.java:47
com.realtime.crossfire.jxclient.map.AnimationState.free
void free(@NotNull final Location location)
Definition: AnimationState.java:203
com.realtime.crossfire.jxclient.faces
Definition: AbstractFaceQueue.java:23
com.realtime.crossfire.jxclient.map.AnimationState.facesManager
final FacesManager facesManager
Definition: AnimationState.java:65
com.realtime.crossfire.jxclient.map.AnimationState.locations
final Set< Location > locations
Definition: AnimationState.java:92
com.realtime.crossfire.jxclient.protocol
Definition: MagicMap.java:23
com.realtime.crossfire.jxclient.map.Location
Definition: Location.java:32
com.realtime.crossfire.jxclient.faces.FacesManager.getFace
Face getFace(int faceNum)
com.realtime.crossfire.jxclient.map.AnimationState.updateFace
void updateFace()
Definition: AnimationState.java:158
com.realtime.crossfire.jxclient.map.AnimationState.updateTickNo
void updateTickNo(final int tickNo)
Definition: AnimationState.java:144
com.realtime.crossfire.jxclient.map.CfAnimationsMapListener.mapFace
void mapFace(@NotNull Location location, int faceNum)
com.realtime.crossfire.jxclient.map.AnimationState.scroll
void scroll(final int dx, final int dy, final int width, final int height)
Definition: AnimationState.java:239
com.realtime.crossfire.jxclient.animations
Definition: Animation.java:23
com.realtime.crossfire.jxclient.animations.Animation.getFaces
int getFaces()
Definition: Animation.java:69
com.realtime.crossfire.jxclient.map.AnimationState.index
int index
Definition: AnimationState.java:81
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_FACE
int UPD_FACE
Definition: UpdItem.java:49
com.realtime.crossfire.jxclient.map.AnimationState.speed
int speed
Definition: AnimationState.java:70
com.realtime.crossfire.jxclient.faces.FacesManager
Definition: FacesManager.java:40
com.realtime.crossfire.jxclient.map.AnimationState.iterator
Iterator< Location > iterator()
Definition: AnimationState.java:228
com.realtime.crossfire.jxclient.map.AnimationState.allocate
void allocate(final int tag)
Definition: AnimationState.java:190
com.realtime.crossfire.jxclient.map.AnimationState.freeAllLocations
void freeAllLocations()
Definition: AnimationState.java:212
com.realtime.crossfire
com.realtime.crossfire.jxclient.map.AnimationState
Definition: AnimationState.java:41
com.realtime
com.realtime.crossfire.jxclient.items.ItemSet.updateItem
void updateItem(final int flags, final int tag, final int valLocation, final int valFlags, final int valWeight, @NotNull final Face valFace, @NotNull final String valName, @NotNull final String valNamePl, final int valAnim, final int valAnimSpeed, final int valNrof)
Definition: ItemSet.java:350
com
com.realtime.crossfire.jxclient.items
Definition: AbstractItemView.java:23
com.realtime.crossfire.jxclient.map.AnimationState.lastFace
int lastFace
Definition: AnimationState.java:86
com.realtime.crossfire.jxclient.animations.Animation
Definition: Animation.java:32
com.realtime.crossfire.jxclient.map.CfAnimationsMapListener
Definition: CfAnimationsMapListener.java:5
com.realtime.crossfire.jxclient.protocol.UpdItem
Definition: UpdItem.java:29
com.realtime.crossfire.jxclient.faces.Face
Definition: Face.java:37
com.realtime.crossfire.jxclient.map.AnimationState.allocate
void allocate(@NotNull final Location location)
Definition: AnimationState.java:177
com.realtime.crossfire.jxclient.map.AnimationState.tickNo
int tickNo
Definition: AnimationState.java:75