dmolony-DiskBrowser/src/com/bytezone/diskbrowser/wizardry/MazeGridV5.java
2016-08-24 00:14:04 +10:00

165 lines
4.3 KiB
Java

package com.bytezone.diskbrowser.wizardry;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import com.bytezone.common.Utility;
import com.bytezone.diskbrowser.applefile.AbstractFile;
import com.bytezone.diskbrowser.utilities.HexFormatter;
public class MazeGridV5 extends AbstractFile
{
private final MessageBlock messageBlock;
List<MazeGrid> grids = new ArrayList<MazeGrid> ();
int minX = 9999;
int minY = 9999;
int maxX = 0;
int maxY = 0;
public MazeGridV5 (String name, byte[] buffer, MessageBlock messageBlock)
{
super (name, buffer);
this.messageBlock = messageBlock;
for (int i = 0; i < 16; i++)
{
MazeCell[][] grid = new MazeCell[8][8];
for (int row = 0; row < 8; row++)
for (int col = 0; col < 8; col++)
grid[row][col] = getLayout (i, row, col);
MazeGrid mazeGrid =
new MazeGrid (grid, buffer[528 + i] & 0xFF, buffer[512 + i] & 0xFF);
grids.add (mazeGrid);
minX = Math.min (minX, mazeGrid.xOffset);
minY = Math.min (minY, mazeGrid.yOffset);
maxX = Math.max (maxX, mazeGrid.xOffset);
maxY = Math.max (maxY, mazeGrid.yOffset);
}
}
@Override
public BufferedImage getImage ()
{
Dimension cellSize = new Dimension (22, 22);
int fudge = 30;
int gridWidth = (maxX - minX + 8) * cellSize.width;
int gridHeight = (maxY - minY + 7) * cellSize.height;
image = new BufferedImage (gridWidth + 1, gridHeight + fudge,
BufferedImage.TYPE_USHORT_555_RGB);
Graphics2D g = image.createGraphics ();
g.setRenderingHint (RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor (Color.LIGHT_GRAY);
g.fillRect (0, 0, gridWidth + 1, gridHeight + fudge);
for (int i = 0; i < 16; i++)
{
MazeGrid mazeGrid = grids.get (i);
for (int row = 0; row < 8; row++)
for (int column = 0; column < 8; column++)
{
MazeCell cell = mazeGrid.grid[row][column];
int x = column * cellSize.width;
int y = image.getHeight () - (row) * cellSize.height;
x += (mazeGrid.xOffset - minX) * cellSize.width;
y -= (mazeGrid.yOffset - minY) * cellSize.height + fudge;
cell.draw (g, x, y);
}
}
return image;
}
private MazeCell getLayout (int gridNo, int row, int column)
{
MazeAddress address = new MazeAddress (0, row, column);
MazeCell cell = new MazeCell (address);
int offset = gridNo * 16 + column * 2 + row / 4;
int value;
if (false)
{
value = HexFormatter.intValue (buffer[offset]);
value >>>= (row % 4) * 2;
cell.westWall = ((value & 1) == 1);
value >>>= 1;
cell.westDoor = ((value & 1) == 1);
}
if (false)
{
value = HexFormatter.intValue (buffer[offset + 256]);
value >>>= (row % 4) * 2;
cell.southWall = ((value & 1) == 1);
value >>>= 1;
cell.southDoor = ((value & 1) == 1);
}
if (true)
{
value = HexFormatter.intValue (buffer[offset + 0]);
value >>>= (row % 4) * 2;
cell.eastWall = ((value & 1) == 1);
value >>>= 1;
cell.eastDoor = ((value & 1) == 1);
}
if (true)
{
value = HexFormatter.intValue (buffer[offset + 256]);
value >>>= (row % 4) * 2;
cell.northWall = ((value & 1) == 1);
value >>>= 1;
cell.northDoor = ((value & 1) == 1);
}
return cell;
}
@Override
public String getHexDump ()
{
StringBuilder text = new StringBuilder (super.getHexDump ());
text.append ("\n\n");
text.append (HexFormatter.format (buffer, 0x550, 0x80));
text.append ("\n\n");
for (int i = 0; i < 128; i += 2)
{
int msg = Utility.getWord (buffer, 0x550 + i);
if (msg >= 15000)
{
String message = messageBlock.getMessageText (msg);
text.append (String.format ("%4d %04X %s%n", i, msg, message));
}
}
return text.toString ();
}
private class MazeGrid
{
MazeCell[][] grid;
int xOffset;
int yOffset;
public MazeGrid (MazeCell[][] grid, int x, int y)
{
this.grid = grid;
this.xOffset = x;
this.yOffset = y;
}
}
}