/******************************************************************************* * Copyright (c) MOBAC developers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ /* ********************************************* * Copyright: Andreas Sander * * * ********************************************* */ package mobac.program.atlascreators.impl.rmp; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; /** * Container for tiles and link to subtrees * */ public class TileContainer { private final TileContainer previous; private final ArrayList<Tiledata> tiles; private final ArrayList<TileContainer> followUps; public TileContainer() { this(null); } public TileContainer(TileContainer previous) { this.previous = previous; tiles = new ArrayList<Tiledata>(100); followUps = new ArrayList<TileContainer>(); } /** * Set tile for given position. next is only valid if a previous value is * set */ public void addTile(Tiledata tile, TileContainer next) { tiles.add(tile); if (previous != null) followUps.add(next); } /** * Returns the number of tiles in this container including all sub * containers */ public int getTileCount() { int count = tiles.size(); if (previous != null) count += previous.getTileCount(); for (TileContainer next : followUps) count += next.getTileCount(); return count; } /** * returns the number of containers in the tree */ public int getContainerCount() { return 1 + followUps.size(); } /** * Write the whole tree into the stream */ public void writeTree(OutputStream os) throws IOException { /* --- if this container has subtrees --- */ if (previous != null) { /* --- Write previous --- */ previous.writeTree(os); /* --- Write ourselves --- */ writeContainer(os); /* --- And all subtrees --- */ for (TileContainer tc : followUps) tc.writeTree(os); } else { /* --- Just write the tile itself, if it does not have subtrees --- */ writeContainer(os); } } /** * Write the content of the container */ public void writeContainer(OutputStream os) throws IOException { /* --- Number of tiles in subtree --- */ RmpTools.writeValue(os, getTileCount(), 4); /* --- Number of tiles in node --- */ RmpTools.writeValue(os, tiles.size(), 2); /* --- Last node flag --- */ RmpTools.writeValue(os, previous == null ? 1 : 0, 2); /* --- Info about 99 tiles --- */ for (int i = 0; i < 99; i++) { int x = 0; int y = 0; int offset = 0; if (i < tiles.size()) { x = tiles.get(i).posx; y = tiles.get(i).posy; offset = tiles.get(i).totalOffset; } RmpTools.writeValue(os, x, 4); RmpTools.writeValue(os, y, 4); RmpTools.writeValue(os, 0, 4); RmpTools.writeValue(os, offset, 4); } /* --- Offset to previous --- */ if (previous == null) RmpTools.writeValue(os, 0, 4); else RmpTools.writeValue(os, 0x0f5c, 4); /* --- Offset to following --- */ for (int i = 0; i < 99; i++) { if (i < followUps.size()) RmpTools.writeValue(os, 0x0f5c + (i + 2) * 1992, 4); else RmpTools.writeValue(os, 0, 4); } } }