package org.mitallast.ds1; import org.mitallast.dt1.BlockHeader; import org.mitallast.dt1.Extract; import org.mitallast.dt1.FileHeader; import java.io.IOException; import java.io.RandomAccessFile; import java.util.LinkedList; public class FloorRender { public static void main(String... args) throws IOException { FileHeader floorHeader = Extract.read( new RandomAccessFile("tiles/ACT1/BARRACKS/floor.dt1", "r"), new RandomAccessFile("palette/ACT1/pal.dat", "r") ); FileHeader basewallHeader = Extract.read( new RandomAccessFile("tiles/ACT1/BARRACKS/basewall.dt1", "r"), new RandomAccessFile("palette/ACT1/pal.dat", "r") ); FileHeader objectsHeader = Extract.read( new RandomAccessFile("tiles/ACT1/BARRACKS/objects.dt1", "r"), new RandomAccessFile("palette/ACT1/pal.dat", "r") ); FileHeader merged = merge(floorHeader,basewallHeader,objectsHeader); DsInfo dsInfo = DsReader.read( new RandomAccessFile("tiles/ACT1/BARRACKS/barE.ds1", "r") ); System.out.println("width="+dsInfo.width+" height="+dsInfo.height); renderLayer(dsInfo.floor_buff[0], floorHeader,0); renderLayer(dsInfo.wall_buff[0], objectsHeader,1); } public static FileHeader merge(FileHeader... headers){ FileHeader merged=new FileHeader(); merged.blockHeaderList=new LinkedList<BlockHeader>(); for(FileHeader header: headers){ for(BlockHeader blockHeader: header.blockHeaderList){ merged.blockHeaderList.add(blockHeader); } } return merged; } public static void renderLayer(DsLayerInfo[][] layer, FileHeader fileHeader, int type) throws IOException{ for(BlockHeader blockHeader: fileHeader.blockHeaderList){ System.out.println(blockHeader.toJson()+","); } int[][] floor; switch (type){ case 0: floor = searchFloor(layer, fileHeader); break; case 1: floor = searchWall(layer, fileHeader); break; case 2: floor = searchShadow(layer, fileHeader); break; default: throw new UnsupportedOperationException("undefined type"); } for (int[] aFloor : floor) { System.out.print("["); for (int anAFloor : aFloor) { System.out.printf("%4s,", anAFloor); } System.out.println("],"); } } public static int[][] searchShadow(DsLayerInfo[][] layer, FileHeader fileHeader){ int[][] floor = new int[layer[0].length][layer.length]; for(int x=0;x<layer.length;x++){ for (int y=0;y<layer[x].length;y++){ DsLayerInfo layerInfo = layer[x][y]; int main_index, sub_index; if (layerInfo.prop1 == 0) continue; main_index = ((layerInfo.prop3 >> 4)&0x0F + ((layerInfo.prop4 & 0x03) << 4)); sub_index = layerInfo.prop2; //System.out.println("Search "+main_index+" "+sub_index); for(BlockHeader blockHeader: fileHeader.blockHeaderList){ // System.out.println("Test "+blockHeader.orientation+" "+blockHeader.main_index+" "+blockHeader.sub_index); if ( (blockHeader.orientation == 13) && (blockHeader.main_index == main_index) && (blockHeader.sub_index == sub_index) ){ // System.out.println("Found "+blockHeader.offset); floor[y][x]=blockHeader.offset; break; } } } } return floor; } public static int[][] searchWall(DsLayerInfo[][] layer, FileHeader fileHeader){ int[][] floor = new int[layer[0].length][layer.length]; for(int x=0;x<layer.length;x++){ for (int y=0;y<layer[x].length;y++){ DsLayerInfo layerInfo = layer[x][y]; int main_index, sub_index; if (layerInfo.prop1 == 0) continue; main_index = ((layerInfo.prop3 >> 4)&0x0F + ((layerInfo.prop4 & 0x03) << 4)); sub_index = layerInfo.prop2; //System.out.println("Search "+layerInfo.orientation+" "+main_index+" "+sub_index); for(BlockHeader blockHeader: fileHeader.blockHeaderList){ // System.out.println("Test "+blockHeader.orientation+" "+blockHeader.main_index+" "+blockHeader.sub_index); if ( (blockHeader.orientation == layerInfo.orientation) && (blockHeader.main_index == main_index) && (blockHeader.sub_index == sub_index) ){ // System.out.println("Found "+blockHeader.offset); floor[y][x]=blockHeader.offset; break; } } } } return floor; } public static int[][] searchFloor(DsLayerInfo[][] layer, FileHeader fileHeader){ int[][] floor = new int[layer[0].length][layer.length]; for(int x=0;x<layer.length;x++){ for (int y=0;y<layer[x].length;y++){ DsLayerInfo layerInfo = layer[x][y]; int main_index, sub_index; //if (layerInfo.prop1 == 0) continue; main_index = ((layerInfo.prop3 >> 4)&0x0F + ((layerInfo.prop4 & 0x03) << 4)); sub_index = layerInfo.prop2; //System.out.println("Search "+main_index+" "+sub_index); for(BlockHeader blockHeader: fileHeader.blockHeaderList){ // System.out.println("Test "+blockHeader.main_index+" "+blockHeader.sub_index); if ( (blockHeader.orientation == 0) && (blockHeader.main_index == main_index) && (blockHeader.sub_index == sub_index) ){ // System.out.println("Found "+blockHeader); floor[y][x]=blockHeader.offset; break; } } } } return floor; } }