#include "playfield.h" #include inline QString errorStr(Error error) { switch(error) { case NoError: return QObject::tr("-"); case EliminationTrigger: return QObject::tr("Elimination Trigger released"); case DataHunger: return QObject::tr("Data Hunger (Bank 1 empty and executed)"); case DivisionByZero: return QObject::tr("Division by zero"); case InvalidBankNumber: return QObject::tr("Invalid bank number (e.g. in TRANS or BJUMP)"); case HigherInstructionSetRequired: return QObject::tr("Higher Instruction Set required"); case MobilityRequired: return QObject::tr("Mobility required"); case DieExecuted: return QObject::tr("DIE executed"); case InvalidParameter: return QObject::tr("Invalid parameter (e.g. CREATE x, -1, x)"); case Unemployment: return QObject::tr("No more tasks left in a robot (Unemployment)"); case InstructionDurationTooHigh: return QObject::tr("Instruction duration too high (i.e. > MaxInstrDur)"); } } Playfield::Playfield(Simulator& simulator, QWidget *parent) : QWidget(parent) , simulator(simulator) { } void Playfield::paintEvent(QPaintEvent* /*event*/) { QPainter painter(this); int w = qMin(width(), height()) / FIELDS_XY; int h = qMin(width(), height()) / FIELDS_XY; for(int y = 0; y < FIELDS_XY; ++y) { for(int x = 0; x < FIELDS_XY; ++x) { int xx = x * w; int yy = y * w; painter.setPen(Qt::black); painter.setBrush(Qt::gray); painter.drawRect(QRect(xx, yy,w, h)); } } for (auto& program : simulator.programs) { int xx = program.position.x * w; int yy = program.position.y * w; painter.setPen(QPen(program.team->color, 3)); painter.setBrush(Qt::NoBrush); QRect rect(xx, yy,w+1, h+1); painter.drawEllipse(QPointF(rect.center().x(), rect.center().y()), w/2.3, h/2.3); auto& taskIndex = program.taskIndex; painter.drawText(rect, QString("%1").arg(program.error)); if(program.tasks.empty()) { continue; } taskIndex += 1; taskIndex %= program.tasks.size(); if (taskIndex < program.tasks.size()) { auto& task = program.tasks[taskIndex]; if(task.bankIndex < program.banks.size() && program.banks[task.bankIndex]) { painter.setPen(QPen(program.banks[task.bankIndex]->team->color, 3)); } else { painter.setPen(QPen(Qt::white, 3)); } switch(task.direction) { case Right: painter.drawLine(rect.center(), QPoint(rect.right(), rect.center().y())); break; case Down: painter.drawLine(rect.center(), QPoint(rect.center().x(), rect.bottom())); break; case Left: painter.drawLine(rect.center(), QPoint(rect.left(), rect.center().y())); break; case Up: painter.drawLine(rect.center(), QPoint(rect.center().x(), rect.top())); break; } // painter.drawText(rect, QString("%1:%2:%3").arg(program.banks.size()).arg(task.bankIndex).arg(task.instIndex)); } } }