mirror of
https://github.com/markdavidlong/AppleSAWS.git
synced 2024-09-16 18:54:54 +00:00
436 lines
14 KiB
C++
436 lines
14 KiB
C++
#include "mazeviewer.h"
|
|
#include <QPainter>
|
|
#include <QResizeEvent>
|
|
#include <QDebug>
|
|
|
|
#include "memory.h"
|
|
|
|
MazeViewer::MazeViewer(QWidget *parent) : FileViewerInterface(parent)
|
|
{
|
|
//setMinimumSize(480,600);
|
|
m_maze = QPixmap(width(),height());
|
|
drawMaze();
|
|
}
|
|
|
|
void MazeViewer::resizeEvent(QResizeEvent *event)
|
|
{
|
|
QWidget::resizeEvent(event);
|
|
m_maze = QPixmap(event->size().width(),
|
|
event->size().height());
|
|
drawMaze();
|
|
}
|
|
|
|
void MazeViewer::paintEvent(QPaintEvent *event)
|
|
{
|
|
Q_UNUSED(event);
|
|
drawMaze();
|
|
QPainter painter(this);
|
|
painter.drawPixmap(0, 0, m_maze);
|
|
}
|
|
|
|
void MazeViewer::setFile(GenericFile *file)
|
|
{
|
|
if (dynamic_cast<BinaryFile*>(file))
|
|
{
|
|
setFile(dynamic_cast<BinaryFile*>(file));
|
|
}
|
|
}
|
|
|
|
void MazeViewer::setFile(BinaryFile *file)
|
|
{
|
|
m_file = file;
|
|
|
|
QString title = QString("Maze Viewer: %1").arg(m_file->filename());
|
|
setWindowTitle(title);
|
|
|
|
quint16 address = file->address();
|
|
mem.addFile(file->data(), address);
|
|
}
|
|
|
|
|
|
void MazeViewer::drawMaze()
|
|
{
|
|
QPainter painter(&m_maze);
|
|
|
|
painter.setBrush(QColor(0xff,0xff,0xff));
|
|
painter.setPen(QColor(0xff,0xff,0xff));
|
|
painter.drawRect(0,0,m_maze.width(),m_maze.height());
|
|
|
|
double cellWidth = width()/8;
|
|
double cellHeight = height()/10;
|
|
|
|
painter.setBrush(QColor(0xff,0xff,0xff));
|
|
|
|
QPen lockedDoorPen(Qt::red);
|
|
lockedDoorPen.setStyle(Qt::DashLine);
|
|
|
|
QPen hiddenDoorPen(Qt::blue);
|
|
hiddenDoorPen.setStyle(Qt::DashLine);
|
|
hiddenDoorPen.setWidth(2);
|
|
|
|
for (int idx = 0; idx < 8; idx++)
|
|
{
|
|
for (int jdx = 0; jdx < 10; jdx++)
|
|
{
|
|
int currentRoom = (jdx*8) + idx;
|
|
double cellTop = jdx * cellHeight + 1;
|
|
double cellBot = (jdx+1) * cellHeight - 1;
|
|
|
|
double cellTopQuarter = cellTop + (cellHeight/4);
|
|
double cellBotQuarter = cellBot - (cellHeight/4);
|
|
|
|
double cellLeft = idx * cellWidth + 1;
|
|
double cellRight = (idx+1) * cellWidth - 1;
|
|
|
|
double cellLeftQuarter = cellLeft + (cellWidth/4);
|
|
double cellRightQuarter = cellRight - (cellWidth/4);
|
|
|
|
|
|
if (cellHasWalls(idx,jdx))
|
|
{
|
|
painter.setPen(QColor(0xff,0xff,0xff));
|
|
painter.setBrush(QColor(0xff,0xff,0xff));
|
|
painter.drawRect(cellLeft, cellTop, cellWidth-2, cellHeight-2);
|
|
painter.setPen(Qt::black);
|
|
if (cellHasEastDoor(idx,jdx))
|
|
{
|
|
painter.drawLine(QPointF(cellRight,cellTop),QPointF(cellRight,cellTopQuarter));
|
|
painter.drawLine(QPointF(cellRight,cellBotQuarter),QPointF(cellRight,cellBot));
|
|
|
|
if (cellHasSpecialEast(idx,jdx)) { // Locked Door
|
|
QPen oldpen = painter.pen();
|
|
|
|
painter.setPen(lockedDoorPen);
|
|
painter.drawLine(QPointF(cellRight,cellTopQuarter),QPointF(cellRight,cellBotQuarter));
|
|
painter.setPen(oldpen);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
painter.drawLine(QPointF(cellRight,cellTop),QPointF(cellRight,cellBot));
|
|
if (cellHasSpecialEast(idx,jdx)) { // Hidden Door
|
|
QPen oldpen = painter.pen();
|
|
|
|
painter.setPen(hiddenDoorPen);
|
|
painter.drawLine(QPointF(cellRight,cellTopQuarter),QPointF(cellRight,cellBotQuarter));
|
|
painter.setPen(oldpen);
|
|
}
|
|
}
|
|
|
|
if (cellHasWestDoor(idx,jdx))
|
|
{
|
|
painter.drawLine(QPointF(cellLeft,cellTop),QPointF(cellLeft,cellTopQuarter));
|
|
painter.drawLine(QPointF(cellLeft,cellBotQuarter),QPointF(cellLeft,cellBot));
|
|
|
|
if (cellHasSpecialWest(idx,jdx)) { // Locked Door
|
|
QPen oldpen = painter.pen();
|
|
|
|
painter.setPen(lockedDoorPen);
|
|
painter.drawLine(QPointF(cellLeft,cellTopQuarter),QPointF(cellLeft,cellBotQuarter));
|
|
painter.setPen(oldpen);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
painter.drawLine(QPointF(cellLeft,cellTop),QPointF(cellLeft,cellBot));
|
|
if (cellHasSpecialWest(idx,jdx)) { // Hidden Door
|
|
QPen oldpen = painter.pen();
|
|
|
|
painter.setPen(hiddenDoorPen);
|
|
painter.drawLine(QPointF(cellLeft+1,cellTopQuarter),QPointF(cellLeft+1,cellBotQuarter));
|
|
painter.setPen(oldpen);
|
|
}
|
|
}
|
|
|
|
if (cellHasNorthDoor(idx,jdx))
|
|
{
|
|
painter.drawLine(QPointF(cellLeft,cellTop),QPointF(cellLeftQuarter,cellTop));
|
|
painter.drawLine(QPointF(cellRight,cellTop),QPointF(cellRightQuarter,cellTop));
|
|
|
|
|
|
if (cellHasSpecialNorth(idx,jdx)) { // Locked Door
|
|
QPen oldpen = painter.pen();
|
|
|
|
painter.setPen(lockedDoorPen);
|
|
painter.drawLine(QPointF(cellLeftQuarter,cellTop),QPointF(cellRightQuarter,cellTop));
|
|
painter.setPen(oldpen);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
painter.drawLine(QPointF(cellLeft,cellTop),QPointF(cellRight,cellTop));
|
|
if (cellHasSpecialNorth(idx,jdx)) { // Hidden Door
|
|
QPen oldpen = painter.pen();
|
|
|
|
painter.setPen(hiddenDoorPen);
|
|
painter.drawLine(QPointF(cellLeftQuarter,cellTop+1),QPointF(cellRightQuarter,cellTop+1));
|
|
painter.setPen(oldpen);
|
|
}
|
|
}
|
|
|
|
if (cellHasSouthDoor(idx,jdx))
|
|
{
|
|
painter.drawLine(QPointF(cellLeft,cellBot),QPointF(cellLeftQuarter,cellBot));
|
|
painter.drawLine(QPointF(cellRightQuarter,cellBot),QPointF(cellRight,cellBot));
|
|
|
|
|
|
if (cellHasSpecialSouth(idx,jdx)) { // Locked Door
|
|
QPen oldpen = painter.pen();
|
|
|
|
painter.setPen(lockedDoorPen);
|
|
painter.drawLine(QPointF(cellLeftQuarter,cellBot),QPointF(cellRightQuarter,cellBot));
|
|
painter.setPen(oldpen);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
painter.drawLine(QPointF(cellLeft,cellBot),QPointF(cellRight,cellBot));
|
|
if (cellHasSpecialSouth(idx,jdx)) { // Hidden Door
|
|
QPen oldpen = painter.pen();
|
|
|
|
painter.setPen(hiddenDoorPen);
|
|
painter.drawLine(QPointF(cellLeftQuarter,cellBot),QPointF(cellRightQuarter,cellBot));
|
|
painter.setPen(oldpen);
|
|
}
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
painter.setPen(QColor(0xef,0xef,0xef));
|
|
painter.setBrush(QColor(0xef,0xef,0xef));
|
|
painter.drawRect(cellLeft, cellTop, cellWidth-2, cellHeight-2);
|
|
}
|
|
|
|
painter.setPen(Qt::black);
|
|
//quint8 cv = getCellDesc(idx,jdx);
|
|
quint8 tr = getCellInventory(idx,jdx);
|
|
QString trs = inventoryToString(tr);
|
|
quint8 mo = getCellMonsters(idx,jdx);
|
|
QString mos = monsterToString(mo);
|
|
|
|
//QString str = QString("%1\nInv:0x%3\nMo:0x%4")
|
|
// .arg(idx+(jdx*8))
|
|
// .arg(cv,2,16,QChar('0'))
|
|
// .arg(tr,2,16,QChar('0'))
|
|
// .arg(mo,2,16,QChar('0'));
|
|
|
|
int playerCount = mem.at(0x80fd);
|
|
|
|
QString pl;
|
|
for (int rdx = 0; rdx < playerCount; rdx++)
|
|
{
|
|
quint8 roomPlayerIsIn = mem.at(0x8008 + (32*rdx));
|
|
|
|
if (roomPlayerIsIn == currentRoom) {
|
|
if (rdx == 0) { pl += QString(u8"\u2460"); }
|
|
if (rdx == 1) { pl += QString(u8"\u2461"); }
|
|
if (rdx == 2) { pl += QString(u8"\u2462"); }
|
|
if (rdx == 3) { pl += QString(u8"\u2463"); }
|
|
if (rdx == 4) { pl += QString(u8"\u2464"); }
|
|
}
|
|
}
|
|
|
|
QString str = QString("%1\n%2\n%3\n%4")
|
|
.arg(idx+(jdx*8))
|
|
.arg(mos)
|
|
.arg(trs)
|
|
.arg(pl);
|
|
|
|
painter.drawText(QRect(cellLeft+2,cellTop+2,cellWidth-2,cellHeight-2),str);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
bool MazeViewer::cellHasWalls(int x, int y)
|
|
{
|
|
quint8 cellDesc = getCellDesc(x,y);
|
|
return (cellDesc != 0xFF);
|
|
}
|
|
|
|
bool MazeViewer::cellHasNorthDoor(int x, int y)
|
|
{
|
|
quint8 cellDesc = getCellDesc(x,y);
|
|
return (cellDesc & 0x04);
|
|
}
|
|
|
|
bool MazeViewer::cellHasSpecialNorth(int x, int y)
|
|
{
|
|
quint8 cellDesc = getCellDesc(x,y);
|
|
return (cellDesc & 0x40);
|
|
}
|
|
|
|
bool MazeViewer::cellHasEastDoor(int x, int y)
|
|
{
|
|
quint8 cellDesc = getCellDesc(x,y);
|
|
return (cellDesc & 0x08);
|
|
}
|
|
|
|
bool MazeViewer::cellHasSpecialEast(int x, int y)
|
|
{
|
|
quint8 cellDesc = getCellDesc(x,y);
|
|
return (cellDesc & 0x80);
|
|
}
|
|
|
|
bool MazeViewer::cellHasSouthDoor(int x, int y)
|
|
{
|
|
quint8 cellDesc = getCellDesc(x,y);
|
|
return (cellDesc & 0x01);
|
|
}
|
|
|
|
bool MazeViewer::cellHasSpecialSouth(int x, int y)
|
|
{
|
|
quint8 cellDesc = getCellDesc(x,y);
|
|
return (cellDesc & 0x10);
|
|
}
|
|
|
|
bool MazeViewer::cellHasWestDoor(int x, int y)
|
|
{
|
|
quint8 cellDesc = getCellDesc(x,y);
|
|
return (cellDesc & 0x02);
|
|
}
|
|
|
|
bool MazeViewer::cellHasSpecialWest(int x, int y)
|
|
{
|
|
quint8 cellDesc = getCellDesc(x,y);
|
|
return (cellDesc & 0x20);
|
|
}
|
|
|
|
quint8 MazeViewer::getCellDesc(int x, int y)
|
|
{
|
|
return mem.at(0x8100+x+(y*8));
|
|
}
|
|
|
|
quint8 MazeViewer::getCellMonsters(int x, int y)
|
|
{
|
|
return mem.at(0x81A0+x+(y*8));
|
|
}
|
|
|
|
quint8 MazeViewer::getCellInventory(int x, int y)
|
|
{
|
|
return mem.at(0x8150+x+(y*8));
|
|
}
|
|
|
|
QString MazeViewer::inventoryToString(quint8 inv)
|
|
{
|
|
quint8 gems = (inv & 0xf0) >> 4;
|
|
quint8 gold_or_special = (inv & 0x0f);
|
|
|
|
if (gems == 0 && gold_or_special == 0) {
|
|
return "";
|
|
}
|
|
|
|
if (gems == 0) // Special item;
|
|
{
|
|
if (gold_or_special == 0x00) { return ""; }
|
|
if (gold_or_special == 0x01) { return "Key1"; }
|
|
if (gold_or_special == 0x02) { return "Key2"; }
|
|
if (gold_or_special == 0x03) { return "Key3"; }
|
|
if (gold_or_special == 0x04) { return "Mirror"; }
|
|
if (gold_or_special == 0x05) { return "Goblet"; }
|
|
if (gold_or_special == 0x06) { return "Stauette"; }
|
|
if (gold_or_special == 0x07) { return "UNKN 7"; }
|
|
if (gold_or_special == 0x08) { return "UNKN 8"; }
|
|
if (gold_or_special == 0x09) { return "UNKN 9"; }
|
|
if (gold_or_special == 0x0A) { return "UNKN 10"; }
|
|
if (gold_or_special == 0x0B) { return "UNKN 11"; }
|
|
if (gold_or_special == 0x0C) { return "UNKN 12"; }
|
|
if (gold_or_special == 0x0D) { return "UNKN 13"; }
|
|
if (gold_or_special == 0x0E) { return "UNKN 14"; }
|
|
if (gold_or_special == 0x0F) { return "UNKN 15"; }
|
|
return "";
|
|
}
|
|
else if (gold_or_special == 0)
|
|
{
|
|
if (gems == 0x01) { return "MagicShld (4)";}
|
|
if (gems == 0x02) { return "MthrlArmr (6)";}
|
|
if (gems == 0x03) { return "MagicSwd (255)";}
|
|
if (gems == 0x04) { return "MagicSwd (5)";}
|
|
if (gems == 0x05) { return "MagicArrs (3)";}
|
|
if (gems == 0x06) { return "MgcWarAx (4)";}
|
|
if (gems == 0x07) { return "MagicStf (4)";}
|
|
if (gems == 0x08) { return "GldRng (1)";}
|
|
if (gems == 0x09) { return "GldRng (2)";}
|
|
if (gems == 0x0a) { return "GldRng (4)";}
|
|
if (gems == 0x0b) { return "GldRng (8)";}
|
|
if (gems == 0x0c) { return "GldRng (16)";}
|
|
if (gems == 0x0d) { return "GldRng (32)";}
|
|
if (gems == 0x0e) { return "GldRng (64)";}
|
|
if (gems == 0x0f) { return "GldRng (128)"; }
|
|
}
|
|
else
|
|
{
|
|
return QString("%1Gm,%2Au").arg(gems).arg(gold_or_special * 4);
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
QString MazeViewer::monsterToString(quint8 mc)
|
|
{
|
|
quint8 count = mc & 0x0f;
|
|
quint8 monster = (mc & 0xf0) >> 4;
|
|
|
|
QString name;
|
|
switch (monster) {
|
|
case 0x00:
|
|
name = "";
|
|
break;
|
|
case 0x01:
|
|
name = "LgSpdr";
|
|
break;
|
|
case 0x02:
|
|
name = "GntRat";
|
|
break;
|
|
case 0x03:
|
|
name = "Orc";
|
|
break;
|
|
case 0x04:
|
|
name = "FrBtle";
|
|
break;
|
|
case 0x05:
|
|
name = "Goblin";
|
|
break;
|
|
case 0x06:
|
|
name = "Sklton";
|
|
break;
|
|
case 0x07:
|
|
name = "Zombie";
|
|
break;
|
|
case 0x08:
|
|
name = "Grgyle";
|
|
break;
|
|
case 0x09:
|
|
name = "DgOfWr";
|
|
break;
|
|
case 0x0a:
|
|
name = "HlHnd";
|
|
break;
|
|
case 0x0b:
|
|
name = "Wrght";
|
|
break;
|
|
case 0x0c:
|
|
name = "HgSpdr";
|
|
break;
|
|
case 0x0d:
|
|
name = "Hmncls";
|
|
break;
|
|
case 0x0e:
|
|
name = "(INVAL)";
|
|
break;
|
|
case 0x0f:
|
|
name = "EvlMage";
|
|
break;
|
|
default:
|
|
name = "UNK";
|
|
break;
|
|
}
|
|
|
|
if (count > 0 && monster > 0)
|
|
{
|
|
return QString("%1 %2").arg(count).arg(name);
|
|
}
|
|
return "";
|
|
}
|