| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #include "playfield.h"
- #include <QPainter>
- 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));
- }
- }
- }
|