package org.mitallast.dt1;
import org.mitallast.pallete.PaletteReader;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
public class Extract {
static {
System.setProperty("java.awt.headless", "true");
}
public static void main(String... args){
String[] fileNames = new String[]{
"tiles/ACT1/BARRACKS/basewall.dt1",
"tiles/ACT1/BARRACKS/floor.dt1",
"tiles/ACT1/BARRACKS/objects.dt1",
};
int i=0;
for(String fileName: fileNames){
extract(fileName, String.valueOf(i++));
}
}
public static void extract(String fileName, String dir){
try {
new File("output/" + dir).mkdir();
DtReader reader = new DtReader(new RandomAccessFile(fileName, "r"));
int[] palette = PaletteReader.getPalette(
new RandomAccessFile("palette/ACT1/pal.dat", "r"),
new RandomAccessFile("palette/gamma.dat", "r")
);
FileHeader fileHeader = reader.getFileHeader();
fileHeader.blockHeaderList = new ArrayList<BlockHeader>();
//System.out.println(fileHeader);
// load block header
int block_ptr = fileHeader.getBh_ptr();
for (int nb_block=0;nb_block<fileHeader.getNb_block();nb_block++)
{
BlockHeader blockHeader = reader.getBlockHeader(block_ptr);
blockHeader.subBlockHeaderList = new ArrayList<SubBlockHeader>();
fileHeader.blockHeaderList.add(blockHeader);
//System.out.println(blockHeader);
// load sub block
int sub_ptr=blockHeader.getData_pointer();
int orientation = blockHeader.orientation;
int w = blockHeader.size_x;
int h = blockHeader.size_y;
int y_add = 96;
if ((orientation == 0) || (orientation == 15)) // floor or roof
{
if (blockHeader.size_y!=0)
{
blockHeader.size_y = - 80;
h = 80;
y_add = 0;
}
}
else if (orientation < 15) // upper wall, shadow, special
{
if (blockHeader.size_y!=0)
{
blockHeader.size_y += 32;
h -= 32;
y_add = h;
}
}
if(w<=0 || h<=0) continue;
System.out.println("create img "+w+" "+h+" ("+blockHeader.size_x+" "+blockHeader.size_y+")");
BufferedImage bufferedImage = new BufferedImage(w,h, BufferedImage.TYPE_INT_ARGB);
for(int sub=0;sub<blockHeader.getSub_block();sub++){
SubBlockHeader subBlockHeader = reader.getSubBlockHeader(sub_ptr);
blockHeader.subBlockHeaderList.add(subBlockHeader);
//System.out.println(subBlockHeader);
// load tiles
int tile_ptr = blockHeader.getData_pointer()+subBlockHeader.getData_offset();
byte[] tile = reader.getTile(tile_ptr, subBlockHeader.getSub_length());
if(subBlockHeader.getTile_format()==1){
draw_sub_tile_isometric(
bufferedImage,
subBlockHeader.getX_pos(),
y_add + subBlockHeader.getY_pos(),
tile,
palette
);
}else{
// if(block_ptr==2772){
// System.out.println(subBlockHeader.getX_pos()+":"+subBlockHeader.getY_pos());
draw_sub_tile_normal(
bufferedImage,
subBlockHeader.getX_pos(),
y_add + subBlockHeader.getY_pos(),
tile,
palette
);
// }
}
sub_ptr+=SubBlockHeader.BYTE_COUNT;
}
File file = new File("output/" + dir +"/"+block_ptr + ".png");
ImageIO.write(bufferedImage, "png", file);
block_ptr+=BlockHeader.BYTE_COUNT;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static FileHeader read(RandomAccessFile dtFile, RandomAccessFile palFile) throws IOException {
DtReader reader = new DtReader(dtFile);
// int[] palette = PaletteReader.getPalette(
// palFile,
// new RandomAccessFile("palette/gamma.dat", "r")
// );
FileHeader fileHeader = reader.getFileHeader();
fileHeader.blockHeaderList = new ArrayList<BlockHeader>();
//System.out.println(fileHeader);
// load block header
int block_ptr = fileHeader.getBh_ptr();
for (int nb_block=0;nb_block<fileHeader.getNb_block();nb_block++)
{
BlockHeader blockHeader = reader.getBlockHeader(block_ptr);
blockHeader.offset = block_ptr;
blockHeader.subBlockHeaderList = new ArrayList<SubBlockHeader>();
fileHeader.blockHeaderList.add(blockHeader);
//System.out.println(blockHeader);
// load sub block
int sub_ptr=blockHeader.getData_pointer();
// BufferedImage bufferedImage = new BufferedImage(blockHeader.getSize_x(), blockHeader.getSize_y(), BufferedImage.TYPE_INT_ARGB);
for(int sub=0;sub<blockHeader.getSub_block();sub++){
SubBlockHeader subBlockHeader = reader.getSubBlockHeader(sub_ptr);
blockHeader.subBlockHeaderList.add(subBlockHeader);
//System.out.println(subBlockHeader);
// load tiles
// int tile_ptr = blockHeader.getData_pointer()+subBlockHeader.getData_offset();
// byte[] tile = reader.getTile(tile_ptr, subBlockHeader.getSub_length());
// draw_sub_tile_isometric(
// bufferedImage,
// subBlockHeader.getX_pos(),
// subBlockHeader.getY_pos(),
// tile,
// palette
// );
sub_ptr+=SubBlockHeader.BYTE_COUNT;
}
// ImageIO.write(bufferedImage, "png", new File("output/" + block_ptr + ".png"));
block_ptr+=BlockHeader.BYTE_COUNT;
}
return fileHeader;
}
public static void draw_sub_tile_isometric(BufferedImage dst, int xo, int yo, byte[] data, int[] palette)
{
int x, y=0, n;
int[] xjump = {14, 12, 10, 8, 6, 4, 2, 0, 2, 4, 6, 8, 10, 12, 14};
int[] nbpix = {4, 8, 12, 16, 20, 24, 28, 32, 28, 24, 20, 16, 12, 8, 4};
// 3d-isometric subtile is 256 bytes, no more, no less
int length = data.length;
if (length != 256)
return;
int dataPtr=0;
// draw
while (length > 0)
{
x = xjump[y];
n = nbpix[y];
length -= n;
while (n>0)
{
int colorIndex = data[dataPtr] & 0xFF;
int color = palette[colorIndex];
dst.setRGB(xo + x, yo + y, color);
dataPtr++;
x++;
n--;
}
y++;
}
}
public static void draw_sub_tile_normal (BufferedImage dst, int x0, int y0, byte[] data, int[] palette)
{
int ptr = 0;
int x=0, y=0;
byte b1, b2;
int length = data.length;
// draw
while (length > 0)
{
b1 = data[ptr];
b2 = data[ptr + 1];
ptr += 2;
length -= 2;
if (b1!=0 || b2!=0)
{
x += b1;
length -= b2;
while (b2!=0)
{
int colorIndex = data[ptr] & 0xFF;
int color = palette[colorIndex];
try{
dst.setRGB(x0 + x, y0 + y, color);
}catch (ArrayIndexOutOfBoundsException e){}
ptr++;
x++;
b2--;
}
}
else
{
x = 0;
y++;
}
}
}
}