Package org.mitallast.ds1

Source Code of org.mitallast.ds1.FloorRender

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;
    }
}
TOP

Related Classes of org.mitallast.ds1.FloorRender

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.