1
1

playfield.cpp 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "playfield.h"
  2. #include <QPainter>
  3. inline QString errorStr(Error error) {
  4. switch(error) {
  5. case NoError: return QObject::tr("-");
  6. case EliminationTrigger: return QObject::tr("Elimination Trigger released");
  7. case DataHunger: return QObject::tr("Data Hunger (Bank 1 empty and executed)");
  8. case DivisionByZero: return QObject::tr("Division by zero");
  9. case InvalidBankNumber: return QObject::tr("Invalid bank number (e.g. in TRANS or BJUMP)");
  10. case HigherInstructionSetRequired: return QObject::tr("Higher Instruction Set required");
  11. case MobilityRequired: return QObject::tr("Mobility required");
  12. case DieExecuted: return QObject::tr("DIE executed");
  13. case InvalidParameter: return QObject::tr("Invalid parameter (e.g. CREATE x, -1, x)");
  14. case Unemployment: return QObject::tr("No more tasks left in a robot (Unemployment)");
  15. case InstructionDurationTooHigh: return QObject::tr("Instruction duration too high (i.e. > MaxInstrDur)");
  16. }
  17. }
  18. Playfield::Playfield(Simulator& simulator, QWidget *parent)
  19. : QWidget(parent)
  20. , simulator(simulator)
  21. {
  22. }
  23. void Playfield::paintEvent(QPaintEvent* event) {
  24. QPainter painter(this);
  25. int w = qMin(width(), height()) / FIELDS_XY;
  26. int h = qMin(width(), height()) / FIELDS_XY;
  27. for(int y = 0; y < FIELDS_XY; ++y) {
  28. for(int x = 0; x < FIELDS_XY; ++x) {
  29. int xx = x * w;
  30. int yy = y * w;
  31. painter.setPen(Qt::black);
  32. painter.setBrush(Qt::gray);
  33. painter.drawRect(QRect(xx, yy,w, h));
  34. }
  35. }
  36. for (auto& program : simulator.programs) {
  37. int xx = program.position.x * w;
  38. int yy = program.position.y * w;
  39. painter.setPen(QPen(program.team->color, 3));
  40. painter.setBrush(Qt::NoBrush);
  41. QRect rect(xx, yy,w+1, h+1);
  42. painter.drawEllipse(rect.center(), w/2.3, h/2.3);
  43. auto& taskIndex = program.taskIndex;
  44. painter.drawText(rect, QString("%1").arg(program.error));
  45. if(program.tasks.empty()) {
  46. continue;
  47. }
  48. taskIndex += 1;
  49. taskIndex %= program.tasks.size();
  50. if (taskIndex < program.tasks.size()) {
  51. auto& task = program.tasks[taskIndex];
  52. if(task.bankIndex < program.banks.size() && program.banks[task.bankIndex]) {
  53. painter.setPen(QPen(program.banks[task.bankIndex]->team->color, 3));
  54. }
  55. else {
  56. painter.setPen(QPen(Qt::white, 3));
  57. }
  58. switch(task.direction) {
  59. case Right: painter.drawLine(rect.center(), QPoint(rect.right(), rect.center().y())); break;
  60. case Down: painter.drawLine(rect.center(), QPoint(rect.center().x(), rect.bottom())); break;
  61. case Left: painter.drawLine(rect.center(), QPoint(rect.left(), rect.center().y())); break;
  62. case Up: painter.drawLine(rect.center(), QPoint(rect.center().x(), rect.top())); break;
  63. }
  64. // painter.drawText(rect, QString("%1:%2:%3").arg(program.banks.size()).arg(task.bankIndex).arg(task.instIndex));
  65. }
  66. }
  67. }